内存问题排查起来相对场景也比较多。主要包括OOM、GC问题和堆外内存。一般来讲,我们会先用free命令先来检查一发内存的各种情况。
第一种:堆内存
1. OOM
OutOfMemoryError: unable to create new native thread
无法创建新的本地线程:没有足够的内存空间给线程分配java栈,基本上还是线程池代码写的有问题,比如说忘记shutdown,所以说应该首先从代码层面来寻找问题,使用jstack或者jmap。如果一切都正常,JVM方面可以通过指定Xss来减少单个thread stack的大小
OutOfMemoryError: Java heap space
这是堆内存溢出:应该在代码中找,怀疑存在内存泄漏,通过jstack和jmap去定位问题。如果说一切都正常,才需要通过调整Xmx的值来扩大内存
OutOfMemoryError: Meta space
这是jdk1.8后出现的元空间溢出,它一般占用的物理内存,这个意思是元数据区的内存占用已经达到XX:MaxPermSize的最大值,可根据需要自行调整大小
第二种:栈内存溢出
java.lang.StackOverflowError
这个异常是指线程栈需要的内存大于Xss值,同样也是先进行排查,参数方面通过Xss来调整,不能调整过大,调整的太大可能又会引起OOM