登录
  • 欢迎访问悠扬的技术博客,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站😉

jvm内存溢出溯源

Java 悠扬 349次浏览 已收录 1个评论

1.先上神器

jvm内存溢出溯源

2.远程监控配置

JProfile是一款性能瓶颈分析工具,具体要干啥呢下面看

1:创建一个监控任务 jvm内存溢出溯源

2:选择tomcat版本 jvm内存溢出溯源

3:监控远程服务器 jvm内存溢出溯源

 4:选择oracle 1.5.0 jvm内存溢出溯源jvm内存溢出溯源

 5:填写需要监控的服务器地址 jvm内存溢出溯源

 6:填写待监控的服务器下的tomcat/bin目录地址 jvm内存溢出溯源

 7:startup.sh 路径 jvm内存溢出溯源

8:端口默认8849 jvm内存溢出溯源

 9:选择稍后启动客户端,会把刚刚的操作保存下来暂时不启动 jvm内存溢出溯源

 10:之后会在你的目录下生成一个startup_jprofiler.sh 文件

 jvm内存溢出溯源

 11:将startup_jprofiler.sh 文件 拷贝到tomcat的bin目录下

 jvm内存溢出溯源

 12:启动这个脚本 ./startup_jprofiler.sh ,看到下面这个命令就是启动成功了,正在等待连接你本地的客户端

 jvm内存溢出溯源

 13:修改一下我们的客户端配置

 jvm内存溢出溯源

jvm内存溢出溯源

 14:将keep VMalive勾选上,否则会报错 jvm内存溢出溯源

 15:启动客户端,可以看到正在监控服务器 jvm内存溢出溯源jvm内存溢出溯源

3.演示内存溢出场景,及工具使用

代码仓库地址:https://gitee.com/zsiyang/jvm_test.git

虚拟机参数设置如下:(演示用)

-Xms500m -Xmx500m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=C:\Users\pc-3356\Desktop\sql

jvm内存溢出溯源

  • 选择Live memory菜单查看当前jvm加载类对象
  • 工具栏选择 Mark Current 查看实时增长

    为了便于比较内存的增长情况,可以点击”Mark Current”按钮,来将当前内存使用情况作为参照,点击后会显示“Difference”列,该列会列出对象数量的变化和变化比率;

jvm内存溢出溯源

然后我们发起http请求模拟内存溢出

GET http://localhost:8080/test/jvm
  • 现在观察Live memory 和Telemetries  查看内存及类增长进行分析

 

jvm内存溢出溯源jvm内存溢出溯源jvm内存溢出溯源

利用对象视图找出内存泄漏原因

大多数的内存泄漏可以被追溯到对象集群。这将产生一些大的retained size的对象。最大的对象视图列出了带有最大retained size的对象。你可以利用该树形向下钻取从而发现错误引用。

jvm内存溢出溯源

使用参考图找到内存泄漏的原因

找出内存泄漏的核心工具是堆遍历器中的参考图。依次打开传入引用,你可能会立即发现一个错误引用。在复杂的系统中,这往往是不可能的。在这种情况下,你必须要找到一个或多个”garbage collector roots”。Garbage collector roots是JVM中的点,不受垃圾回收机制的约束。当你选择了传入引用或图形中的一个对象时,顶部的[Show path to GC root] 按钮被启用。

jvm内存溢出溯源

garbage collector roots非常多,若全部显示它们,可能会造成大量堆积,如图所示。此外,查找garbage collector roots也很耗时。 如果找到成千上万的roots,计算的时间很长而且会占用大量内存。为了防止这些问题,最好开始时从单个garbage collector root 开始查找,然后根据利用 UP to roots 根据需要慢慢增加garbage collector root。

jvm内存溢出溯源

garbage collector root 的链条可以很长,如图所示:

jvm内存溢出溯源

使用cumulated references views以查找内存泄漏的原因

在某些情况下,您可能无法成功地缩小对象设置的规模。你的对象集中可能仍包含了大量的实例或者在此情况下,使用参考图不可能会提供任何见解。这时,堆遍历器的引用视图中的 the cumulated reference tables 就可排上用场了。cumulated incoming reference table显示了当前对象集中所有可能的引用类型:

从引用类型中,你就可以缩小对象集。例如,您可能知道那些引用类型是正常的,那些是不正常的。

jvm内存溢出溯源

 

 

版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明jvm内存溢出溯源
喜欢 (1)
支付宝[]
分享 (0)
悠扬
关于作者:
10年以上工作经验,从事2年微服务架构搭建工作,有大数据处理相关工作经验,使用spring全家桶包括:Spring,SpringBoot,SpringCloud 数据层组件服务使用SpringDataJpa,Mybatis以及其他第三方组件Sharding-JDBC,Sharding-Proxy分库分表。熟悉微服务,服务降级,限流,分流,做过项目源码修改,有cat,apollo,nacos使用经验,有Lostash,Elasticsearch,kibana,mysqlMHA生产实践经验,使用开源代码Apache Sarding项目,修改源码支持mysql分库分表使用年月日小时分库分表,docker做集群服务,Jekins做项目发布,GitLab做项目管理,使用docker容器部署,熟悉消息队列RabbitMQ,Kafka,ActiveMQ。RuoYi-Vue-Atomikos项目开源加入生态圈组件,项目支持分布式事务,界面添加多数据源,数据源动态配置,切面切换,多数据源事务支持,支持区域数据源配置,用于区域数据切分,数据层次分库。项目地址:https://gitee.com/zsiyang/ruoyi-vue-atomikos
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(1)个小伙伴在吐槽
  1. test签到成功!签到时间:2021-04-13 18:17:18,每日打卡,生活更精彩哦~
    test2021-04-13 18:17 回复