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