jvm 参数
内存
参数 | 作用 | 解释和建议 |
---|---|---|
-Xms | 设置堆内存最小值 | 与 Xmx 相等 |
-Xmx | 设置堆内存最大值 | 与 Xms 相等 |
-Xmn | 设置新生代大小(绝对值) | 设置为整个堆空间的1/4或1/3 过小会增加 Minor GC频率,过大会减小老年代的大小 新生代+老年代=堆,这里设置新生代空间,剩下的就是老年代的空间 |
-XX:NewRatio | 设置新生代与老年代比值 | -Xmn 是设置数值,这个是设置比例,都是设置新老代的大小,和 -Xmn 二选一 -XX:NewRatio=3 表示新生代与老年代所占比例为1:3,新生代占整个堆的 1/4 |
-Xss | 设置虚拟机栈大小 | jdk5+版本每个栈大小默认为 1M,jdk5 以前的版本每个线程池大小默认是 256k 栈内存越小,能创建的线程数量越多,栈内存越大,创建的线程数越少 |
-XX:PermSize | 设置非堆区(方法区)最小值 | 默认是本地内存的 1/64 |
-XX:MaxPermSize | 设置非堆区(方法区)最大值 | 默认是本地内存的 1/4 |
-XX:MaxTenuringThreshold | 设置新生代对象晋级到老年代的年龄 | 默认15 |
-XX:SurvivorRatio | 设置 Eden 区与 Subrvivor 区大小的比值 | 如果设置为8,两个 Subrvivor 区与 Eden 区的比值为 1:1:8 |
-XX:+UseFastAccessorMethods | 原始类型快速优化 | |
-XX:+AggressiveOpts | 编译速度加快 | |
-XX:PretenureSizeThreshold | 设置大对象大小 | 对象超过多大值时直接分配到老年代 |
为什么 -Xms 和 -Xmx 建议一致?
避免每次 GC 后动态调整堆空间大小,比如 -Xms=100,-Xmx=200,当发生 GC 时堆内存是 190M,回收了 30M,GC 结束后会把堆空间大小调整为 160M
垃圾收集器
7种垃圾收集器能互相搭配,有的搭配方式在不同的版本中弃用、废弃、删除,这里只说在 jdk8 环境下推荐的搭配方式
搭配方式(Yong+Old) | 参数 | 使用场景 | 特点 | |
---|---|---|---|---|
第一组 | Serial + Serial Old | -XX:+UseSerialGC | 硬件配置不高的服务器,比如单核 CPU | 新老年代都是单线程串行回收 |
第二组 | Parallel + Parallel Old | -XX:+UseParallelGC | 动态自适应调整堆内存分配比例和吞吐量优先 | jdk8默认,新老年代多线程串行回收 |
第三组 | ParNew + CMS | -XX:+UseConcMarkSweepGC | 高吞吐量 | 新生代多线程串行,老年代多线程并发 当指定了 -XX:+UseConcMarkSweepGC 默认的年轻代收集器是 ParNew,也会在需要压缩内存的时候使用 Serial Old |
第四组 | G1 | -XX:+UseG1GC | 高吞吐量 | jdk9 默认 |
-
SerialGC 示例
java -XX:+UseSerialGC -Xms512m -Xmx512m -jar your-application.jar
-
ParallelGC 示例
java -XX:+UseParallelGC \ # 启用 ParallelGC -Xms4g \ # 堆最小内存 -Xmx8g \ # 堆最大内存 -XX:NewSize=2g \ # 年轻代初始大小 -XX:MaxNewSize=4g \ # 年轻代最大大小 -XX:ParallelGCThreads=8 \ # 年轻代垃圾回收线程数量 -XX:ConcGCThreads=4 \ # 老年代垃圾回收线程数量 -Xlog:gc*:file=/path/to/gc.log \ # 启用 GC 日志记录到指定文件 -XX:+PrintGCDetails \ # 每次回收,打印/记录回收信息,包括 各代内存的使用情况、垃圾回收前后堆内存大小、回收的垃圾量、回收所花的时间 -XX:+PrintGCDateStamps \ # 每次回收,打印/记录执行的时间点(什么时候执行的) -jar your-application.jar
-
CMS 示例
java -XX:+UseConcMarkSweepGC \ # 启用 CMS(新生代默认用 ParNew,当需要时自动使用 Serial Old 压缩内存) -Xms2g -Xmx4g \ # 堆最小和最大内存 -XX:NewRatio=2 \ # 年轻代与老年代的比率设置为 1:2 -XX:CMSInitiatingOccupancyFraction=70 \ # 触发 CMS GC 的老年代使用率(当老年代使用率达到 70% 的时候触发,默认值是 80%) -XX:+CMSParallelRemarkEnabled -XX:ParallelCMSThreads=4 \ # 启用 CMS 并发标记, 4 个线程 -XX:ConcGCThreads=4 \ # 并发 GC 线程数为 4 -XX:MaxGCPauseMillis=200 \ # 期望的最大垃圾回收停顿时间为 200 毫秒 -XX:CMSFullGCsBeforeCompaction=5 \ # CMS 回收 5 次后压缩一次 -XX:+CMSNoAbortPreclean \ # 禁用 CMS 并发预清理,以减少垃圾回收中断 -Xloggc:gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps \ # GC 日志 -jar YourApplication.jar
-
G1 示例
java -XX:+UseG1GC \ # 启用 G1 -Xms4g -Xmx4g \ # 堆最小和最大内存 -XX:NewSize=2g -XX:MaxNewSize=2g \ # 新生代初始和最大大小 -XX:MaxGCPauseMillis=200 \ # 期望的最大垃圾回收停顿时间,默认为 200 毫秒 -XX:ParallelGCThreads=4 \ # 并行垃圾回收的线程数为 4 -XX:ConcGCThreads=4 \ # 并发标记的线程数为 4 -XX:TargetSurvivorRatio=50 \ # 年轻代中幸存对象的目标比例 -XX:G1HeapRegionSize=16m \ # 每个 Region 大小 -Xloggc:gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps \ # GC 日志 -jar YourApplication.jar