1.简介
jinfo(Java Virtual Machine Configuration Information)是JDK提供的一个可以实时查看Java虚拟机各种配置参数和系统属性的命令行工具。使用jps命令的-v参数可以查看Java虚拟机启动时显式指定的配置参数,如果想查看没有显式指定的配置参数就可以使用jinfo命令进行查看。另外,jinfo命令还可以查询Java虚拟机进程的System.getProperties()的内容。
jps常用
jps
jps -lvm
2.使用
获取帮助信息
jinfo
Usage:
jinfo [option] <pid>
(to connect to running process)
jinfo [option] <executable <core>
(to connect to a core file)
jinfo [option] [server_id@]<remote server IP or hostname>
(to connect to remote debug server)
where <option> is one of:
-flag <name> to print the value of the named VM flag
-flag [+|-]<name> to enable or disable the named VM flag
-flag <name>=<value> to set the named VM flag to the given value
-flags to print VM flags
-sysprops to print Java system properties
<no option> to print both of the above
-h | -help to print this help message
常用格式
jinfo [option] <pid>
参数解释
- option:jinfo命令的可选参数。如果没有指定这个参数,jinfo命令会显示所有的配置参数和系统属性。
- pid:要打印配置信息的Java虚拟机的进程ID。
常用命令
所有的pid都是1
2.1 查看jvm配置信息
jinfo 1
2.2 设置调试参数
显示指定名称对应的配置参数,比如,查看了简单GC日志模式(PrintGC)是否开启:
jinfo -flag PrintGC 1
启用或禁用指定名称的参数,该参数必须为Boolean类型。比如,开启简单GC日志模式:
jinfo -flag +PrintGC 1
比如,禁用简单GC日志模式:
jinfo -flag -PrintGC 1
这里有个不好用的地方,因为打开了简单日志,默认输出的标准输出。不好查看,最好可以指定输出路径。但是输出路径,不能用jinfo动态指定,需要在启动程序之前设置-Xloggc。为了不影响性能,需要手动关闭日志搜集。
jvm命令参数如下
-Xloggc:gc.log -XX:-PrintGC
注意两个参数的先后顺序。
不需要重启Java虚拟机,修改指定名称的参数为指定的值。比如,修改空闲堆空间的最小百分比(MinHeapFreeRatio)为30%:
查看当前MinHeapFreeRatio
jinfo -flag MinHeapFreeRatio 1
修改
jinfo -flag MinHeapFreeRatio=30 1
当然不是所有参数都可以这样修改的,比如并发垃圾收集器将使用的线程数(ConcGCThreads):
jinfo -flag ConcGCThreads=5 1
2.3 配置参数说明
那么,有哪些配置参数是支持动态修改的呢?
这些参数是 JVM 运行时允许动态修改的,你可以通过 jinfo -flag 命令来修改这些参数。常见的可以动态修改的参数包括:
Heap Dump 参数:
HeapDumpOnOutOfMemoryError
HeapDumpPath
GC 日志相关参数:
PrintGC
PrintGCDetails
PrintGCTimeStamps
PrintGCDateStamps
PrintGCCause
PrintTenuringDistribution
Debug 相关参数:
DebugNonSafepoints
JVM 诊断参数:
UnlockDiagnosticVMOptions
UnlockCommercialFeatures
JVM 运行参数:
PrintClassHistogram
PrintConcurrentLocks
我们也可以通过java -XX:+PrintFlagsInitial命令找到标记为manageable的配置参数,运行结果如下图所示:
java -XX:+PrintFlagsInitial | grep manageable
一般不能动态修改的 JVM 参数
这些参数在 JVM 运行时是不能修改的,必须在 JVM 启动时指定。
-XX:CICompilerCount=2
说明:设置编译器线程的数量。通常用于控制JIT编译的并行度。
-XX:ConcGCThreads=1
说明:设置并发垃圾收集器的线程数。对于 G1 GC 或 CMS GC,这个参数控制垃圾回收的并发线程数。
-XX:G1HeapRegionSize=2097152
说明:设置 G1 垃圾收集器的堆区域大小。G1GC 将堆划分为多个相等大小的区域,堆区域大小决定了垃圾收集的粒度。
-XX:InitialHeapSize=4294967296
说明:设置 JVM 启动时的初始堆大小。
-XX:MarkStackSize=4194304
说明:设置垃圾收集器标记阶段的堆栈大小。
-XX:MaxHeapSize=4294967296
说明:设置 JVM 最大堆内存大小。
-XX:MaxNewSize=2575302656
说明:设置新生代内存的最大大小。
-XX:MinHeapDeltaBytes=2097152
说明:设置堆增长的最小粒度(以字节为单位)。
-XX:+UseCompressedClassPointers
说明:启用压缩类指针,用于减少内存占用。
-XX:+UseCompressedOops
说明:启用压缩普通对象指针(Oops),同样用于减少内存占用。
-XX:+UseG1GC
说明:启用 G1 垃圾收集器。
以键值对的方式显示当前Java虚拟机的全部的系统属性,比如:
jinfo -sysprops 1
3.理解JVM参数:-D -X -XX
D参数
-D参数用于设置系统属性,它允许您在JVM启动时指定一个键值对,其中键是属性名称,值是属性值。这些系统属性可以在Java应用程序中使用System.getProperty方法获取。-D参数的语法格式如下:
-Dkey=value
例如,下面的命令行将设置名为“myprop”的属性值为“myvalue”:
java -Dmyprop=myvalue MyApp
在应用程序中,您可以使用以下代码获取该属性的值:
String myPropValue = System.getProperty(“myprop”);
-X参数
-X参数用于设置非标准 JVM 参数,这些参数通常是 JVM 实现特有的,不同于标准的 Java SE 规范。它们用于调整 JVM 的性能或行为。-X参数的语法格式如下:
-Xoption
例如,下面的命令行将设置堆内存的大小为1024MB:
java -Xms1024m MyApp
-XX参数
-XX参数是JVM的调试和高级配置选项,用于更深入地控制JVM的行为和性能。这些参数通常只在开发或调试阶段使用,因为它们可能会对应用程序的性能产生影响。-XX参数的语法格式如下:
-XX:option=value
例如,下面的命令行将启用垃圾回收日志记录:
java -XX:+PrintGCDetails MyApp
4.结尾
对于调试和诊断 JVM 问题(如性能瓶颈、内存泄漏等),jinfo 是一个有用的工具。它提供了一种在应用程序运行时查看和修改 JVM 配置的简便方法。
jinfo 可能在不同的 JVM 实现和版本中有所不同,虽然它在大多数标准 JDK 中都是可用的,但在某些特殊 JVM 版本或定制 JVM 中可能不支持。
5.引用
https://blog.csdn.net/heihaozi/article/details/123570368
https://cloud.baidu.com/article/2769602