¿Hay alguna forma de obtener los parámetros de una JVM en ejecución? ¿Existe una herramienta de línea de comandos como jstat que toma como entrada el pid de la JVM y devuelve sus parámetros iniciales? Estoy particularmente interesado en los valores -Xmx y -Xms que se dieron al iniciar la JVM. Gracias.
Editar : para aclarar mis limitaciones. La JVM que nos gustaría comprobar se está ejecutando en un servidor de producción. Por eso, preferimos la mínima interrupción. Podemos monitorear la JVM usando jstat, por lo que esperamos que haya una solución simple similar para acceder a los parámetros.
Editar : también intentamos obtener los parámetros usando jvisualvm. Pero para poder conectarnos a una jvm remota, necesitamos ejecutar jstatd y modificar la configuración de seguridad de la JVM, lo cual nos pareció muy perturbador y arriesgado en un servidor de producción.
Respuestas:
Puedes usar jps como
imprime algo como
4050 com.intellij.idea.Main -Xms128m -Xmx512m -XX:MaxPermSize=250m -ea -Xbootclasspath/a:../lib/boot.jar -Djb.restart.code=88 4667 sun.tools.jps.Jps -lvm -Dapplication.home=/opt/java/jdk1.6.0_22 -Xms8m
fuente
jps -lvm
podría ser engañosa. Siempre verifique dos veces con jinfo u otra herramienta. El problema puede ser si "-XX" se pasa como el argumento del programa normal y la JVM lo ignora. Este es el caso si usa enjava -jar my.jar -Xmx3g
lugar dejava -Xmx3g -jar my.jar
Estoy agregando esta nueva respuesta porque, según la documentación de JDK8 , jcmd es un enfoque sugerido ahora.
A continuación se muestran los comandos para obtener las propiedades / banderas que desea.
Necesitamos pid, para esto use jcmd -l, como a continuación
username@users-Air:~/javacode$ jcmd -l 11441 Test 6294 Test 29197 jdk.jcmd/sun.tools.jcmd.JCmd -l
Ahora es el momento de usar estos pids para obtener las propiedades / banderas que desea
Comando: jcmd 11441 VM.system_properties
11441: #Tue Oct 17 12:44:50 IST 2017 gopherProxySet=false awt.toolkit=sun.lwawt.macosx.LWCToolkit file.encoding.pkg=sun.io java.specification.version=9 sun.cpu.isalist= sun.jnu.encoding=UTF-8 java.class.path=. java.vm.vendor=Oracle Corporation sun.arch.data.model=64 java.vendor.url=http\://java.oracle.com/ user.timezone=Asia/Kolkata java.vm.specification.version=9 os.name=Mac OS X sun.java.launcher=SUN_STANDARD user.country=US sun.boot.library.path=/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home/lib sun.java.command=Test http.nonProxyHosts=local|*.local|169.254/16|*.169.254/16 jdk.debug=release sun.cpu.endian=little user.home=/Users/XXXX user.language=en java.specification.vendor=Oracle Corporation java.home=/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home file.separator=/ java.vm.compressedOopsMode=Zero based line.separator=\n java.specification.name=Java Platform API Specification java.vm.specification.vendor=Oracle Corporation java.awt.graphicsenv=sun.awt.CGraphicsEnvironment sun.management.compiler=HotSpot 64-Bit Tiered Compilers ftp.nonProxyHosts=local|*.local|169.254/16|*.169.254/16 java.runtime.version=9+181 user.name=XXXX path.separator=\: os.version=10.12.6 java.runtime.name=Java(TM) SE Runtime Environment file.encoding=UTF-8 java.vm.name=Java HotSpot(TM) 64-Bit Server VM java.vendor.url.bug=http\://bugreport.java.com/bugreport/ java.io.tmpdir=/var/folders/dm/gd6lc90d0hg220lzw_m7krr00000gn/T/ java.version=9 user.dir=/Users/XXXX/javacode os.arch=x86_64 java.vm.specification.name=Java Virtual Machine Specification java.awt.printerjob=sun.lwawt.macosx.CPrinterJob sun.os.patch.level=unknown MyParam=2 java.library.path=/Users/XXXX/Library/Java/Extensions\:/Library/Java/Extensions\:/Network/Library/Java/Extensions\:/System/Library/Java/Extensions\:/usr/lib/java\:. java.vm.info=mixed mode java.vendor=Oracle Corporation java.vm.version=9+181 sun.io.unicode.encoding=UnicodeBig java.class.version=53.0 socksNonProxyHosts=local|*.local|169.254/16|*.169.254/16
Comando: jcmd 11441 VM.flags salida:
11441: -XX:CICompilerCount=3 -XX:ConcGCThreads=1 -XX:G1ConcRefinementThreads=4 -XX:G1HeapRegionSize=1048576 -XX:InitialHeapSize=67108864 -XX:MarkStackSize=4194304 -XX:MaxHeapSize=1073741824 -XX:MaxNewSize=643825664 -XX:MinHeapDeltaBytes=1048576 -XX:NonNMethodCodeHeapSize=5830092 -XX:NonProfiledCodeHeapSize=122914074 -XX:ProfiledCodeHeapSize=122914074 -XX:ReservedCodeCacheSize=251658240 -XX:+SegmentedCodeCache -XX:-UseAOT -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseG1GC
Para obtener más instrucciones sobre los usos de jcmd, consulte la publicación de mi blog
fuente
En Linux:
java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'
En Mac OSX:
java -XX:+PrintFlagsFinal -version | grep -iE 'heapsize|permsize|threadstacksize'
En Windows:
C:\>java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"
Fuente: https://www.mkyong.com/java/find-out-your-java-heap-memory-size/
fuente
Alternativamente, puede usar jinfo
fuente
-flags
La opción no existe en la VM del servidor OpenJDK de 64 bits (compilación 1.8.0_111-internal-alpine-r0-b14) (java:8u111-jdk-alpine
imagen actual de Docker)flags
funciona con la imagen java oficial de Docker basada en Debian Jessiedocker run --rm -it java:8u111-jdk java -version && jinfo -h
Si puede hacer esto en Java, intente:
RuntimeMXBean
ManagementFactory
Ejemplo:
RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean(); List<String> jvmArgs = runtimeMXBean.getInputArguments(); for (String arg : jvmArgs) { System.out.println(arg); }
fuente
JConsole puede hacerlo. También puede utilizar una poderosa herramienta jvisualVM, que también se incluye en JDK desde 1.6.0.8.
fuente
En Linux, puede ejecutar este comando y ver el resultado:
ps aux | grep "java"
fuente
Windows 10 o Windows Server 2016 proporcionan dicha información en su administrador de tareas estándar. Un caso poco común de producción, pero si la JVM de destino se ejecuta en Windows, la forma más sencilla de ver sus parámetros es presionar Ctrl + Alt + Supr, elegir la pestaña Procesos y agregar la columna Línea de comando (haciendo clic con el botón derecho del mouse en cualquier encabezado de columna existente).
fuente
Si está interesado en obtener los parámetros de JVM de un proceso Java en ejecución, simplemente ejecute kill -3 java-pid. Obtendrá un archivo de volcado del núcleo en el que puede encontrar los parámetros de jvm utilizados al iniciar la aplicación Java.
fuente
Puede utilizar el comando JConsole (o cualquier otro cliente JMX) para acceder a esa información.
fuente
Esta técnica se aplica a cualquier aplicación Java que se ejecute de forma local o remota.
jvisualvm se puede encontrar en cualquier JDK desde JDK 6 Update 7. El video tutorial sobre jvisualvm está aquí.
fuente
_JAVA_OPTIONS es una variable env que se puede expandir.
fuente