如何用jstat快速监控JAVA程序内存溢出?

摘要:4种查看java对象所占内存大小的方法

计算java对象所占内存大小

1.使用jdk8自带API

使用这种jdk8方式时,Open JDK 不是天然支持的,需要设置一下环境变量

结果如下:

2. 借助org.apache.lucene工具类

当一个对象有多个属性,需要计算整个对象的大小时,可以借助org.apache.lucene工具类

先引入maven坐标

测试代码:


结果如下:

3. 借助jol工具类

如果需要查看某个对象的详细内存分布,可以借助jol工具类,不过这种当对象中内嵌其他对象时,只能计算ClassLayout方法中这个object对象所占内存的大小

先导入maven坐标

测试代码:

结果如下:

4.java对象内存分布

最后,计算一个对象占用多大内存,需要提前了解java对象的布局。

本文分享自华为云社区《查看java对象所占内存大小-云社区-华为云》,作者:xiewenci。




Java虚拟机统计监控工具jstat(Java Virtual Machine statistics monitoring tool)。

首先,我们得明确一下jstat的作用:对JVM进行统计监控,并且是实时的。那么监控java虚拟机的哪些数据呢?

我们先看看jstat是如何使用的,linux下执行:

jstat -help

jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

再看看有哪些options:

jstat -options

举例说明之(其他参数大家可以自己实际练习看看都输出哪些数据):

jstat -gc -t -h10 27691 2000 10

看这一大堆数字,烦不烦?恶不恶心?有看下去的心情吗?通过这些数据来快速分析内存泄漏问题能快速起来吗?

上面是对jstat的一个的基本介绍,大家应该可以看出来,想通过jstat去监控内存健康状态是没问题的,但是也得清楚的了解JVM的相关知识,要搞清楚年轻代、永久代、YGC、FGC,并根据这些数据来判断是否有内存泄漏的问题或者风险。

然而,它并不快,线上出问题了经不起你这么折腾的,所以这里个人认为jstat可以当做一个监控&预警工具,而不是问题排查工具去使用。(大家有不同的意见可以评论区交流讨论~)

这里,我建议的方法是:

  1. 如果你觉得你的应用有内存泄漏的问题,那么千万别重启或者停止应用,要保留第一现场(这是第一步,第一步没有了就等下一次内存泄漏吧~可以考虑通过slb把这台机器摘掉,避免影响用户)

  2. 用java自带的工具jmap dump现场文件: jmap -dump:format=b,file=heap.bin <pid>

  3. 用MAT工具分析heap dump文件,现场文件拿到手了,剩下的就是学会使用MAT分析文件了,其实也不用你分析,需要做的事情MAT都帮你做好了,通过MAT即可分析出吃内存的对象是什么了,这样就可以定位到内存泄漏的问题了。

以上,是我对java内存泄漏问题定位的个人认识,欢迎大家积极讨论学习,共同成长~

展开阅读全文

页面更新:2024-05-13

标签:华为   内存   快速   坐标   虚拟机   内存大小   对象   现场   代码   文件   测试   工具   程序   方法   数据   财经   社区

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top