JVM - 问题调试方法
面试宝典
命令
- jps 查看进程
- jstat 详细查看堆内各个部分的使用量,以及加载类的数量

- jmap 查看内存
- jstack 查看线程
默认值
- 新生代:老年代= 1:2 //即新生代占1/3,老年代占2/3
- Edem:from:to= 8:1:1 //因为新生代中有一块Survivor始终是空闲的,所以新生代实际可用空间为9/10
参数参数
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=../logs
日志分析


问题记录
1. java.lang.OutOfMemoryError: PermGen space

- 现象:类加载器在加载的时候报出永久代内存溢出。
- 服务器硬件:内存16G 通讯机堆占用6G JDK1.6
- 启动参数: set USER_MEM=-Xmx6144m -Xms2048m
- 问题分析:永久代没有设值。默认初始化值:内存的1/64=16G/64=256MB,默认最大值:内存的1/4=16G/4=4GB。
永久代用于存放Class和Meta信息,GC不会在主程序运行期间对Perm进行清理,所以当Load过多Class时,会出现OOM。
full gc 175s,惊呆了!!!
频繁full gc,然而堆大小并没有什么变化。
full gc前后永久代大小并没有变化。
其实,永久代的GC也属于FULL GC.
- 解决方案:添加如下参数。
-XX:PermSize=512m -XX:MaxPermSize=1024m
2. java.lang.OutOfMemoryError: unable to create new native thread

- 问题原因:
- 内存耗尽,无法为新线程创建内存;
- 创建线程数超过OS限制;
- 解决方案:

工具
- 一个在线的JVM日志分析网站 http://gceasy.io/