内存泄漏及排查
2018-09-27 本文已影响0人
萌妈码码
虽然OutOfMemoryError通常都是内存泄漏的信号,但是也有可能应用程序确实正在使用这么多的内存;对于后者,或者必须增加JVM可用的堆的大小,或者对应用程序进行某种更改,使它使用较少的内存。但是,在许多情况下,OutOfMemoryError都是内存泄漏的信号。一种查明方法是不间断地监控GC的活动,确定内存使用量是否随着时间增加。如果确实如此,就可能发生了内存泄漏。
怎么排查内存泄漏
- 用
jstat来查看GC信息。
jstat -gc pid
可以显示gc的信息,查看gc的次数,及时间。
其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。
jstat还有很多其他的参数,可以用来查看每个代的信息,加载的类信息,以及所占的空间等。
- 用
jmap来查看存活的对象情况,或许可以发现一些问题,比如某个类对象的实例特别多,或者Map中Entry特别多等。
jmap -histo:live [pid]
- 还有一些其他的工具辅助查看运行中JVM的指定方法的调用堆栈信息。如BTrace等。有空可以研究一下。
什么情况下会发生内存泄漏
如果长生命周期的对象持有短生命周期的引用,就很可能会出现内存泄漏。