查看参数
1)-XX:+PrintFlagsInitial:查看所有的参数的默认初始值
2)-XX:+PrintFlagsFinal:查看所有参数的最终值(有的可能不是初始值)
垃圾收集器
查看命令行相关操作,包括使用的垃圾收集器: -XX:+PrintCommandLineFlags
设置堆大小
-Xms 10m:堆最小大小,-Xmx10m:堆最大的大小
1. "-Xms" 用于表示堆区的起始内存,等价于 "-XX:InitialHeapSize"。默认不写单位是字节
2. "-Xmx" 用于表示堆区的最大内存,等价于 "-XX:MaxHeapSize"。默认不写单位是字节
-X:是jvm的运行参数,ms:是memory start
一旦堆区中的内存大小超过"-Xmx"所指定的最大内存时,将会抛出OutOfMemoryError的异常
通常会将 -Xms 和-Xmx两个参数配置相同的值,为了能够在java垃圾回收机制清理完堆区后不需要重新分割计算堆区的大小,从而提高性能。
默认情况下:
初始内存:物理电脑内存大小 / 64
最大内存:物理电脑内存大小 / 4
新生代设置
设置新生代大小
-Xmn:新生代最大内存大小
一般我们使用默认值就可以了,如果指定了-Xmn,又指定了 -XX:NewRatio,会以-Xmn为准
设置新生代垃圾的最大年龄
-XX:MaxTenuringThreshould
打印日志
1)-XX:+PrintGCDetails 或 -Xlog:gc* 打印GC日志
2)-XX:PrintGC:打印GC简要信息
3)-XX:+PrintStringTableStatistics 开启打印StringTable的参数
配置各个区域的占比
1)配置新生代与老年代在堆中结构的占比
-XX:NewRatio=?:老年代的占比
默认 -XX:NewRatio=2, 表示新生代占1,老年代占2,新生代占整个堆的1/3
修改 -XX:NewRatio=4, 表示新生代占1,老年代占4,新生代占整个堆的1/5
修改建议:如果大对象或者生命周期偏长的对象较多,可以增大老年代的比例。
2)配置新生代中eden和servive区域的占比
-XX:ServivorRatio=?
默认 -XX:ServivorRatio=8:eden和from、to空间占比:8:1:1
但jvm有自适应机制,所以我们看到不一定是8:1:1,可以使用 "-XX:-UseAdaptiveSizePolicy" 关闭自适应机制(但不管用,要设置比例还是使用-XX:ServivorRatio)。
堆空间各区域怎么划分
获取活跃数据配置堆空间大小
拉取GC日志,算出应用程序在稳定运行的时候那些长期存活的对象占据多大空间。
例如:活跃数据300M:总堆设置大小300M*4 = 1.2G,新生代450M,老年代750M,元空间/永久代:在垃圾回收之后元空间还剩200M,那么我们就把它设置为300M
其他参数
是否设置空间分配担保
-XX:HandlePromotionFailure:true
在发生Minor GC之前,虚拟机会检查老年代最大可用的连续空间是否大于新生代所有对象的总空间。如果大于:此次Minor GC 是安全的。如果小于,则虚拟机会查看-XX:HandlePromotionFailure==true,如果为true会继续检查老年代最大可用连续空间是否大于历次晋升到老年代的对象平均大小。如果大于则尝试一次Minor GC,如果小雨则进行一次Full GC。
如果-XX:HandlePromotionFailure==false,则进行一次Full GC。
在JDK6之后虽然还有这个参数,但不影响分配担保策略了,只要老年代的连续空间大于新生代总对象大小,或者历次晋升的平均大小就会进行MinorGC,否则Full GC。
生成dump文件
-XX:+HeapDumpOnOutOfMemoryError
在出现OutOfMemoryError的时候在当前文件中生成dump文件。