如何用jstat快速监控JAVA程序内存溢出?
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可以当做一个监控&预警工具,而不是问题排查工具去使用。(大家有不同的意见可以评论区交流讨论~)
这里,我建议的方法是:
如果你觉得你的应用有内存泄漏的问题,那么千万别重启或者停止应用,要保留第一现场(这是第一步,第一步没有了就等下一次内存泄漏吧~可以考虑通过slb把这台机器摘掉,避免影响用户)
用java自带的工具jmap dump现场文件: jmap -dump:format=b,file=heap.bin <pid>
用MAT工具分析heap dump文件,现场文件拿到手了,剩下的就是学会使用MAT分析文件了,其实也不用你分析,需要做的事情MAT都帮你做好了,通过MAT即可分析出吃内存的对象是什么了,这样就可以定位到内存泄漏的问题了。
以上,是我对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。
如何合理的规划一次jvm性能调优?
谢邀!
首先,所有的调优或优化都要有一个目的指标,也就是现在是什么样,要达到什么样,不能为了调优而调优!
其次,在有目标指标参数后,可以通过一些命令如jstat、jinfo等查看一些参数及JVM信息,确认这些配置参数后,可以获取JVM的堆转储快照文件,即dump文件,通过编辑器查看分析日志信息或一些可视化工具来分析性能的瓶颈,通过分析得出一些可能需要调整的参数,如堆大小、垃圾收集器参数,调整这么参数,观察运行情况,或再次分析dump文件。
希望对你有所帮助!
堆大小设置
JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制;系统的可用虚拟内存限制;系统的可用物理内存限制。32位系统下,一般限制在1.5G~2G;64为操作系统对内存无限制。我在Windows Server 2003 系统,3.5G物理内存,JDK5.0下测试,最大可设置为1478m。
性能调优是一个循序渐进的过程,要根据服务器配置,程序运行指标来优化。
比如java程序的cpu和内存,吞吐量这些指标,服务器的总体运行状态等
这些可以用工具,比如wgcloud监控系统
wgcloud可以把这些都监控起来,然后根据数据做分析,这样调优就清晰了。
只讲一个方法,做AB实验,线上JVM调优的时候,例如CMS,G1等垃圾回收器的AB实验对比,堆大小,元数据区大小的AB实验对比,把其列成一些启动参数列表,然后用同一个代码进行线上实验,看线上实际的YGC,FGC的效果,然后再整合最好的参数进行二次实验。而不是天天看书看参数,觉得有用的点个赞。
还没有评论,来说两句吧...