Java出现OutOfMemoryError或者发现Java应用程序占用的内存很异常,那么我们一般采用下面的步骤分析:
A. 把Java应用程序使用的heap dump下来
B. 使用Java heap分析工具,找出内存占用超出预期的嫌疑对象
C. 根据情况,分析嫌疑对象和其他对象的引用关系。
D. 分析程序的源代码,找出嫌疑对象数量过多的原因。
以下面的代码为例:
1,设置jvm让其在out of memory的时候自动生成dump
A. 把Java应用程序使用的heap dump下来
B. 使用Java heap分析工具,找出内存占用超出预期的嫌疑对象
C. 根据情况,分析嫌疑对象和其他对象的引用关系。
D. 分析程序的源代码,找出嫌疑对象数量过多的原因。
以下面的代码为例:
public class TObject {
int[] arr = new int[20000];
}
public class Test1 {
private List<TObject> list = new ArrayList<TObject>();
public void test() {
int i = 0;
while (true) {
try {
Thread.sleep(100);
//如果不加上循环限制,大概在循环到380多的时候消耗完32M的heap
if(i>350){
continue;
}
list.add(new TObject());
i++;
System.out.println("There are " + i + " objects created");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] aregs) {
new Test1().test();
}
}
Java应用程序使用的heap dump下来可以有如下的方法:
1,设置jvm让其在out of memory的时候自动生成dump