上一篇:GC垃圾回收机制----GC回收算法(GC机制必会知识点)
在java中,因为JVM能够自动回收不再使用的对象而不是人为地显式地销毁对象,所以出现OOM的情况并不多见,但是如果出现了OOM的情况,我们也可以使用一些辅助工具来进行排查。
JProFiler(java Profiler)就是一款分析OOM的神器,它能够定位出现OOM的代码位置。
1.下载JProfiler客户端
JProfiler下载地址
安装很easy,不再赘述……
2.IDEA上下载JProfiler插件
按住快捷键ctrl+alt+s,选择plugins,搜索JProfiler,下载完毕之后重启IDEA。
3.查看JProfiler是否安装成功
重启IDEA工具之后,应该会在IDEA上看到JProfler的图标 如果没有此图标,通过如下操作重启IDEA。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200114155210387.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjU1ODM1,size_16,color_FFFFFF,t_70)
按住ctrl+alt+s,进入Settings,选择Tools下的JProfiler,绑定JProfiler的客户端: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200114155713549.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjU1ODM1,size_16,color_FFFFFF,t_70)
5.整个OOM测试类
在我们测试的时候,可以通过参数将内存设置小一些,方便出现OOM的情况,下面参数表示当出现OutOfMemoryError的时候就把文件dump下来。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200114161607211.png)
堆栈参数
参数作用-Xmsjvm启动时堆内存的初始大小-Xmx堆内存的最大值-Xmn新生代空间大小,剩下的为老年代空间大小-Xss栈空间大小-XX:PermGen设置永久代内存的初始化大小,jdk1.8开始废弃永久代-XX:MaxPermGen设置永久代的最大值-XX:SUrvivorRatio设置新生代和存活区的比例。-XX:SurvivorRatio=8 表示存活区:新生代=1:8 =》新生代占年轻代的8/10,每个存活区各占年轻代的1/10。默认值:8-XX:NewRatio设置老年代和年轻代的比例。比如:-XX:NewRatio=8 表示老年代内存:年轻代内存=8:1 => 老年代占堆内存的8/9;年轻代占堆内存的1/9。默认值:2
-Xms1m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200114161655237.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjU1ODM1,size_16,color_FFFFFF,t_70)
public class Demo1 {
public static void main(String[] args) {
Student student = new Student("张三", 18);
List students = new ArrayList();
while (true) {
students.add(student);
}
}
private static class Student {
private String name;
private Integer age;
public Student(String name, Integer age) {
this.name = name;
this.age = age;
}
}
}
启动该测试类之后,直接报错如下: 上图红框中显示已经错误文件java_prd3248.hprof下载下来了,选中当前项目src文件夹,单机右键选择show in explorer, 看到有如下文件: 双击此文件就可以直接使用JProfiler客户端打开
5.JProfiler客户端分析错误文件
打开后的文件显示如下: 我们从下面的视图中可以看到是谁占用了大部分的空间: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200114163733106.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjU1ODM1,size_16,color_FFFFFF,t_70)
也可以选择Thread Dump,它会展示我们程序中的所有线程,通过查看线程我们可以快速定位到底是哪一行代码出了问题: 错误显示在controller包下的Demo1类中的main方法的第19行出现了问题,然后我们就可以去IDEA工具中查看到底是什么情况了…… ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200114164452573.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjU1ODM1,size_16,color_FFFFFF,t_70)
下一篇:Native关键字
|