当一个 Java 程序被运行后,JVM虚拟机的一些参数都是默认配置的,没有参考实际情况,一旦当一些区域的内存超出了虚拟机限定大小后,就会导致内存溢出等一些不可预期的后果,这也是在企业级应用中不允许的存在。
所以当对 JVM 的内存区域有了一定理解后,就可以考虑对这些区域和垃圾回收进行调优。
英语水平好的可以直接看官方的文档
JDK 1.7及以前
https://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html
JDK 1.8
https://docs.oracle.com/javase/8/docs/technotes/tools/windows/java.html
https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
辅助参数
参数 | 说明 | 示例 |
---|---|---|
-XX:+HeapDumpOnOutOfMemoryError | 堆内存异常时打印快照信息 | |
-XX:+HeapDumpPath | 堆内存快照输出路径 | -XX:HeapDumpPath=C:/log/java/java_heapdump.log |
-Xmn | 指定EDEN大小 | -Xmn256m |
-XX:SurvirorRation | 指定幸存者(TO/From)区大小 | |
-XX:pretenureSizeThreshold | 设置老年代大小 |
堆栈内存参数
参数 | 说明 | 示例 |
---|---|---|
-Xms | 堆最小值 | -Xms80M |
-Xmx | 堆最大值 | -Xmx80M |
-Xss | 栈最大值 | -Xss1m |
-XX:PermSize | 方法区内存最小值 | -XX:PermSize=20M |
-XX:MaxPermSize | 方法区内存最大值 | -XX:MaxPermSize=21M |
通常将 -Xmx和-Xms设置一样来减少 GC 次数,堆内存不足时会抛出OutOfMemoryError异常。
方法区OutOfMemoryError异常原因:常量过多、代理反射使用频繁。
本机内存参数
-XX:MaxDirectMemorySize=10M
内存不足时会抛出 OutOfMemory 异常。
垃圾回收
参数 | 说明 | 示例 |
---|---|---|
-XX:+UseSerialGC | 允许使用串行(Serial)垃圾收集器 | |
-XX:+UseParNewGC | 允许在年轻代中使用并行(ParNew)线程进行收集。默认禁用 | |
-XX:+UseConcMarkSweepGC | 允许老年代使用CMS垃圾收集器,默认禁用 | |
-XX:+UseParallelOldGC | 允许将并行垃圾收集器用于完整的GC,默认禁用 | |
-verbose:gc 或 -XX:+PrintGC | 显示有关每个垃圾回收(GC)事件的信息 | |
-XX:+PrintGCDetails | 获取更详细的 GC 事件信息 | |
-XX:+PrintGCTimeStamps | 获取 GC 的频率和间隔 | |
-XX:+PrintHeapAtGC | 获取堆的使用情况 | |
-Xloggc:filename | 指定日志情况的保存路径 | -Xloggc:garbage-collection.log |
并行:多条垃圾回收线程同时操作
并发:垃圾回收线程与用户线程一起操作