杭州萧山做网站,注册公司的流程图,电子商务网站建设估算,wordpress模块咋编辑文章目录 一. 相关命令1. 查看进程堆内存整体使用情况#xff1a;OOM的可能2. 统计类的对象数量以及内存占用#xff1a;定位内存泄漏 二. 分析内存占用1. 使用 jhat 排查对象堆占用情况1.1. 排查步骤1.2. 具体分析例子a. 分析频繁创建对象导致的OOM 1.3. OQL查看某一个对象的… 文章目录 一. 相关命令1. 查看进程堆内存整体使用情况OOM的可能2. 统计类的对象数量以及内存占用定位内存泄漏 二. 分析内存占用1. 使用 jhat 排查对象堆占用情况1.1. 排查步骤1.2. 具体分析例子a. 分析频繁创建对象导致的OOM 1.3. OQL查看某一个对象的引用情况 2. 使用jvisualvm3. MAT分析ing 本文讲解如何生成堆存储文件并分析堆文件中异常的大对象及其相关调用链等可以定位出内存泄露、内存溢出等问题。
本文关键词 分析工具jmapjhat、jmapjvisualvm、jmapMAT 分析关键词大对象内存占用整体进程高、对象数量高 一. 相关命令
1. 查看进程堆内存整体使用情况OOM的可能
jmap -heap 8179Attaching to process ID 8179, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.92-b14using thread-local object allocation.
Garbage-First (G1) GC with 18 thread(s)Heap Configuration: #堆内存初始化配置MinHeapFreeRatio 40MaxHeapFreeRatio 70MaxHeapSize 536870912 (512.0MB)NewSize 1363144 (1.2999954223632812MB)MaxNewSize 321912832 (307.0MB)OldSize 5452592 (5.1999969482421875MB)NewRatio 2 #-XX:NewRatio:‘新生代’和‘老生代’的大小比率SurvivorRatio 8 #-XX:SurvivorRatio设置年轻代中Eden区与Survivor区的大小比值MetaspaceSize 21807104 (20.796875MB)CompressedClassSpaceSize 1073741824 (1024.0MB)MaxMetaspaceSize 17592186044415 MBG1HeapRegionSize 1048576 (1.0MB)Heap Usage:
G1 Heap:regions 512capacity 536870912 (512.0MB)used 347981816 (331.86132049560547MB)free 188889096 (180.13867950439453MB)64.81666415929794% used
G1 Young Generation:
Eden Space:regions 265capacity 304087040 (290.0MB)used 277872640 (265.0MB)free 26214400 (25.0MB)91.37931034482759% used
Survivor Space:regions 33capacity 34603008 (33.0MB)used 34603008 (33.0MB)free 0 (0.0MB)100.0% used G1 Old Generation:regions 35capacity 198180864 (189.0MB)used 35506168 (33.86132049560547MB)free 162674696 (155.13867950439453MB)17.916042590267445% used30742 interned Strings occupying 3947896 bytes.这里看到Survivor Space幸存者空间已经被100.0%使用 这可能意味着您的应用程序正在生成大量临时对象并且这些对象在经过年轻代垃圾回收后仍然存活。这种情况可能导致频繁的垃圾回收和性能问题。如下建议 减少临时对象创建尽量减少创建临时对象的次数避免不必要的对象分配。检查对象存活时间确保对象不会在幸存者空间中存活时间过长及时释放不再需要的对象。调整JVM参数如增加幸存者空间的大小通过调整-XX:SurvivorRatio参数以容纳更多的存活对象。 2. 统计类的对象数量以及内存占用定位内存泄漏
## 查看活着的对象
jmap -histo:live 8179 num #instances #bytes class name
----------------------------------------------1: 92285 14964792 [C2: 90345 2168280 java.lang.String3: 57918 1853376 java.util.concurrent.ConcurrentHashMap$Node4: 15970 1758272 java.lang.Class5: 5369 1673712 [B6: 16297 1434136 java.lang.reflect.Method7: 25573 1432088 java.util.LinkedHashMap
...6217: 1 16 sun.util.locale.provider.SPILocaleProviderAdapter
6218: 1 16 sun.util.locale.provider.TimeZoneNameUtility$TimeZoneNameGetter
6219: 1 16 sun.util.resources.LocaleData
6220: 1 16 sun.util.resources.LocaleData$LocaleDataResourceBundleControl
Total 700466 41856208针对每个占用大量内存的对象分析其引用链即它所引用的其他对象和被其他对象引用的情况。这有助于确定对象何时被创建以及是否有引用导致它们不能被垃圾回收。 二. 分析内存占用
1. 使用 jhat 排查对象堆占用情况
1.1. 排查步骤
第一步导出堆文件 jmap -dump:filefile_name pid 第二步分析堆文件
生成文件后执行
jhat heap_dump.hprof
Reading from heap_dump.hprof...
Dump file created Mon Mar 05 18:33:10 CST 2024
Snapshot read, resolving...
Resolving 751016 objects...
Chasing references, expect 150 dots......................................................................................................................................................
Eliminating duplicate references......................................................................................................................................................
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.第三步查看html 访问http://hostname:7000 对于jhat启动后显示的html页面中功能 显示出堆中所包含的所有的类从根集能引用到的对象显示平台包括的所有类的实例数量显示平台外的所有对象信息堆实例的分布表堆直方图执行对象查询语句 一般查看堆异常情况主要看这个两个部分 在页面的最下面中的Other Queries里的两个链接中进入。 Show instance counts for all classes (excluding platform)平台外的所有对象信息。 Show heap histogram 以树状图形式展示堆情况。 1.2. 具体分析例子
a. 分析频繁创建对象导致的OOM 可以看到bson相关有几十万个实例alarmMessage有十几万个实例也就是说alarmMessage被频繁创建。接着分析 bson.document类是mongodb的相关类现在需要排查mongoldb看是否有alarmmessage实体相关的请求挤压。 经查有个接口请求大量数据超过20万条并且请求非常频繁导致内存溢出。修改该接口后问题解决。 1.3. OQL查看某一个对象的引用情况
对于大对象排查内存溢出的可能我们打开OQL窗口看对象中的value是否为null执行如下OQL语句
select u from com.webank.wedatasphere.linkis.common.ServiceInstance u where (u.value null)如果当valuenull时仍然有强引用存在此时gc是不能回收的这样就会出现内存的溢出问题。 如下图我们可以点击查看某个对象可以看到如下成员变量、引用的对象、其他弱引用。 更多关于对象查询语言可参考jhat中的OQL对象查询语言 2. 使用jvisualvm VisualVM能够监控线程内存情况查看方法的CPU时间和内存中的对 象已被GC的对象反向查看分配的堆栈(如100个String对象分别由哪几个对象分配出来的). 官网上关于jvisualvm的用法介绍 在mac控制台下输入
jvisualvm装入快照 分析对象数与堆占用 查看对象被引用的关系 3. MAT分析ing
可参考https://gitcode.csdn.net/65e6e3871a836825ed786d51.html