麦克斯仇
Think different
159
文章
29507
阅读
首页
INDEX
文章
ARTICLE
关于
ABOUT
Java启动参数(垃圾回收篇)
创建日期:
2022/03/17
修改日期:
2023/11/04
Java
> 官方文档: - `Java8 - Linux`:[https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html](https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html) - `Java8 - Windows`:[https://docs.oracle.com/javase/8/docs/technotes/tools/windows/java.html](https://docs.oracle.com/javase/8/docs/technotes/tools/windows/java.html) - `Java11`:[https://docs.oracle.com/en/java/javase/11/tools/java.html](https://docs.oracle.com/en/java/javase/11/tools/java.html) > 参考教程 - **文档:** JavaGuide:[JVM 垃圾回收详解](https://javaguide.cn/java/jvm/jvm-garbage-collection.html) - **视频:** 尚硅谷:[互联网大厂高频重点面试题(第2季)](http://www.atguigu.com/download_detail.shtml?v=130) --- 下文以 `1.8.0_201` 为主 # 常用垃圾收集器 | 名称 | 作用域 | 说明 | 启用参数 | | --- | --- | --- | --- | | Serial 收集器 | 年轻代 | 仅适用于小型和简单的应用程序 | `-XX:+UseSerialGC`| | ParNew 收集器 | 年轻代 | Serial 收集器的多线程版本 | `-XX:+UseParNewGC` | | Parallel Scavenge 收集器 | 年轻代 | 高吞吐量(高效率的利用 CPU) | `-XX:+UseParallelGC` | | Serial Old 收集器 | 老年代 | Serial 收集器的老年代版本,CMS 收集器的后备方案 | | | CMS 收集器 | 老年代 | 最短回收停顿时间的收集器 | `-XX:+UseConcMarkSweepGC` | | Parallel Old 收集器 | 老年代 | Parallel Scavenge 收集器的老年代版本 | `-XX:+UseParallelOldGC` | | G1 收集器 | All | 针对多核处理器及大内存的配置 | `-XX:+UseG1GC` | | ZGC 收集器 | All | `jdk 11`开始支持<br>参考:[美团技术团队 - 新一代垃圾回收器ZGC的探索与实践](https://tech.meituan.com/2020/08/06/new-zgc-practice-in-meituan.html) | `-XX:+UseZGC` > 绑定关系 ![](https://cdn2.maxqiu.com/upload/b96298388b2a4127b1f72b271dec8470.jpg) ### `-XX:+UseSerialGC` ```bash java -XX:+UseSerialGC -jar web.jar ``` ### `-XX:+UseParNewGC` + `-XX:+UseConcMarkSweepGC` ```bash java -XX:+UseParNewGC -jar web.jar ``` 如果只开启`ParNew`,则`JVM`会出现如下提示:`Java HotSpot(TM) 64-Bit Server VM warning: Using the ParNew young collector with the Serial old collector is deprecated and will likely be removed in a future release`。说明还是老年代还是使用的`Serial Old`。建议直接开启`CMS`,则自动开启`ParNew`,示例如下: ```bash java -XX:+UseConcMarkSweepGC -jar web.jar ``` ### `-XX:+UseParallelGC` + `-XX:+UseParallelOldGC` ```bash java -XX:+UseParallelGC -jar web.jar ``` ```bash java -XX:+UseParallelOldGC -jar web.jar ``` 注:`Java 8`默认使用该组合 ```bash java -jar web.jar ``` ### `-XX:+UseG1GC` ```bash java -XX:+UseG1GC -jar web.jar ``` ### `-XX:+UseZGC` - `jdk 11` 仅支持 `Linux` , `jdk 14` 增加了 `Windows` 、 `Mac OS` 的支持。 - 需要开启实验性选项:`-XX:+UnlockExperimentalVMOptions` ```bash java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC -jar web.jar ``` # 垃圾回收日志设置 | 启用参数 | 说明 | 备注 | --- | --- | --- | | `-Xloggc:filename` | 设置 `GC` 日志文件<br>设置后控制台将不输出<br>默认打印基本信息 | 示例:`-Xloggc:gc.log` | | `-XX:+PrintGC` | 开启打印 `GC` 基本信息 | | | `-XX:+PrintGCDetails` | 开启打印 `GC` 详细信息 | 推荐使用 | | `-XX:+PrintGCTimeStamps` | 开启打印 `GC` 相对时间戳 | 输出示例:`1.827` 单位:秒<br>输出文件时默认开启 | `-XX:+PrintGCDateStamps` | 开启打印 `GC` 日期戳 | 输出示例:`2022-03-17T21:48:00.738+0800` | `-XX:+PrintGCTaskTimeStamps` | 开启每个单独的 `GC` 线程打印时间戳 | 仅输出在控制台 | | `-XX:+PrintGCApplicationStoppedTime` | 启用打印暂停持续的时间 | | | `-XX:+PrintGCApplicationConcurrentTime` | 启用打印自上次暂停以来经过的时间 | | # 垃圾回收线程和时间设置 | 启用参数 | 说明 | 备注 | | --- | --- | --- | | `-XX:ConcGCThreads=threads` | 设置并发 `GC` 使用的线程数 | 默认值:可用的 `cpu` 数量 | | `-XX:ParallelGCThreads=threads` | 设置用于年轻代和年老代中并行垃圾收集的线程数 | 默认值:可用的 `cpu` 数量 | | `-XX:MaxGCPauseMillis=time` | 设置最大 `GC` 暂停时间的目标(以毫秒为单位) | 这是一个软目标,`JVM` 将尽最大努力实现它<br>默认没有最大暂停时间值 | # 实战 PS:`JVM` 调优是一件很复杂的事情,需要根据业务场景、垃圾回收日志等条件慢慢分析。以下仅供参考 > 低配 ```bash java -XX:+PrintCommandLineFlags -Xms128M -Xmx128M -Xmn64M -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M -XX:SurvivorRatio=8 -XX:+UseSerialGC -jar web.jar ``` > 普通 低停顿时间 ```bash java -XX:+PrintCommandLineFlags -Xms1G -Xmx1G -Xmn512M -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC -jar web.jar ``` 高吞吐量 ```bash java -XX:+PrintCommandLineFlags -Xms1G -Xmx1G -Xmn512M -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M -XX:SurvivorRatio=8 -XX:+UseParallelGC -jar web.jar ``` > G1 ```bash java -XX:+PrintCommandLineFlags -Xms1G -Xmx1G -Xmn512M -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M -XX:SurvivorRatio=8 -XX:+UseG1GC -jar web.jar ``` > ZGC ```bash java -XX:+PrintCommandLineFlags -Xms1G -Xmx1G -Xmn512M -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M -XX:SurvivorRatio=8 -XX:+UnlockExperimentalVMOptions -XX:+UseZGC -jar web.jar ```
117
全部评论