2016-01-22 6 views
1

Как получить максимальную память стека во время выполнения. Я понимаю, что Runtime.getRuntime(). MaxMemory() даст кучную память. Я хочу знать стек памяти.Память стека во время выполнения

p.s: Я установил -xss как 1m, я хочу проверить это, поэтому я открыт для предложений, если есть лучший способ найти это, чем получить его из исполняемого экземпляра.

ответ

2

Вы можете использовать JConsole в JDK_HOME/bin/jconsole.exe, чтобы проверить статистику своей программы. Он будет показывать как кучу/не кучу, так и подробное использование памяти кучи с графиками.

+0

Но показывает ли он размер стека? –

+0

Память не кучи - это не что иное, как стек. –

+0

Я всегда, хотя не куча включала прямую память, компоненты gui, память, используемую jvm для внутренней обработки и т. Д. –

1

Это не то, что вы обычно волнует, как правило, вы хотите, чтобы избежать рекурсии в Java, как с помощью цикла, как правило, более эффективно (Java не хвостовая оптимизация, например)

В Linux вы можете работать это получается путем чтения /proc/self/maps, который имеет все карты памяти, используемые программой, и есть запись для каждого стека.

например. В этом примере вы можете увидеть область стека для нити 669 и 668

7ff4617ee000-7ff4617f1000 ---p 00000000 00:00 0 
7ff4617f1000-7ff4618ef000 rw-p 00000000 00:00 0       [stack:669] 
7ff4618ef000-7ff4618f2000 ---p 00000000 00:00 0 
7ff4618f2000-7ff461bf0000 rw-p 00000000 00:00 0       [stack:668] 

Размер этого диапазона в шестнадцатеричном является 0xFE000 или 1040384, который составляет почти 1 Мбайт.

+1

Рекурсия выполняется при десериализации объекта rmi, который я не контролирую. И я нахожусь в Windows. – Cybermonk

+0

@Cybermonk Вы можете измерить его эмпирически, рекурсивным, пока не выбросите StackOverflowError и не подсчитайте, как долго это происходит. Если вы сделаете это для известного размера, например. 1 МБ, вы можете оценить его, например. если он повторяет 2 раза, это может быть около 2 МБ. –

Смежные вопросы