首页 > 其他分享 >jvm调优的案例-自编

jvm调优的案例-自编

时间:2024-05-23 22:29:00浏览次数:18  
标签:jvm 查看 自编 调优 GC 内存 JVM chunk FGC

一、优化目标

  1. 通常来说,我们的 JVM 参数配置大多还是会遵循 JVM 官方的建议,例如:

    -XX:NewRatio=2,年轻代:老年代=1:2

    -XX:SurvivorRatio=8,eden:survivor=8:1

    堆内存设置为物理内存的3/4左右

  2. JVM 有哪些核心指标?合理范围应该是多少?

    jvm.gc.time:每分钟的GC耗时在1s以内,500ms以内尤佳

    jvm.gc.meantime:每次YGC耗时在100ms以内,50ms以内尤佳

    jvm.fullgc.count:FGC最多几小时1次,1天不到1次尤佳

    jvm.fullgc.time:每次FGC耗时在1s以内,500ms以内尤佳

  3.  JVM 优化步骤

    1)CPU指标
    
    查看占用CPU最多的进程
    
    查看占用CPU最多的线程
    
    查看线程堆栈快照信息
    
    分析代码执行热点
    
    查看哪个代码占用CPU执行时间最长
    
    查看每个方法占用CPU时间比例
    
    
    2)JVM 内存指标
    
    查看当前 JVM 堆内存参数配置是否合理
    
    查看堆中对象的统计信息
    
    查看堆存储快照,分析内存的占用情况
    
    查看堆各区域的内存增长是否正常
    
    查看是哪个区域导致的GC
    
    查看GC后能否正常回收到内存
    3)JVM GC指标 查看每分钟GC时间是否正常 查看每分钟YGC次数是否正常 查看FGC次数是否正常 查看单次FGC时间是否正常 查看单次GC各阶段详细耗时,找到耗时严重的阶段 查看对象的动态晋升年龄是否正常

    面试官:如何进行 JVM 调优(附真实案例)

二、调优案例:metaspace导致频繁FGC问题

服务环境:ParNew + CMS + JDK8

问题现象:服务频繁出现FGC

1)首先查看GC日志,发现出现FGC的原因是metaspace空间不够
2)进一步查看日志发现元空间存在内存碎片化现象 
为什么内存碎片化的原因:内存存在碎片化现象就是根据 used 和 capacity 的数据得来的,上面说了元空间的分配以 chunk 为单位,即使一个 ClassLoader 只加载1个类,也会独占整个 chunk,所以当出现 used 和 capacity 两者之差较大的时候,说明此时存在内存碎片化的情况。元空间的分配以 chunk 为单位,当一个 ClassLoader 被垃圾回收时,所有属于它的空间(chunk)被释放,此时该 chunk 称为 Free Chunk,而 committed chunk 就是 capacity chunk 和 free chunk 之和。

Metaspace       used 35337K, capacity 56242K, committed 56320K, reserved 1099776K


这边简单解释下这几个参数的意义

used :已使用的空间大小

capacity:当前已经分配且未释放的空间容量大小

committed:当前已经分配的空间大小

reserved:预留的空间大小

3)通过 dump 堆存储文件发现存在大量 DelegatingClassLoader

通过进一步分析,发现是由于反射导致创建大量 DelegatingClassLoader。其核心原理如下:

在 JVM 上,最初是通过 JNI 调用来实现方法的反射调用,当 JVM 注意到通过反射经常访问某个方法时,它将生成字节码来执行相同的操作,称为膨胀(inflation)机制。如果使用字节码的方式,则会为该方法生成一个 DelegatingClassLoader,如果存在大量方法经常反射调用,则会导致创建大量 DelegatingClassLoader。

反射调用频次达到多少才会从 JNI 转字节码?

默认是15次,可通过参数 -Dsun.reflect.inflationThreshold 进行控制,在小于该次数时会使用 JNI 的方式对方法进行调用,如果调用次数超过该次数就会使用字节码的方式生成方法调用。

分析结论:反射调用导致创建大量 DelegatingClassLoader,占用了较大的元空间内存,同时存在内存碎片化现象,导致元空间利用率不高,从而较快达到阈值,触发 FGC。

优化策略:

1)适当调大 metaspace 的空间大小。

2)优化不合理的反射调用。例如最常见的属性拷贝工具类 BeanUtils.copyProperties 可以使用 mapstruct 替换。

三、

标签:jvm,查看,自编,调优,GC,内存,JVM,chunk,FGC
From: https://www.cnblogs.com/itqinls/p/18209502

相关文章

  • 常用JVM虚拟机参数说明
    常用JVM虚拟机参数说明原文地址:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html非标准选项参数说明-Xcomp强制JVM虚拟机在方法第一次被调用的时候就进行本地编译。-Xint强制JVM运行在解释模式。在该模式下,方法不会被编译为本地代码,所有的字节码......
  • R语言电影数据分析:随机森林探索电影受欢迎程度因素、参数调优可视化
    全文链接:https://tecdat.cn/?p=34495原文出处:拓端数据部落公众号是什么让一个电影受欢迎?也许是影片的总收入(影院条目和DVDsellings)。我们选择的变量将是票房(gross)或观众评分(movie_facebook_likes)。众所周知,关于IMDB和番茄的好评与高收益的电影有关。我们的分析旨在回答以下研......
  • 听说你是高手?说说你的 JVM调优方法论 吧?(美团面试,问的贼细)
    文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面试必备+大厂必备+涨薪必备免费赠送:《尼恩技术圣经+高并发系列PDF》,帮你实现技术自由,完成职业升级,薪......
  • [转帖]JVM内存配置最佳实践
     https://help.aliyun.com/zh/sae/use-cases/best-practices-for-jvm-heap-size-configuration   如果JVM堆空间大小设置过大,可能会导致Linux系统的OOMKiller被激活,进而结束(kill)Java应用进程,在容器环境下可能会表现为频繁异常重启。本文介绍在容器环境下JVM......
  • java代码的各个部分 在jvm里面分别对应什么区
    在 Java 中,代码和数据在 JVM(Java虚拟机)中的存储是分区管理的。这些区域各自承担不同的角色,以支持 Java 程序的运行。以下是 JVM 中主要的内存区域,以及它们与 Java 代码和数据的对应关系: 1. 方法区(Method Area) 存储内容:类信息、常量、静态变量、即时编译器编译后......
  • JVM-part-运行时数据区
    运行时数据区组成部分:程序计数器(PC寄存器ProgramCounterRegister)Java虚拟机栈(JavaVirtualMachineStacks)本地方法栈(NativeMethodStack)堆(Heap)方法区(MethodArea)其中存在线程共享和线程不共享的区域,如下:线程共享:堆、栈线程不共享:每一个线程都有的,程序计数器、本地......
  • 在Linux中,如何进行数据库性能调优?
    在Linux中进行数据库性能调优是一个复杂但重要的任务,它涉及到多个方面,包括硬件、配置、查询优化、索引优化等。以下是一些建议的步骤和策略,帮助你进行数据库性能调优:1.硬件优化磁盘:使用SSD(固态硬盘)替代HDD(机械硬盘),以提高I/O性能。将数据库文件和日志文件放置在不同的物理磁......
  • 在Linux中,如何进行Java应用性能调优?
    在Linux环境中进行Java应用程序的性能调优是一个多步骤的过程,涉及到监控、分析和调整多个层面的配置。以下是进行Java应用性能调优的一些关键步骤和策略:1.监控和分析工具的使用JVM监控工具:利用jstat,jmap,jstack,和jconsole等JDK自带的工具,以及更高级的工具如VisualVM、JP......
  • 在Linux中,如何进行系统调优和应用调优?
    在Linux系统中进行系统调优和应用调优是一个涉及多个方面的复杂过程,旨在提高系统的性能、稳定性和响应速度。以下是一些关键的调优步骤和策略:1.系统调优监控系统性能:使用工具如top、htop、vmstat、iostat和mpstat监控CPU、内存、磁盘和网络的使用情况。调整内核参数:编辑......
  • k8s 调优 参数优化
    这些参数是Kubernetes(K8s)中的一些配置选项,用于控制不同的行为和功能。让我逐个解释它们:--feature-gates=RotateKubeletClientCertificate=true,RotateKubeletServerCertificate=true:这个参数用于启用或禁用一些实验性的功能。在这里,启用了两个功能:RotateKubeletClientCertif......