Как динамически контролировать размер кучи Java?

Я пытаюсь контролировать размер кучи java динамически. Кто-нибудь знает, как получить maxmium-память, используемую в процессе запуска кода? Делает ли Runtime.maxMemory() трюк? Благодаря

Ответ 1

maxMemory() возвращает максимальный объем памяти, который будет использовать java. Так что это не даст вам то, что вы хотите. totalMemory() - это то, что вы ищете. См. docs

Ответ 2

Имеется большое количество инструментов профилировщика, которые помогут вам в этом. Популярным коммерческим инструментом является YourKit, и он получает восторженные отзывы. Свободной альтернативой является VisualVM, который я использовал в прошлом и могу предоставить много понимания.

Ответ 3

Если вам нравится, вы можете визуально просмотреть множество значений, профилирующих ваше приложение с помощью JConsole.

http://docs.oracle.com/javase/6/docs/technotes/tools/share/jconsole.html

Запустите приложение с помощью

-Dcom.sun.management.jmxremote

и ваше приложение будет доступно для выбора при запуске/bin/jconsole.exe

Ответ 4

jstat -gc <pid> <time> <amount>

jstat -gc `jps -l | grep weblogic\.Server | awk {'print $1'}` 1000 3

3 образца 1 секунда подробнее см. здесь

Ответ 5

Я также хотел бы добавить, что jmap -heap <PID> делает трюк; который предполагает, что вы являетесь оппонентом и вам нужно знать, сколько кучи использует Java-процесс. Я не могу сказать, является ли ваш вопрос программным или оперативным.

Ответ 6

Существует также java.lang.management. Используйте ManagementFactory, чтобы получить экземпляр MemoryMXBean. Он имеет методы для возврата кучи и моментального снимка использования памяти без кучи.

Ответ 7

Возможно, jvmtop стоит посмотреть. Это инструмент командной строки, который обеспечивает просмотр в реальном времени с несколькими метками, включая размер кучи:

 JvmTop 0.4.1 alpha amd64  8 cpus, Linux 2.6.32-27, load avg 0.12
 http://code.google.com/p/jvmtop

  PID MAIN-CLASS      HPCUR HPMAX NHCUR NHMAX    CPU     GC    VM USERNAME   #T DL
 3370 rapperSimpleApp  165m  455m  109m  176m  0.12%  0.00% S6U37 web        21
27338 WatchdogManager   11m   28m   23m  130m  0.00%  0.00% S6U37 web        31
19187 m.jvmtop.JvmTop   20m 3544m   13m  130m  0.93%  0.47% S6U37 web        20
16733 artup.Bootstrap  159m  455m  166m  304m  0.12%  0.00% S6U37 web        46

Ответ 8

Мы используем внутреннюю среду xpert от OpNet для мониторинга использования кучи и утечек в реальном времени в нашей тестовой среде и производстве. Он достаточно лёгкий, чтобы не воздействовать на prod, поэтому мы получаем отличные данные, которые мы не можем получить от QA. Мы также делаем профилирование методов и вызовов db в обеих средах, чтобы помочь нам выяснить, какой код /​​sql следует оптимизировать. Очень классный материал с хорошими графиками трендов, но не свободными ни на одном растяжке. Если у вас много долларов, едущих на вашем приложении, это стоит инвестиций.

http://www.opnet.com/solutions/application_performance/appinternals-xpert.html

Ответ 9

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