一个类 MachineBean
public class MachineBean {
private static final int number = 990;
private final int age = 504;
/**
* 我们学javaSe的时候 老师告诉我们 这个testMethod 属于 当前 MachineBean类的实例的
*/
private void testMethod() {
// age++; //报错 final修饰
if(number==990){
}
System.out.println("abc");
System.out.println(this);
}
public void invokeThread(){
new Thread(new myThread()).start();
}
/**
* 内部类持有外部类的实例导致的内存泄漏
*/
class myThread implements Runnable {
@Override
public void run() {
for (;;){
try {
Thread.sleep(2000);
testMethod();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
测试
public class Main {
public static void main(String[] args) {
// write your code here
MachineBean machineBean = new MachineBean();
machineBean.invokeThread();
machineBean = null;
//为什么置为null了还对象还可以被打印输出呢?
System.gc();
}
}
虽然 machineBean = null; 也调用了 System.gc(); 但 控制台会一直输出
abc
com.company.MachineBean@60de57fb
最主要的原因是非静态内部类持有了外部类的引用
网友评论