2017-02-16 40 views
1

В Java объекты хранятся в куче, но локальные переменные метода находятся в стеке. Но когда я открываю jconsole, я не вижу никакой памяти, выделенной в стеке. Я просто вижу кучу и перджен (Java 6). Является ли стек логическим разделом в куче, а не физическим?Является ли стек областью логической памяти в куче?

+1

См. [Является ли кадр выделенной или выделенной кучи JVM?] (Http://stackoverflow.com/questions/26741925/is-frame-in-jvm-heap-allocated-or-stack-allocated/26779782#26779782) и [Как получить статистическую статистику стека программно?] (http://stackoverflow.com/questions/26835087/how-do-i-get-stack-memory-stats-programatically/26852490#26852490) – apangin

+0

BTW Я предлагаю вы как можно скорее перейдете с Java 6 на 8 и 'jconsole' на' jmc'. –

+0

Тот факт, что 'jconsole' не показывает эту информацию, не позволяет сделать вывод об организации стека. – Holger

ответ

1

В JVM используется собственный стек процесса. Это минимизирует накладные расходы и позволяет стеку быть виртуальным (он может иметь максимальный размер, намного больший, чем тот, который фактически используется)

В результате большинство стеков редко используются много (< < 10% от максимального) и их графическое отображение может быть более запутанным, чем полезным.

+0

'JVM использует собственный стек процесса.« Я считаю, что это означает выделенную память для процесса OS. Затем он должен быть отделен от кучи, указанной через -Xms и -Xmx параметры. ? – emilly

+0

@emilly выделяется только виртуальная память/адресное пространство. Когда это происходит, только затронутые страницы превращаются в реальную память. Если вы установите максимум 10 МБ, но используете только 21 КБ, то фактически используется 6 * 4 КБ (24 КБ). Вы можете установить максимальный размер для стека с '-Xss', хотя это редко требуется. –

+0

извините. скажем, у меня общий барабан 4 ГБ. Я выделил 1 ГБ макс. Памяти для кучи. Теперь стек по какой-то причине нуждается в 512 М памяти, тогда он будет выделен из 3 ГБ (4-1)? – emilly

1

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

+0

, то почему анализ памяти области стека не отображается в любом инструменте анализатора памяти, таком как jconsole и т. Д. – emilly

+0

@emilly размер стека редко является проблемой, что бы инструмент показывал? –

+0

Стек меняется при каждом вызове метода и возврате. Какой у вас отчет об инструменте анализатора? –