文章目录

  • 查看jvm所有参数默认值
  • 查看jvm所有的参数, 只限于JDK 1.6或以上版本
  • 统计当前Java版本支持的JVM参数的个数
  • 内存分配相关
  • GC相关
  • 垃圾回收统计信息
  • 异常相关
  • 总结
  • Java heap size 设置不合理会引发什么问题?
  • -Xms、-Xmx参数配置
  • HeapDumpOnOutOfMemoryError
  • 一. 配置方法
  • 二. 参数说明



JVM 常见配置汇总:

查看jvm所有参数默认值

java -XX:+PrintFlagsInitial -version

查看jvm所有的参数, 只限于JDK 1.6或以上版本

java -XX:+PrintFlagsFinal -version

统计当前Java版本支持的JVM参数的个数

java -XX:+PrintFlagsFinal -XX:+UnlockDiagnosticVMOptions -version | wc -l

查看当前JVM运行的参数

jinfo -flags <pid>

内存分配相关

参数

作用

-Xms

初始堆大小,默认是物理内存的1/64,单位为兆 m/M, 例如 -Xms10m

-Xmx

最大堆大小,默认是物理内存的1/4,单位为兆 m/M, 例如 -Xmx10m

-Xss

-Xss128k,表示可以设置虚拟机栈的大小为128k

-Xoss

-Xoss128k,表示设置本地方法栈的大小为128k。不过HotSpot并不区分虚拟机栈和本地方法栈,因此对于HotSpot来说这个参数是无效的

-XX:NewSize=n

设置年轻代大小

-XX:PermSize

-XX:PermSize=10M,表示JVM初始分配的永久代的容量,必须以m/M为单位

-XX:MaxPermSize=n

表示JVM允许分配的永久代的最大容量,必须以m/M为单位,大部分情况下这个参数默认为64M

-XX:NewRatio=n

设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4

-XX:SurvivorRatio

Eden与Survivor区的比例

-XX:+/-UseTLAB

是否使用TLAB来创建对象

-XX:PretenureSizeThreshold

晋升老年代对象大小

GC相关

参数

作用

-Xnoclassgc

表示关闭JVM对类的垃圾回收

-XX:+UseSerialGC

设置串行收集器

-XX:+UseParallelGC

设置并行收集器

-XX:+UseParalledlOldGC

设置并行年老代收集器

-XX:+UseConcMarkSwerrpGC

设置并发收集器,指定老年代的GC收集器为CMS

-XX:+UseParNewGC

指定新生代GC收集器为ParNew

-XX:ParallelGCThreads=n

设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数

-XX:MaxGCPauseMillis=n

设置并行收集最大暂停时间(以牺牲吞吐量为代价)

-XX:GCTimeRatio=n

设置垃圾回收时间占程序运行时间的百分比。GC吞吐量,计算方式为吞吐量=1/(1+n),n为设定的值

-XX:CMSInitiatingOccupancyFraction

用于设置触发GC的百分比,在jdk 1.6中,这个值时92%

-XX:+CMSIncrementalMode

设置为增量模式。适用于单CPU情况。

垃圾回收统计信息

参数

作用

-XX:+PrintGC

表示在控制台上打印出GC具体细节

-XX:+UseG1GC

表示让JVM使用G1垃圾收集器

-XX:+PrintGCDetails

-XX:+PrintGCTimeStamps

-Xloggc:filename

异常相关

参数

作用

-XX:+HeapDumpOnOutOfMemoryError

在出现OOM异常之后自动生成heapdump文件,类似 java_pid*.hprof 文件

-XX:+HeapDumpOnCtrlBreak

使用Ctrl+Break键可以让虚拟机生成heapdump文件

总结

Java heap size 设置不合理会引发什么问题?

在JVM中如果98%的时间是用于GC且可用的Heap size 不足2%的时候将抛出此异常信息:java.lang.OutOfMemoryError: Java heap space

如果Heap Size设置偏小,除了这些异常信息外,还会发现程序的响应速度变慢了。GC占用了更多的时间,而应用分配到的执行时间较少。

Heap size的-Xms -Xmn 设置不要超出物理内存的大小。否则会提示“Error occurred during initialization of VM Could not reserve enough space for object heap”。

-Xms、-Xmx参数配置

Java 虚拟机在启动的时候会自动设置Heap size的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。但是在实际运行中是不够的,因为需要进行内存扩大。我们可以利用Java 虚拟机提供的-Xms -Xmx等选项可进行设置。

默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制。
因此服务器一般设置-Xms、-Xmx相等,以避免在每次GC 后调整堆的大小。对象的堆内存由称为垃圾回收器的自动内存管理系统回收。

HeapDumpOnOutOfMemoryError

一. 配置方法

在JAVA_OPTIONS变量中增加

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${目录}。
二. 参数说明

(1)-XX:+HeapDumpOnOutOfMemoryError参数表示当JVM发生OOM时,自动生成DUMP文件。如果不用 HeapDumpPath 选项指定转储路径,则会自动保存到启动目录下。
(2)-XX:HeapDumpPath=${目录}参数表示生成DUMP文件的路径,也可以指定文件名称,例如:-XX:HeapDumpPath=${目录}/java_heapdump.hprof。如果不指定文件名,默认为:java_<pid>_<date>_<time>_heapDump.hprof。

特别说明:
不建议内存溢出文件名写死,建议只写路径;否则,再次发生内存溢出,内存溢出文件无法成功保存。