1、内存配置参数
- -Xmx<size>:设置Java堆的最大内存。如 -Xmx2g 将堆的最大大小设置为2G,推荐配置为系统可用内存的70-80%
- -Xms<size>:设置Java堆的初始内存。如 -Xms2g 将堆的初始大小设置为2G,推荐配置与-Xmx的值相同,以避免堆内存动态调整的开销
- -Xmn<size>:设置新生代大小。如 -Xmn256m将新生代的大小设置为256MB
- -XX:NewRatio=<value>:设置新生代 / 老年代比率。如 -XX:NewRatio=2 表示新生代和老年代的比率为1:2
- -XX:SurvivorRatio=<value>:设置Eden区与Survivor区的比率。如 -XX:SurvivorRatio=8表示Eden区和每个Survivor区的比率为8:1, 推荐配置为8或16,即Eden区占整个新生代的80%到94%
2、线程和堆栈配置参数
- -Xss<size>:设置每个线程的堆栈大小。 如 -Xss1m 将每个线程的堆栈大小设置为1M ,等价于 -XX:ThreadStackSize=<value>
-XX:ThreadMaxStackSize=<value>
:用于设置线程的最大堆栈大小
3、垃圾回收配置参数
- -XX:+UseSerialGC:使用串行垃圾收集器,年轻代、老年代为 Serial New、Serial Old , 适用于单线程环境或小型应用程序
- -XX:+UseParallelGC:使用并行垃圾收集器,年轻代、老年代为 Parallel Scavenge 、Serial Old , 适用于多核处理器和大型应用程序
- -XX:+UseConcMarkSweepGC:使用并发标记清除垃圾收集器 CMS,年轻代、老年代为 ParNew New、CMS (Serial Old作为老年代的备用),适用于对停顿时间敏感的应用程序。
- -XX:+UseG1GC:使用G1垃圾收集器,年轻代、老年代均为 G1 ,适用于具有大内存容量和低停顿时间要求的应用程序。
- -XX:MaxGCPauseMillis=<value>:设置垃圾回收的最大停顿目标时长(毫秒),如 -XX:MaxGCPauseMillis=500 表示希望垃圾回收的停顿时间不超过500毫秒,根据应用程序的需求,推荐配置为100到500毫秒
- -XX:ParallelGCThreads=<value>:设置并行垃圾收集的线程数,推荐配置为CPU核心数的一半到全部
a、几种垃圾回收器的组合使用
新生代垃圾回收器:Serial、Parallel Scavenge 、Parallel New ,采用的都是标记 - 复制算法。其中 Serial 是单线程的,Parallel New 可以看成 Serial 的多线程版本。Parallel Scavenge 和 Parallel New 类似,但更加注重吞吐率。Parallel Scavenge 不能与 CMS 一起使用
老年代垃圾回收器:Serial Old 、Parallel Old、CMS。 Serial Old 和 Parallel Old 都是标记 - 压缩(或标记整理)算法。同样前者是单线程的,后者可以看成前者的多线程版本。CMS 采用的是标记 - 清除算法,且是并发的。除了少数几个操作需要 Stop-the-world 外,它可以在应用程序运行过程中进行垃圾回收(CMS垃圾回收失败,会启用 Serial Old 回收器,另外由于 G1 的出现,CMS 在 Java 9 中已被废弃)
G1(Garbage First):横跨新生代和老年代的垃圾回收器。它打乱了前面所说的堆结构,直接将堆分成极其多个区域。每个区域都可以充当 Eden 区、Survivor 区、老年代中的一个。它采用的是标记 - 压缩算法,而且和 CMS 一样都能够在应用程序运行过程中并发地进行垃圾回收。G1 能够针对每个细分的区域来进行垃圾回收。在选择进行垃圾回收的区域时,它会优先回收死亡对象较多的区域。这也是 G1 名字的由来。
b、为什么 parallel scavenge 不能 CMS 配合使用?
主要因为它们之间存在一些不兼容的特性和冲突,可能导致性能下降或不可预测的结果。
目标不同:Parallel Scavenge 的目标是在减少垃圾收集停顿时间的同时,达到最大的吞吐量。它使用复制算法,将新生代分为Eden区和Survivor区,并通过多线程并行进行垃圾回收。而CMS收集器的目标是降低垃圾收集的停顿时间,提供更好的应用程序响应性。
工作方式冲突:Parallel Scavenge 在新生代使用并行垃圾回收方式,而CMS收集器在老年代使用并发标记-清除方式。这两种方式在内部的工作机制和线程调度上存在冲突,同时使用可能引发并发冲突和性能问题。
参数冲突:Parallel Scavenge 和 CMS收集器都有一系列的配置参数,用于调整它们的行为和性能。同时使用这两个收集器时,参数的配置可能会相互冲突,导致不一致的行为或性能问题。
4、类加载和字节码配置参数
- -classpath 或 -cp:设置类路径。如 -cp /path/to/myapp.jar 设置类路径为 "/path/to/myapp.jar"
- -XX:+TraceClassLoading:跟踪类加载过程。使用此参数可以打印出加载的类的信息
- -XX:+TraceClassUnloading:跟踪类卸载过程。使用此参数可以打印出卸载的类的信息
5、调试和诊断配置参数
- -verbose:gc:打印GC(垃圾回收)信息。使用此参数将在控制台上显示GC的详细信息,包括内存使用情况和垃圾回收的频率
- -XX:+HeapDumpOnOutOfMemoryError:在内存溢出时生成堆转储文件。使用此参数可在发生内存溢出错误时自动生成堆转储文件,以便进行分析和调试
- -XX:OnOutOfMemoryError="<command>":在内存溢出时执行指定的命令。使用此参数可以在内存溢出错误发生时执行自定义命令或脚本,如发送警报或记录日志
- -Xloggc:<path> : 指定 gc 日志文件的输出路径
6、其他配置参数
- -Dproperty=value:使用 -D 参数设置自定义系统属性。 如 -Dapp.config =/path/config.yml 将 config 系统属性设置为 "/path/config.yml"
- -server:启用服务器模式。使用此参数可以在服务器环境中运行Java应用程序,以优化性能和吞吐量。