Java教程

性能问题之内存泄露

本文主要是介绍性能问题之内存泄露,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
现象
  • tps出现大幅波动,并慢慢降低,甚至降为0,响应时间随之波动,慢慢升高
  • 通过jstat命令看到,JVM中old区不断增加,FullGC非常频繁,对应的FGC消耗的时间也不断增加
  • 通过jconsole、jvisualvm可以看到,堆内存曲线不断上升看,接近上限时,变成一条直线
  • 应用程序日志报错:  java.lang.OutOfMemoryError: Java heap space
  问题定位   1、通过jmap命令,jmap -histo pid | head -20 ,查看当前堆内存中实例数和占用内存最多的前20个对象   2、通过jvisualvm,进行远程dump,然后把dump文件下载下来,用jvisualvm打开进行分析,可以更直观的看到JVM中对象的信息       案例 为了方便看到现象,直接用jmeter在本地进行测试,10个线程并发,运行10分钟。(备注:测试之前先将应用程序最大堆内存和最小堆内存设置成150M,便于快速出现内存溢出的情况)   1、测试过程中用Jvisualvm监控JVM如下图

图中可以看到,堆内存使用率越来越高,至于100%使用;同时CPU使用率基本与垃圾回收占用CPU使用率是一致的。

 

2、通过jmeter插件Transactions per Second可以直观查看TPS的变化情况。从下图中可以清楚地看出,接近低第4分钟的时候,TPS已经基本降为0

 

3、根据上面两个现场我们可以明确内存已经满了,现在我们就要去看下占用内存较大的对象有哪些

如下图,点击jvisualvm监视tab页右上角的“堆dump”按钮,进行远程dump;然后将dump文件下载下来。

 

4、用jvisualvm将dump文件打开,分析实例数和现在我们就要去看下占用内存大的对象

在jvisualvm中,点击文件->装入,选择下载下来的dump文件。

如下图,可以分析实例信息和对象信息了。

 

总结

什么样的场景下监控内存泄露问题? 1、在试压阶段,或者任意场景都可以考虑通过jvisualvm和jstat监控jvm的情况 2、在稳定性场景中,一定要关注JVM内存使用的情况,在长时间的压测下,最容易看出内存泄露的问题
这篇关于性能问题之内存泄露的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!