java核心-JVM-gc面试题
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来不及回收容易造成内存泄漏