造成OOM的原因

定位OOM
针对第一和第二种情况需要定位OOM,通过dump文件和内存分析根据定位到具体的代码解决。

(1)系统已经挂了:
通过自动生成的堆dump文件定位。
当JVM发生OOM时,自动生成DUMP文件的参数:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${目录}
例如:生成在相对路径aaa目录下面
java -Xms10M -Xmx10M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./aaa -jar xxx.jar
对生成的dump文件,用JVisualVm工具分析,导入文件,查看于业务相关的对象的实例数,占内存的大小,找到gcroot,查看线程,定位到具体的代码。
(2)系统没有挂:dump文件或者jmap命令分析内存
jmap命令生成dump文件:(注意会造成full gc,导致STW)
jmap -dump:format=b,file=outfile 进程id
可以将进程的内存heap输出出来到outfile文件里,再配合MAT(内存分析工具(Memory Analysis Tool)或与jhat (Java Heap Analysis Tool)一起使用,能够以图像的形式直观的展示当前内存是否有问题。JVisualVm.
阿尔萨斯工具(arthas)
打印jvm heap的直方图,但是只答应存活对象的情况,对象的数量、内存大小
jmap -histo:live 进程id
针对第三种情况
运行java程序
java -jar xxx.jar
后台运行
java -jar xxx.jar &
查看进行的内存信息
jmap -heap 进程id
231

被折叠的 条评论
为什么被折叠?



