程序检测异常
- jvm死机, jvm调优
- 内存,cpu占用过高, GC调优
- 检测无法停止
- 检测无法开始
- 磁盘空间出现问题 df -hl
HotSpot VM
- 栈区异常: stackOverFlow 如果栈可以动态扩展,直到内存不足会OOM —Xss
- 堆区异常:OOM -Xms(min) -Xmx(max)指定内存,实例对象或者数组超出内存
- 方法区异常:(存放加载过的类,静态变量,常量)永久代很少出现GC -XX PermSize -XX MaxPermSize
- 运行时常量池:String.intern()生成常量导致OOM
- 直接内存:虚拟机外内存,NIO有directByteBuffer操作
Dump文件,内存泄漏查看GC root引用路径为什么无法自动回收
内存溢出 对象仍然存活,调大内存,或者降低对象生命周期
垃圾收集器
CMS, ParNew
如何排查?
- TOP命令查看cpu占用率
- ps查看进程pid, 线程tid
- jstack查看进程信息,可以看到哪一行出现了问题
- jmap 导出dump文件
- jstat查看分代变化情况
- 启动时开启gc日志-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps来开启GC日志
——OOM unable to create new native thread线程池有问题
解决:Xss减少单个thread stack的大小
——Exception in thread “main” java.lang.OutOfMemoryError: Java heap space
解决:这个意思是堆的内存占用已经达到-Xmx设置的最大值,应该是最常见的OOM错误了。解决思路仍然是先应该在代码中找,怀疑存在内存泄漏,通过jstack和jmap去定位问题。如果说一切都正常,才需要通过调整Xmx的值来扩大内存。
——Caused by: java.lang.OutOfMemoryError: Meta space
解决:这个意思是元数据区的内存占用已经达到XX:MaxMetaspaceSize设置的最大值,排查思路和上面的一致,参数方面可以通过XX:MaxPermSize来进行调整(这里就不说1.8以前的永久代了)