2011-03-15 13 views
53

¿Hay alguna manera de obtener los parámetros de una JVM en ejecución? ¿Hay una herramienta de línea de comandos como jstat que toma como entrada el pid de la JVM y devuelve sus parámetros de inicio? Estoy particularmente interesado en los valores -Xmx y -Xms que se dieron al iniciar la JVM. Gracias.Obtener los parámetros de una JVM en ejecución

Editar: Para aclarar mis limitaciones. La JVM que queremos verificar se ejecuta en un servidor de producción. Por eso, preferimos la interrupción mínima. 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 tratamos de obtener los parámetros usando jvisualvm. Pero para poder conectarnos a un jvm remoto, necesitamos ejecutar jstatd y modificar la configuración de seguridad de JVM, lo cual nos pareció muy perjudicial y arriesgado en un servidor de producción.

+0

puede encontrar una herramienta que hay: [Herramientas de JDK y utilidades] (http: // docs .oracle.com/javase/8/docs/technotes/tools/index.html) –

Respuesta

88

Se puede utilizar como JPS

jps -lvm 

imprime algo así 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 
+4

Funciona como un encanto. También descubrí la herramienta jinfo en el jdk que tiene una función similar –

+2

Observe que la salida de 'jps -lvm' podría ser engañosa. Siempre revise dos veces con jinfo u otra herramienta. El problema puede ser si "-XX" se pasa como el argumento del programa normal e ignorado por JVM. Este es el caso si usa 'java -jar my.jar -Xmx3g' en lugar de' java -Xmx3g -jar my.jar' –

7

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

7

Si usted 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); 
} 
+0

Solo proporcionará valores si se pasó, por lo tanto, no hay configuraciones predeterminadas. – Behe

0

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

15

Como alternativa, puede utilizar jinfo

jinfo -flags <vmid> 
jinfo -sysprops <vmid> 
+3

Esta utilidad no es compatible y puede o no estar disponible en versiones futuras del JDK. –

+0

La opción '-flags' no existe en OpenJDK 64-Bit Server VM (compilación 1.8.0_111-internal-alpine-r0-b14) (actual imagen Docker' java: 8u111-jdk-alpine') –

+0

Escribí esta respuesta con Java 6/7 en mente. Más allá de eso, jinfo no es confiable, pero 'flags' funciona con la imagen oficial de Docker java basada en Debian Jessie' docker run --rm -it java: 8u111-jdk java -version && jinfo -h' –

0

Esta técnica se aplica para cualquier aplicación java ejecutándose local o remoto.

  1. Inicie su aplicación java.
  2. Ejecute JVisualVM que se encuentra en usted JDK (como C: \ Program Files \ Java \ jdk1.8.0_05 \ bin \ jvisualvm.exe).
  3. Cuando se inicia esta útil herramienta, mire la lista de ejecución de la aplicación java 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 pestaña para la aplicación . En el medio de la pestaña Descripción general, verá los argumentos de JVM para la aplicación.

jvisualvm se pueden encontrar en cualquier JDK desde JDK 6 Update 7.tutorial de vídeo sobre jvisualvm es here.

8

En Linux:

java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize' 

En Mac OS X:

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/

3

Esto se puede hacer con jcmd también

jcmd pid VM.system_properties 
jcmd pid VM.flags 

Estoy añadiendo esta nueva respuesta porque según JDK8 documentation jcmd se enfoque sugerido ahora.

Se sugiere utilizar la última utilidad, jcmd en lugar de la jstack anterior, jinfo, y los servicios públicos jmap para diagnóstico mejorado y reducido el gasto de recursos.

VM.system_properties pid jcmd

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 

jcmd 11441 VM.flags de 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 
Cuestiones relacionadas