常见的几个JVM调优场景-一些参数

堆内存大小

  • -Xms:设定Java虚拟机初始堆内存大小,默认值由JVM自行决定。

  • -Xmx:设定Java虚拟机最大堆内存大小。

  • -Xmn:设置年轻代(Young Generation)的初始大小和最大大小。这个值通常作为整个堆的一部分来设置。

  • 分配年轻代空间的比例(相对于整个堆):
    -XX:NewRatio=:设置年轻代与老年代(Old Generation)的比例。例如,如果设为3,则年轻代与老年代的大小比例为1:3。

  • Survivor空间的策略:
    -XX:+UseAdaptiveSizePolicy:启用自适应大小策略,JVM会根据应用的行为动态调整年轻代和其他内存区域的大小。

  • 控制晋升至老年代的对象年龄阈值:

    • -XX:MaxTenuringThreshold=<value>:设置对象从年轻代晋升到老年代的最大年龄(即经历多少次Minor GC)。默认值通常是由JVM决定的,也可以手动设置。
  • 并发标记扫描(CMS)或Garbage First(G1)垃圾收集器特有的年轻代相关参数也会有所不同,但上述参数通常是通用的。

举例来说,配置年轻代占总堆大小的1/3且Survivor区与Eden区比为2:8的设置方式可能是:

-Xms1g -Xmx1g -Xmn300m -XX:SurvivorRatio=2
这将启动一个总堆大小为1GB的JVM实例,其中年轻代大小固定为300MB,
Survivor区和Eden区按两个Survivor区各占总年轻代大小的1/10,
Eden区占8/10进行划分。

元空间大小

  • -XX:MetaspaceSize:元空间初始大小,在JDK1.8中替代了PermGen空间,用于存储类的元数据。
  • -XX:MaxMetaspaceSize:元空间的最大大小。

垃圾收集器相关参数

  • -XX:+UseG1GC:启用G1垃圾收集器。
  • -XX:+UseParallelGC:启用并行垃圾收集器(年轻代)。
  • -XX:+UseConcMarkSweepGC:启用CMS垃圾收集器(老年代)。
  • -XX:NewRatio:年轻代与老年代的内存比例。
  • -XX:SurvivorRatio:Eden区与Survivor区的比例。

垃圾收集行为控制

  • -XX:MaxTenuringThreshold:对象晋升到老年代之前经历的垃圾回收次数阈值。
  • -XX:InitiatingHeapOccupancyPercent(G1 GC):触发并发标记周期的堆占用率阈值。

内存区域细分(G1收集器特定)

  • -XX:G1HeapRegionSize:设置G1堆区域的大小。

GC

  • -XX:+UseParallelGC:启用并行新生代收集器,使用多个线程进行垃圾回收。

  • -XX:ParallelGCThreads:设置并行收集器工作的线程数。

  • -Xloggc:filename:指定GC日志文件路径。

  • -XX:+PrintGCDetails:打印详细的GC处理信息。

  • -XX:+PrintGCDateStamps:在GC日志中添加时间戳。

  • -XX:NumberOfGCLogFiles-XX:GCLogFileSize:分别用于设置GC日志文件的数量和单个文件大小(滚动日志)。

栈内存大小

  • -Xss:每个线程的栈内存大小。

直接内存大小

  • -XX:MaxDirectMemorySize:设置可以使用的直接内存大小。

其他调优选项

  • -XX:+DisableExplicitGC:禁止程序主动调用System.gc()。
  • -XX:+AggressiveOpts:开启激进优化策略。
  • -XX:TargetSurvivorRatio:G1 GC的目标幸存者区占用率。

监控工具:

jstat -gccause :查看实时GC统计信息,包括引起Full GC的原因。
jinfo:动态获取或修改运行中的Java进程的JVM参数。
jmap:生成堆转储快照,用于离线分析。
jconsole 或 VisualVM:图形化监控工具,可以实时观察GC活动。

上一篇:共享旅游卡与我们当下的生活关联


下一篇:Java为什么是值传递?