1.寫一個memory leak的例子
public class MemonyLeak {
//1.memoryLeak內存泄漏
/*
這類錯誤報錯具體顯示:java.lang.OutOfMemoryError: java heap space
導致原因,是gc無法回收不再使用的對象,這些無用的對象導致堆內存不足。
通常有成員變量或全局變量導致,解決辦法就是定義好變量的作用范圍
*/
Map<String, List<String>> a;
public void printSomething(){
ArrayList<String> content = new ArrayList<>();
for(int i=0;i<10000000;i++){
content.add(i+i+i+i+System.currentTimeMillis()+"");
}
a = new HashMap<>();
a.put("aa", content);
System.out.println(a.hashCode());
}
public static void main(String[] args){
MemonyLeak memonyLeak1 = new MemonyLeak();
memonyLeak1.printSomething();
MemonyLeak memonyLeak2 = new MemonyLeak();
memonyLeak2.printSomething();
MemonyLeak memonyLeak3 = new MemonyLeak();
memonyLeak3.printSomething();
MemonyLeak memonyLeak4 = new MemonyLeak();
memonyLeak4.printSomething();
MemonyLeak memonyLeak5 = new MemonyLeak();
memonyLeak5.printSomething();
MemonyLeak memonyLeak6 = new MemonyLeak();
memonyLeak6.printSomething();
}
}
執行了好半天,結果報錯了
解決辦法:
將成員變量寫到方法printSomething()里面
public void printSomething(){
Map<String, List<String>> a;
ArrayList<String> content = new ArrayList<>();
for(int i=0;i<10000000;i++){
content.add(i+i+i+i+System.currentTimeMillis()+"");
}
a = new HashMap<>();
a.put("aa", content);
System.out.println(a.hashCode());
}
執行結果
可見對於內存泄漏的問題可能來源了對象的作用域定義不合理,成員變量或全局變量的對象作用域比較寬,gc來不及回收容易造成內存泄漏