Java: ¿cómo verificar el tamaño actual de Perm/PermGen?
jvm jvm-crash (4)
Ayer, cuando estaba ejecutando el instalador de WebLogic Application Server 11g, encontré un error de OutOfMemory, así que busqué en Google la respuesta:
java -Xms256m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=256m -jar wls1032_generic.jar
Todo funcionó :)
Sin embargo, cuando pienso dos veces en la solución, podría haber cometido un error: ¿cómo podría saber la configuración actual de esos? Ciertamente necesito verificar sus valores antes de anularlos, ¿verdad?
¿Alguna idea?
Enlace relacionado: La gente en otro hilo en SO sugirió un enfoque de prueba y error, que no es ideal.
Muchas gracias de antemano.
Otra forma de obtener información de PermGen es:
kill -3 JAVA_PID
Obtiene información de volcado de hilo y memoria (incluido PermGen). Ejemplo de salida:
PSPermGen total 68864K, used 68808K [0x000000009c600000, 0x00000000a0940000, 0x00000000a1800000)
Por alguna razón, jinfo no funcionaba cuando lo necesitaba. Volvió
Unable to open socket file: target process not responding or HotSpot VM not loaded
Existen algunas causas posibles de lo anterior y una de ellas puede ser la declaración explícita de java.io.tmpdir como se describe en https://www.permeance.com.au/web/terry.mueller/home/-/blogs/unable-to-open-socket-file-target-process-not-responding-or-hotspot-vm-not-loaded
Puede verificar los valores de cualquier marca JVM de una JVM en ejecución utilizando la utilidad jinfo.exe
.
%JAVA_HOME%/bin/jinfo.exe -flag <flagName> <pid>
así que para comprobar el valor de -XX:PermSize
JVM opción puede ejecutar
%JAVA_HOME%/bin/jinfo.exe -flag PermSize <pid>
Puedes usar jmap
here , es JVM Heap Dump Tool.
por ejemplo:
jmap -heap 5900
Se imprimirá:
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
Obtiene información de la memoria (incluyendo PermGen). 5900
es el id de proceso de Java.
Puedes usar algo como VisualVM, http://java.dzone.com/articles/best-kept-secret-jdk-visualvm&default=false&zid=159&browser=16&mid=0&refresh=0 , para controlar el uso de la memoria y verás el máximo por donde llega a su punto más alto, y le dará información específica sobre qué parte de la memoria está realmente llena, para que pueda optimizar mejor su entorno.
Es posible que encuentre que parte de la memoria en la que no piensa se está llenando, y al monitorearla, puede ver lo que necesita hacer para obtener un mejor rendimiento.