Java: как проверить текущий размер Perm/PermGen?
Вчера, когда я запускал установщик WebLogic Application Server 11g, я столкнулся с ошибкой OutOfMemory, поэтому я ответил Googled для ответа:
java -Xms256m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=256m -jar wls1032_generic.jar
Все сработало:)
Однако, когда я думаю дважды о решении, я, возможно, допустил ошибку: как узнать текущие настройки этих? Мне обязательно нужно проверить их значения, прежде чем переопределять их, правильно?
Любые мысли?
Ссылки по теме: Люди в в другом потоке на SO предложили метод проб и ошибок, что не идеально.
Большое спасибо заранее.
Ответы
Ответ 1
Вы можете проверить значения любых флагов JVM запущенной JVM с помощью утилиты jinfo.exe
.
%JAVA_HOME%\bin\jinfo.exe -flag <flagName> <pid>
поэтому, чтобы проверить значение опции -XX:PermSize
JVM, вы можете запустить
%JAVA_HOME%\bin\jinfo.exe -flag PermSize <pid>
Ответ 2
Вы можете использовать jmap
в здесь, это JVM Heap Dump Tool.
например:
jmap -heap 5900
Он будет печатать:
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 989855744 (944.0MB)
NewSize = 1310720 (1.25MB)
MaxNewSize = 17592186044415 MB
OldSize = 5439488 (5.1875MB)
NewRatio = 2
SurvivorRatio = 8
PermSize = 21757952 (20.75MB)
MaxPermSize = 85983232 (82.0MB)
Heap Usage:
PS Young Generation
Eden Space:
capacity = 242352128 (231.125MB)
used = 9196056 (8.770042419433594MB)
free = 233156072 (222.3549575805664MB)
3.79450185805672% used
From Space:
capacity = 41877504 (39.9375MB)
used = 0 (0.0MB)
free = 41877504 (39.9375MB)
0.0% used
To Space:
capacity = 42663936 (40.6875MB)
used = 0 (0.0MB)
free = 42663936 (40.6875MB)
0.0% used
PS Old Generation
capacity = 80609280 (76.875MB)
used = 34187936 (32.604156494140625MB)
free = 46421344 (44.270843505859375MB)
42.41191088668699% used
PS Perm Generation
capacity = 85393408 (81.4375MB)
used = 63472624 (60.53221130371094MB)
free = 21920784 (20.905288696289062MB)
74.32965317416539% used
Он получает информацию о памяти (включая PermGen). 5900
- это идентификатор процесса Java.
Ответ 3
Вы можете использовать что-то вроде VisualVM, http://java.dzone.com/articles/best-kept-secret-jdk-visualvm&default=false&zid=159&browser=16&mid=0&refresh=0, чтобы отслеживать использование вашей памяти, и вы увидите максимальное значение, на котором оно пики, и это даст вам конкретную информацию о том, какая часть памяти действительно заполнена, поэтому вы можете лучше оптимизировать свою среду.
Вы можете обнаружить, что некоторая часть памяти, о которой вы не думаете, действительно заполняется, и, контролируя ее, вы можете увидеть, что вам нужно сделать, чтобы повысить производительность.
Ответ 4
Другой способ получить информацию PermGen:
kill -3 JAVA_PID
Он получает информацию о дампе потока и памяти (включая PermGen). Пример вывода:
PSPermGen total 68864K, used 68808K [0x000000009c600000, 0x00000000a0940000, 0x00000000a1800000)
По какой-то причине jinfo не работал, когда мне это нужно. Он вернулся:
Unable to open socket file: target process not responding or HotSpot VM not loaded
Существует несколько возможных причин этого, и одно из них может быть явным объявлением java.io.tmpdir, как описано в https://www.permeance.com.au/web/terry.mueller/home/-/blogs/unable-to-open-socket-file-target-process-not-responding-or-hotspot-vm-not-loaded