排查思路要灵活变通。往往根据对象排行去排查比较方便,但是生产环境肯定会存在干扰对象问题,所以要通过对比多个对象来判断。应该也是能够像sql一样进行引用分组再排行,根据需要可以学习下oql控制台的功能。
先上代码
/**
* describe: 堆内存溢出模拟,设置最大堆为20m,jvisualvm分析堆快照。
* VM参数:-Xms5m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=C:\Users\Admin\Desktop\1.hdump -XX:-UseGCOverheadLimit
*
* @author lianying
* @date 2020/01/19
*/
public class HeapOom {
public static void main(String [] args)
{
oom();
}
private static void oom(){
Map<String, Pilot> map = new HashMap<String, Pilot>();
Object[] array = new Object[1000000];
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
for(int i=0; i<1000000; i++){
String d = new Date().toString();
Pilot p = new Pilot(d, i);
map.put(i+"rosen jiang", p);
array[i]=p;
}
}
public static class Pilot{
String name;
int age;
public Pilot(String a, int b){
name = a;
age = b;
}
}
}
1.运行
2.启动jvisualvm,并导入堆快照
3.点击进去查引用(自定义对象,或者基础类都能查到)
4.查看线程快照,查看具体引用点。