OOM(OutOfMemoryError) 问题归根结底三点原因:
本身资源不够
申请的内存太多
资源耗尽
解决思路,换成Java服务分析,三个原因也可以解读为:
有可能是内存分配确实过小,而正常业务使用了大量内存
某一个对象被频繁申请,却没有释放,内存不断泄漏,导致内存耗尽
某一个资源被频繁申请,系统资源耗尽,例如:不断创建线程,不断发起网络连接
因此,针对解决思路,快速定位OOM问题的三板斧是:
确认是不是内存本身就分配过小
找到最耗内存的对象
确认是否是资源耗尽
以正式线上的tomcat为例,tomcat运行5个ssm架构的java项目,启动时需要60秒左右,运行一段时间偶尔会有OOM出现,现在逐一排查:
(1) 确认是不是内存本身就分配过小
在服务器(8核16G)上输入 top 查看 java启动时内存变化情况,顺便找到java的进程ID : 10397
然后, 输入:jmap -heap 10397,观察堆、新生代、老年代的内存使用情况,发现大概都用了一半,可以确定,不是内存分配过小问题。
wen@S189919:/opt/tomcat8$ jmap -heap 1246
Attaching to process ID 1246, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.65-b04
using thread-local object allocation.
Parallel GC with 8 thread(s)
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 4208984064 (4014.0MB)
NewSize