[转帖]JVM调优汇总(JDK1.8)

jvm,汇总,jdk1 · 浏览次数 : 0

小编点评

**1. 优先调整堆的大小让服务器自己来选择** **2. 如果内存小于100M,使用串行收集器** **3. 如果是单核,并且没有停顿时间的要求,串行或JVM自己选择** **4. 如果允许停顿时间超过1秒,选择并行或者JVM自己选** **5. 如果响应时间最重要,并且不能超过1秒,使用并发收集器** **6. 4G以下可以用parallel,4-8G可以用ParNew+CMS,8G以上可以用G1,几百级以上用ZGC** **7. G1垃圾收集器优化建议** * 在保证他的年轻代gc别太频繁的同时,还得考虑每次gc过后的存活对象有多少,避免存活对象太多快速进入老年代,频繁触发mixed gc。 *设置 -XX:MaxGCPauseMills 值为50ms,假设50ms能够回收三到四个G内存,然后50ms的卡顿其实完全能够接受,用户几乎无感知,那么整个系统就可以在卡顿几乎无感知的情况下一边处理业务一边收集垃圾。

正文

JVM调优汇总

1、根据实际情况选择合适垃圾收集器

堆内存4G一下可以用parallel,4-8G可以用ParNew + CMS,8G以上可以用G1,几百级以上用ZGC。

2、jvm参数的初始值和最大值设置一样,避免扩容时消耗性能。

‐Xms3072M ‐Xmx3072M  ‐XX:MetaspaceSize=256M‐XX:MaxMetaspaceSize=256M

3、JVM调优目的:减少GC,主要是减少FullGC的频率

优化思路:

  1. 尽可能让对象都在新生代里分配和回收,尽可能别让太多对象频繁进入老年代,避免频繁对老年代进行垃圾回收,同时给系统充足的内存大小,避免新生代频繁进行垃圾回收。
  2. 尽量让每次Young GC后的存活对象小于Survivor区域的50%,都留在年轻代中,避免对象动态年龄判定的触发。尽量别让对象进入老年代,减少FullGC频率,避免频繁fullGC对性能影响。(FullGC时间长,会STW)。
  3. 元空间的大小参数必须要设置,默认是21m,但是它会自动扩容,元空间满了也会触发fullGC,所以一开始就设置好,避免扩容和触发FullGC。
  4. 参数设置:默认老年代:年轻代是2:1,可以调整为1:1或者1:2,eden区和s0、s1默认是8:1:1,可以调整为6:1:1,就是为了扩大年轻代的空间,避免触发对象动态年龄判定机制,尽量避免对象进入老年代,触发FullGC,也可以减少minorGC的频率。

怎么选择垃圾收集器

        1. 优先调整堆的大小让服务器自己来选择

        2. 如果内存小于100M,使用串行收集器

        3. 如果是单核,并且没有停顿时间的要求,串行或JVM自己选择

        4. 如果允许停顿时间超过1秒,选择并行或者JVM自己选

        5. 如果响应时间最重要,并且不能超过1秒,使用并发收集器

        6. 4G以下可以用parallel,4-8G可以用ParNew+CMS,8G以上可以用G1,几百G以上用ZGC

下图有连线的可以搭配使用

        JDK 1.8默认使用 Parallel(年轻代和老年代都是)

        JDK 1.9默认使用 G1

为什么大内存要用G1

  1. 如果堆内存达到了几十个G以上,那么用cms、parNew这些收集器,垃圾回收的时间会很长,想STW时间也会很长,用户体验很差。
  2. G1是可以调整停顿时间的,去优先收集部分垃圾对象,并不是一次回收所有的垃圾,那这样用户体验就会很好。
  3. 但是G1不太适用于小内存,因为内存小,回收速度会很快,G1它只回收部分的垃圾,性价比就不如cms这些了,只有在大内存时才能体现它的价值。

G1垃圾收集器优化建议

        假设参数 -XX:MaxGCPauseMills 设置的值很大,导致系统运行很久,年轻代可能都占用了堆内存的60%了,此时才 触发年轻代gc。 那么存活下来的对象可能就会很多,此时就会导致Survivor区域放不下那么多的对象,就会进入老年代中。

        或者是你年轻代gc过后,存活下来的对象过多,导致进入Survivor区域后触发了动态年龄判定规则,达到了Survivor 区域的50%,也会快速导致一些对象进入老年代中。

        所以这里核心还是在于调节 -XX:MaxGCPauseMills 这个参数的值,在保证他的年轻代gc别太频繁的同时,还得考虑 每次gc过后的存活对象有多少,避免存活对象太多快速进入老年代,频繁触发mixed gc.

什么场景适合使用G1

        1. 50%以上的堆被存活对象占用  

        2. 对象分配和晋升的速度变化非常大

        3. 垃圾回收时间特别长,超过1秒

        4. 8GB以上的堆内存(建议值)

        5. 停顿时间是500ms以内

每秒几十万并发的系统如何优化JVM

        Kafka类似的支撑高并发消息系统大家肯定不陌生,对于kafka来说,每秒处理几万甚至几十万消息时很正常的,一般 来说部署kafka需要用大内存机器(比如64G),也就是说可以给年轻代分配个三四十G的内存用来支撑高并发处理,这里就 涉及到一个问题了,我们以前常说的对于eden区的young gc是很快的,这种情况下它的执行还会很快吗?很显然,不可能,因为内存太大,处理还是要花不少时间的,假设三四十G内存回收可能最快也要几秒钟,按kafka这个并发量放满三 四十G的eden区可能也就一两分钟吧,那么意味着整个系统每运行一两分钟就会因为young gc卡顿几秒钟没法处理新消 息,显然是不行的。那么对于这种情况如何优化了,我们可以使用G1收集器,设置 -XX:MaxGCPauseMills 为50ms,假 设50ms能够回收三到四个G内存,然后50ms的卡顿其实完全能够接受,用户几乎无感知,那么整个系统就可以在卡顿几 乎无感知的情况下一边处理业务一边收集垃圾。

        G1天生就适合这种大内存机器的JVM运行,可以比较完美的解决大内存垃圾回收时间过长的问题。

文章知识点与官方知识档案匹配,可进一步学习相关知识
Java技能树首页概览97715 人正在系统学习中

与[转帖]JVM调优汇总(JDK1.8)相似的内容:

[转帖]JVM调优汇总(JDK1.8)

JVM调优汇总 1、根据实际情况选择合适垃圾收集器 堆内存4G一下可以用parallel,4-8G可以用ParNew + CMS,8G以上可以用G1,几百级以上用ZGC。 2、jvm参数的初始值和最大值设置一样,避免扩容时消耗性能。 ‐Xms3072M ‐Xmx3072M ‐XX:Metaspace

[转帖]JVM调优常用命令(jstat、jmap、jstack)

原文:https://www.cnblogs.com/ityouknow/p/5714703.html 一、jstat jstat(JVM statistics Monitoring)是用于监视虚拟机运行时状态信息的命令,它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。 命令

[转帖]JVM 调优之 Reserved Code Cache Size

https://www.modb.pro/db/251381 01 现象 社区小伙伴最近在为 Kylin 4 开发 Soft Affinity + Local Cache 的性能测试过程中,遇到了压测场景下查询响应时间不稳定问题, RT 随着时间变化较大,现象如下: 同样的 SQL (只是参数不同)

[转帖]JVM性能调优监控工具

原文 https://www.cnblogs.com/haiyang1985/p/7654654.html 摘要: JDK自己提供了不少方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps、jstack、jmap、jhat、jstat、hprof等小巧的工具,本

[转帖]高并发场景下JVM调优实践之路

https://www.jianshu.com/p/f5f5f99e2417 一、背景 2021年2月,收到反馈,视频APP某核心接口高峰期响应慢,影响用户体验。 通过监控发现,接口响应慢主要是P99耗时高引起的,怀疑与该服务的GC有关,该服务典型的一个实例GC表现如下图: image image

[转帖]JVM常用命令和性能调优建议 [Could not create the Java virtual machine]

https://blog.51cto.com/u_6215974/4938440 一、查看jvm常用命令 jinfo:可以输出并修改运行时的java 进程的opts。 jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。 jstat:一

[转帖]JVM系列之:GC调优基础以及初识jstat命令

本文为《深入学习 JVM 系列》第二十二篇文章 影响垃圾收集性能有三个主要的属性,垃圾收集调优又有三个基本原则,以及垃圾收集调优时需要采集的信息。如果想要对垃圾收集进行调优,则需要根据实际场景对不同属性做出取舍,理解调优的原则以及收集什么信息。 性能属性 吞吐量 吞吐量是评价垃圾收集器能力的重要指标

[转帖]第七篇:双管齐下,JVM内部优化与JVM性能调优

文章目录 一、前言二、编译时优化2.1 Javac编译器2.2 Java语法糖2.2.1 泛型和泛型擦除2.2.2 自动装箱、自动拆箱、遍历循环2.2.3 条件编译 三、运行时优化(核心:JIT编译器/即时编译器)3.1 HotSpot虚拟机内的JIT编译器3.1.1 编译器和解释器并存的架构3.1

[转帖]小知识点 之 JVM -XX:MaxGCPauseMillis 与 -XX:GCTimeRatio

https://www.cnblogs.com/hellxz/p/14056403.html 写在前边 JVM调优更多是针对不同应用类型及目标进行的调整,往往有很大的实验成份,通过实验来针对当前应用设置相对合适的参数,提高应用程序的性能与稳定性 最近在复习JVM,Parallel Scavenage

[转帖]性能优化 YYDS - Brendan Gregg 与 Intel.com 的故事

https://www.modb.pro/db/421309 译者序 金庸笔下的《鹿鼎记》有: !! 平生不识陈近南,便称英雄也枉然 现代的认真搞技术的后端程序员,应该也有一句: !! 平生不识 Brendan Gregg,便呆 BAT 也 SoSo 从 2016 年开始,做一个 JVM 调优开始,