Obtener los parámetros de una JVM en ejecución

90

¿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.

S.S
fuente
Puede encontrar una herramienta allí: JDK Tools and Utilities
Guillaume Husta

Respuestas:

145

Puedes usar jps como

jps -lvm

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
Peter Lawrey
fuente
6
Funciona de maravilla. También descubrí la herramienta jinfo en el jdk que tiene una función similar
HH
2
Tenga en cuenta que la salida de jps -lvmpodrí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 en java -jar my.jar -Xmx3glugar dejava -Xmx3g -jar my.jar
Juraj Martinka
36

Estoy agregando esta nueva respuesta porque, según la documentación de JDK8 , jcmd es un enfoque sugerido ahora.

Se sugiere utilizar la última utilidad, jcmd en lugar de las utilidades jstack, jinfo y jmap anteriores para mejorar el diagnóstico y reducir la sobrecarga de rendimiento.

A continuación se muestran los comandos para obtener las propiedades / banderas que desea.

jcmd pid VM.system_properties
jcmd pid VM.flags

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

Vipin
fuente
No se pudo encontrar ningún proceso que coincida: 'pid'
Ch Vas
1
pid debe ser reemplazado con el ID de proceso de Java, el sistema operativo Linux generalmente lo obtenemos por “ps -ef | grep jdk ”, si ve varios procesos con esto, haga una nueva pregunta o intente buscar en Google
Vipin
23

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/

Diego López
fuente
21

Alternativamente, puede usar jinfo

jinfo -flags <vmid> 
jinfo -sysprops <vmid>
Jarek Przygódzki
fuente
3
Esta utilidad no es compatible y puede o no estar disponible en versiones futuras del JDK.
GoYun.Info
-flagsLa 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-alpineimagen actual de Docker)
Anthony O.26 de
Escribí esta respuesta con Java 6/7 en mente. Más allá de eso, jinfo no es confiable, pero flagsfunciona con la imagen java oficial de Docker basada en Debian Jessie docker run --rm -it java:8u111-jdk java -version && jinfo -h
Jarek Przygódzki
15

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);
}
lukastymo
fuente
1
Solo proporcionará valores si se aprobó, por lo tanto, no hay configuraciones predeterminadas.
Behe
8

JConsole puede hacerlo. También puede utilizar una poderosa herramienta jvisualVM, que también se incluye en JDK desde 1.6.0.8.

Vladimir Ivanov
fuente
3

En Linux, puede ejecutar este comando y ver el resultado:

ps aux | grep "java"
Etienne
fuente
Mi empresa usa Red Hat Linux y tengo un acceso muy limitado al sistema. ps aux | El comando grep "java" enumera todos los comandos java con sus argumentos jvm e incluso podemos hacer grep con el argumento jvm exacto si es necesario. Esto es realmente útil en caso de que otras herramientas como jps, jcmd, etc. no estén disponibles / accesibles.
A
1

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).

Khomyshynets romanos
fuente
1

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.

lambzee
fuente
0

Puede utilizar el comando JConsole (o cualquier otro cliente JMX) para acceder a esa información.

nfechner
fuente
0

Esta técnica se aplica a cualquier aplicación Java que se ejecute de forma local o remota.

  1. Inicie su aplicación java.
  2. Ejecute JVisualVM encuentra en su JDK (como C: \ Archivos de programa \ Java \ jdk1.8.0_05 \ bin \ jvisualvm.exe).
  3. Cuando esta útil herramienta comience, mire la lista de aplicaciones Java en ejecución bajo el nodo del árbol "Local".
  4. Haga doble clic en [su aplicación] (pid [n]).
  5. En el lado derecho habrá contenido de inspección en la pestaña de la aplicación. En el medio de la pestaña Descripción general, verá los argumentos de JVM para la aplicación.

jvisualvm se puede encontrar en cualquier JDK desde JDK 6 Update 7. El video tutorial sobre jvisualvm está aquí.

javajon
fuente
OP declaró explícitamente que jvisualvm no era una opción.
Olivier Gérardin
0

_JAVA_OPTIONS es una variable env que se puede expandir.

echo $_JAVA_OPTIONS
zee
fuente