@joshsulin
2017-07-05T11:09:54.000000Z
字数 933
阅读 1441
java
一、定位问题(监控或者日志)
日志: java.lang.OutOfMemoryError: Java heap space

通过听云监控, 该项目非常不稳定。通过线上服务器日志查看, 报内存溢出, 初步判断就是内存溢出引起的服务奔溃。
二、工具验证, 是否内存占满?
1、引入工具 jstat
- jstat的用法
- 用以判断JVM是否存在内存问题呢?如何判断JVM垃圾回收是否正常?一般的top指令基本上满足不了这样的需求,因为它主要监控的是总体的系统资源,很难定位到java应用程序。
- Jstat是JDK自带的一个轻量级小工具。全称“Java Virtual Machine statistics monitoring tool”,它位于java的bin目录下,主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控。可见,Jstat是轻量级的、专门针对JVM的工具,非常适用。由于JVM内存设置较大,图中百分比变化不太明显
- 一个极强的监视VM内存工具。可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量。jstat工具特别强大,有众多的可选项,详细查看堆内各个部分的使用量,以及加载类的数量。使用时,需加上查看进程的进程id,和所选参数。
具体的看网上资料: http://www.51testing.com/html/92/77492-203728.html
2、执行命令查看(证明内存溢出)
>* jstat -gcutil 12743 1000 1000
![此处输入图片的描述][2]
要明确看懂这个数据, 需要对JVM内存分区及GC细节清楚, 初步扫肓可以参考: http://fredlong.iteye.com/blog/1746714
初步判断是否存在问题, 如果 S0、S1、E 都达到100左右了, 那肯定是内存溢出了。
接下来, 我们需要查明内存里存的内容是什么?
3、引入工具 jmap
>* 得到运行java程序的内存分配的详细情况。例如实例个数,大小等
>* 运行命令: jmap -histo:live 37994
当时发现某一个自定义对象占用内存非常多, 其实只要发现我们自己写的类占用内存非常多时,往往就是我们代码的问题。
