Можно ли получить фактический размер стека, используемый потоком в Java после некоторого времени работы?

Идея заключается в том, чтобы помочь определить оптимальный размер стека для данного Java-приложения.

Одна вещь, которая может быть сделана с помощью этой информации, создает таблицу диапазонов размеров стека, которые потоки могут изменять по мере их выхода и которые могут периодически сбрасываться и при выходе приложения.

EDIT: это в контексте работы на клиентских машинах с реальной рабочей нагрузкой, с которой я не могу получить доступ к профилировщику.

EDIT2: В ответ на один ответ, на (IIRC) 256 Кбит/с на поток, я некоторое время задавался вопросом, насколько близка реальность того, что нужно (я также задаюсь вопросом, может ли этот вопрос быть не очень релевантным, потому что, возможно, пространство стека выделяется по требованию). У нас есть сервер приложений, который основан на передаче сообщений и очень многопоточен и работает на всем: от ARM-портативного до окто-core Linux, до среднего и мэйнфреймов - было бы хорошо иметь представление о том, где (и если) мы можем торговать стека для кучи систем с большим количеством обработчиков сообщений.

Есть несколько похожих вопросов, которые представляют интерес, но они являются родными /os -specific:

Ответ 1

Память стека будет трудно получить.

Лучшее, что вы можете сделать, и довольно легко, - использование памяти JVM через MemoryMXBean.

Ответ 3

Я думаю, вы можете сделать это с помощью нового VisualVM.

Ответ 4

Вы можете использовать класс Runtime для мониторинга memmory JVM, как это.

Runtime rt = Runtime.getRuntime();
System.out.println((rt.freeMemory() / 1024) + "/" + (rt.maxMemory() / 1024) + " kB");

Или вы можете использовать JConsole, JVisualVM e JInfo. Вы можете получить дополнительную информацию об этих инструментах Здесь:

http://java.sun.com/developer/technicalArticles/J2SE/monitoring/