0%

JVM调优

程序检测异常

  • 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以前的永久代了)