54 jvm 性能调优

作者: 滔滔逐浪 | 来源:发表于2020-09-12 10:19 被阅读0次

    JVM如何实现参数调优:
    1.Java内存结构(堆、元空间(方法区)、栈、程序计数器、类加载器、本地方法栈等)
    2.可达分析算法 (GCRoot引用链) 三色标记算法

    1. 垃圾回收算法:
      3.1标记清除算法 优点:效率比较高 不需要移动内存地址 缺点:碎片化的问题 老年代
      3.2标记整理算法 优点:避免碎片化问题 缺点:效率比较低 stw 老年代
      3.3标记复制算法 优点:免碎片化问题 效率比标记整理要高。以空间换时间 from/to
      来回的拷贝。新生代
      4.垃圾收集器
      串行/并行/CMS(老年代)/G1(混合收集器)/ZGC
      Stw问题:GC在清理堆内存垃圾的时候,有可能会暂停用户线程,对用户线程带来短暂的卡顿问题。
      标记整理和复制算法,在垃圾过程中,有可能会发生stw问题。
      5.分代算法 新生代和老年代
      注意问题:如果存放是一个大对象的时候,有可能会直接晋升到老年代,如果老年代内存内存不足的情况下,有可能会触发的FullGC。
      新生代和老年代gc一起触发。
    image.png

    GC如何整体评估指标说明
    1.吞吐量 运行用户代码占总时间的比例
    总运行时间:用户线程 程序的运行时间(100s)+GC内存回收的时间 (1s)
    100/101=99% 用户线程占比 16% 堆内存严重不足
    比如程序运行时间100s/内存回收时间 垃圾回收1s 100/101=99%
    2.GC负荷 与吞吐量相反,指应用花在GC上的时间百分比
    总运行时间:程序的运行时间+GC内存回收的时间
    1/101 1%

    3.暂停时间 应用线程花在GC stop-the-world 的时间 暂时时间越小越好
    低延迟/响应时间

    GC收集器那些是吞吐量优先那些事响应时间优先

    4.GC频率 次数 GC频率越多,stw暂停时间越小 GC回收频率越小、stw越大的情况下
    5.反应速度 从一个对象变成垃圾到这个对象被回收的时间

    吞吐量与响应时间优先
    1.吞吐量优先的有那些收集器:Parallel (多线程)并行收集器 Jdk8默认收集器、
    2.响应时间优先有那些收集器:CMS(老年代)/ParNew(新生代)
    响应时间优先(低延迟):注重stw时间越少
    核心理念:注重GC线程清理垃圾时间比较短

    G1/ZGC有注重吞吐量和响应时间优先(低延迟)预估GC线程暂停时间

    如果我们收集器注重吞吐量优先:相当于我们的GC回收频率比较少,GC耗时比较长,
    会导致用户线程stw也会比较长。
    如果我们收集器注重响应时间优先(低延迟):
    GC回收垃圾的时间比较短(用户线程暂停时间比较短),垃圾回收频率次数比较多。

    jvm性能调优
    1,如何避免用户暂停时间STW比较短?
    A, 如何减少GC清理垃圾回收的次数(堆内存一定要充足)
    解决方案:
    A1堆内存空间一定要充足,
    A2,项目启动的时候堆内存初始值和最大值保持一致。
    A3不建议使用 System.gc().
    A4, 不要在堆内存里存放大对象
    A5 合理根据项目堆内存情况,选择收集器。
    2,项目如何合理设置堆的初始大小和合理的垃圾收集器
    串行SeriaIGC/并行收集器Parallel/CMS(老年代)/G1混合收集器/ZGC
    适用于起步阶段的个人网站 建议堆内存 1gb 可以使用串行SeriaIGC 建议使用并行 ParallelGC。
    有一定访问量的网站或者app 建议堆内存设置为2gb 建议使用并行 ParallelGC。
    并发适中的APp 或者普通的数据处理 建议堆内存4gb 老年代cms/新生代parnew
    适应于并发量高的app 建议使用堆内存 8g 或者16g 建议使用G1收集器 注重低延迟和吞吐量
    评估参考腾讯云服务器架构:

    <u>https://buy.cloud.tencent.com/cvm?tab=lite</u>

    JVM实战参数性能调优。
    1.查看垃圾回收清理垃圾的频率 jstat
    2.排查生产环境内存溢出问题
    3.使用jvisualvm 监听生产环境虚拟机堆内存情况

    JVM参数参数调优
    垃圾回收统计次数
    jstat -gc 397116

    S0C:第一个幸存区的大小
    S1C:第二个幸存区的大小
    S0U:第一个幸存区的使用大小
    S1U:第二个幸存区的使用大小
    EC:伊甸园区的大小
    EU:伊甸园区的使用大小
    OC:老年代大小
    OU:老年代使用大小
    MC:方法区大小
    MU:方法区使用大小
    CCSC:压缩类空间大小
    CCSU:压缩类空间使用大小
    YGC:年轻代垃圾回收次数
    YGCT:年轻代垃圾回收消耗时间
    FGC:老年代垃圾回收次数
    FGCT:老年代垃圾回收消耗时间
    GCT:垃圾回收消耗总时间

    jstat -gcutil 397116--总结垃圾回收统计

    S0:幸存1区当前使用比例
    S1:幸存2区当前使用比例
    E:伊甸园区使用比例
    O:老年代使用比例
    M:元数据区使用比例
    CCS:压缩使用比例
    YGC:年轻代垃圾回收次数
    FGC:老年代垃圾回收次数
    FGCT:老年代垃圾回收消耗时间
    GCT:垃圾回收消耗总时间

    如何真正排查生产环境内存泄漏问题

    内存泄漏:申请内存后,堆内存一直不释放。
    内存溢出:申请内存前,内存不足。

    没有任何工具能够直接定位到那段代码发生内存泄漏问题。
    通过工具判断 那些类定义在堆内存中一直没有被释放。

    HashMap 根据对象定义key 一定重写equals和HashCode方法。

    Java 进程与进程使用rmi技术
    Dump文件

    分析堆内存溢出

    双击:E:\java8\jdk\bin\jvisualvm.exe

    image.png image.png

    服务器端同理

    分析堆内存溢出:

    jmap -dump:live,format=b,file=mayiktmapheap.dump 408416 生成dump日志文件 导入到jvisualvm分析即可。

    image.png

    相关文章

      网友评论

        本文标题:54 jvm 性能调优

        本文链接:https://www.haomeiwen.com/subject/mpxwektx.html