jprofiler java应用内存监控、诊断分析

jprofiler不向下兼容,也不向上兼容,7连不上6,6也连不上7,客户端和服务器端的版本号必须一致,分两个维度,cpu热点分析和内存泄漏,打开jprofiler的默认页面时堆内存(Memory Views),用压测工具webbench压http://192.168.2.199:8080/test1/init1.jsp,直到页面里出现导致内存泄漏的方法为止,如下图:
img

是这个方法cn.test.TestBean导致内存泄漏的,定位到问题了,要看是否是这个方法导致内存泄漏,是否是点击img按钮后对象被回收掉,强制执行full gc后感觉没什么变化,看的不明显,点击Mark Current按钮,会多出一列,多出列如下:

img

img

再压http://192.168.2.199:8080/test1/init1.jsp页面,出现如下:
img

看到有红色的,说明实例个数有增加,在Difference里也可以看到增加53%,然后再压,发现实例数一直在增加,从来没有释放过
img

参照上面的实例数或百分比都可以看出来一直在增加,实例数是950000,上面的是690000,Difference也是111%,大于上面的53%,强制进行full gc,即点击img按钮,也没有变化,有的方法在减少,如下图:
img

那么这个方法cn.test.TestBeanclass很有可能造成内存溢出,方法名找到后去看源代码,告诉开发哪里写的不合理,如果不懂代码也可以了,最起码找到哪个方法有问题了,如果怀疑哪个方法有问题,就把这个方法放到Class Tracker里进行单独观察,发现full gc也没有变化,单独把这个方法放到了内存快照img里看,把鼠标放在cn.test.TestBean上面,右键弹出Show Selection In Heap Walker,弹出img

这个过程会比较慢,这个原因是哪个情况造成的都显示的很清楚,在Graph里可以看到如下图:
img

右键,弹出如下图:
img

都可以在红框里面看

尽可能不用jprofiler,因为工具是基于RMI的东西,在连接中会产生大量的对象(要监控,要插桩,要取样),会影响jvm的性能,太耗性能,打点多,拦截多,尽可能不用,要是想用,可以考虑使用jvisualvm,工具都比较耗性能,dump堆内存之后,可以看到如下图:
img

右键cn.test.TestBean,选择第一个Use Selected Instances,选中Allocations,点击OK,弹出如下图:
img

切换到References,点击Show In Graph按钮,展示如下图:
img

通过打开的图表可以得到图形调用关系,如下图:
img

刚才只是定位到了方法,定位到了页面,没有定位到sql语句,好的情况下可以看出是定位到哪个sql语句的调用造成cpu热点消耗很高,定位到最底层的sql语句


参考链接:https://www.cnblogs.com/laosun0204/p/8759896.html

猜你喜欢

转载自blog.csdn.net/a772304419/article/details/126641484
今日推荐