点击下方关注我,然后右上角点击...“设为星标”,就能第一时间收到更新推送啦~~~
JVM(Java虚拟机)是Java编程语言的核心组件之一,它负责执行Java程序,并提供一系列参数和配置选项,可以调整Java程序的行为和性能。
1
JVM 参数
JVM 参数主要有 3 类:标准参数,非标准参数,高级参数。
1、标准参数(Standard Options)
标准参数所有的 Java 虚拟机都支持,用于常见操作,例如:检查 Java 版本,查看 java 命令的用法等,标准参数以“-”开头。
-version :查看 Java 版本
-help :查看 java 命令的使用帮助
2、非标准参数(Non-Standard Options)
非标准参数不能保证所有 Java 虚拟机都支持它们,不同的 JDK 版本可能会发生变化,这些参数以“-X”开头。
-Xmixed:混合模式执行 (默认)
-Xint:仅解释模式执行
-Xms
-Xmx
-Xss
CMD 里运行 java -X
命令,可以显示所有可用 -X 参数的说明。
3、高级参数(Advanced Options)
开发人员使用最多的参数,用于 JVM 调优和 debug,不同的 JDK 版本可能会发生变化,这些参数以 “-XX” 开头。
“-XX” 参数有 2 种类型:Boolean 类型和需要参数的类型。
Boolean 类型:用于启用默认情况下禁用的功能,或者禁用默认情况下启用的功能,此类选项不需要参数。
格式:-XX:[+-]
-XX:+UseConcMarkSweepGC 表示启用 CMS 垃圾收集器
-XX:+UseG1GC 表示启用 G1 垃圾收集器
-XX:+PrintCommandLineFlags 表示启用打印 JVM 设定的值,例如堆空间大小和选定的垃圾收集器
需要指定参数值的类型:用于指定某个参数为某个值。
格式:-XX:
-XX:ThreadStackSize=size 设置线程堆栈大小(以字节为单位),字母“k”或“K”表示千字节,“m”或“M”表示兆字节,“g”或“G”表示千兆字节。“-XX:ThreadStackSize ”等效于 “-Xss”。
-XX:InitialHeapSize=size 设置内存分配池的初始大小(以字节为单位),此值必须为 0 或 1024 的倍数且大于 1 MB,“-XX:InitialHeapSize”等效于 “-Xms”。
-XX:MaxHeapSize=size 设置内存分配池的最大大小(以字节为单位),此值必须是 1024 的倍数且大于 2 MB,“-XX:MaxHeapSize ”等效于 “-Xmx”。
-XX:MaxGCPauseMillis=time 设置最大 GC 暂停时间的目标(以毫秒为单位)
4、以下是一些常见的JVM参数和配置选项:
-classpath:指定类路径,可以包括多个目录和JAR文件。
-verbose:启动JVM时输出详细信息,包括类加载、内存分配和线程启动等。
-version:显示JVM版本信息。
-showversion:启动JVM时显示版本信息。
-X:使用非标准选项启动JVM,可以指定各种参数和配置选项。
-Xmx:设置JVM最大堆内存大小,例如-Xmx2G表示最大堆内存为2GB。
-Xms:设置JVM初始堆内存大小,例如-Xms512M表示初始堆内存为512MB。
-XX:PermSize 和 -XX:MaxPermSize:设置永久代(PermGen)的初始大小和最大大小。
-XX:+UseConcMarkSweepGC:使用并发标记清除(CMS)垃圾回收器。
-XX:+UseParallelGC:使用并行垃圾回收器。
-XX:+PrintGC:启动垃圾回收时输出垃圾回收信息。
-XX:+PrintGCDetails:启动垃圾回收时输出详细的垃圾回收信息。
-Xloggc:指定垃圾回收日志文件的路径和名称。
-XX:ParallelGCThreads:指定并行垃圾回收线程数。
-XX:MaxDirectMemorySize:设置直接内存的最大大小。
这些参数和配置选项可以用来调整JVM 的行为和性能,以便更好地适应不同的应用场景和硬件环境。
JDK 8 的参数官方链接:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html#BABDCEGG
大家可以自行研究。
2
JVM 参数配置的方式
1、开发工具中设置:IDEA,eclipse。
2、命令行运行 jar 包的时候设置:java -Xmx1024m -Xms1024m -jar xxx.jar
3、tomcat 容器设置:tomcat 启动执行的是 tomcat/bin/startup.sh,startup.sh 执行的是 catalina.sh,所以要在 catalina.sh 中进行设置,修改JAVA_OPTS配置。
JAVA_OPTS="-server -Xms8g -Xmx8g -XX:NewRatio=4 -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC -XX:ParallelGCThreads=8 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/gclogs/dump/heap.hprof -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/usr/local/gclogs/gc.log -XX:+DisableExplicitGC"
以上各参数含义:
-server:表示这是服务器虚拟机
-Xms8g:设置 JVM 最小内存为 8g,可以与 -Xmx 相同,以避免每次垃圾回收完成后 JVM 重新分配内存
-Xmx8192m:设置 JVM 最大可用内存为 8g
-XX:NewRatio=4:设置新生代(包括 Eden 和两个 Survivor 区)与老年代的比值,设置为 4,则表示新生代:老年代=1:4,也就是新生代占整个堆内存的1/5。
-XX:SurvivorRatio=8:新生代中 Eden 区与 Survivor 区的比值,设置为 8 表示 Eden:(S0+S1)=2:8,也就是一个 Survivor 区占整个新生代的 1/10。
-XX:+UseConcMarkSweepGC:设置老年代使用 CMS 并发收集器,它的主要适合场景是对响应时间的需求大于对吞吐量的需求,能够承受垃圾回收线程和应用线程共享 CPU 资源,并且应用中存在比较多的长生命周期对象。CMS 并发收集器的目标是尽量减少应用的暂停时间(STW),减少 Full GC 发生的概率,利用和应用程序线程并发的垃圾回收线程来标记清除老年代内存。
-XX:ParallelGCThreads=8:表示 JVM 在进行并行 GC 的时候,用于 GC 的线程数
-XX:+HeapDumpOnOutOfMemoryError:启动堆内存溢出打印,当 JVM 堆内存发生溢出时(OOM),自动生成 dump 文件
-XX:HeapDumpPath:生成DUMP文件的路径,表示在 /usr/local/gclogs/dump 目录生成一个 heap.hprof文件;如不设置,默认存储在 jvm 运行环境目录。
-XX:+PrintGCDetails:打印 GC 详细信息,记录 GC 日志并不会特别地影响 Java 程序性能
-XX:+PrintGCDateStamps:允许在每个GC上打印日期戳
-Xloggc:指定 GC log 的位置为 /usr/local/gclogs,将详细的 GC 事件信息重定向到 gc.log 文件
-XX:+DisableExplicitGC:忽略手动调用 GC 的代码使得 System.gc() 的调用不会触发任何 GC
通过 jinfo 实时调整某个 java 进程的参数(只有被标记为 {manageable} 的参数可以被实时修改),后续详细介绍该命令。
3
查看 JVM 参数,打印 XX 选项及值
-XX:+PrintCommandLineFlags
表示启用打印 JVM 设定的值,例如堆空间大小和选定的垃圾收集器
-XX:+PrintFlagsInitial
表示打印出所有 XX 选项的默认值
-XX:+PrintFlagsFinal
表示打印出所有 XX 选项在程序运行时实际的值
在程序运行前设置以上的选项,如下图:
运行可以打印出类似下面的内容,只截取了一部分信息:
输出的值 "="
表示默认值,":="
表示被用户或 JVM 修改后的值,{product} 表示官方支持的 JVM 内部选项,{manageable} 表示外部定义的并且是可动态写入的。
在开发工具启动参数里设置:-Xmx20M -Xms10M -XX:+PrintFlagsFinal
,我们来观察默认的参数值和修改后的参数值,如下:
结束语。