多线程测试,
内存溢出,为什么java没给我自动回收垃圾?
Java code
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class T {
private static int count=0;
/**
* @param args
*/
public static void main(String[] args) {
class MyTimerTask extends TimerTask{
@Override
public void run() {
count=(count+1)%2;
System.out.println(Thread.currentThread().getName()+" count:"+count);
new Timer().schedule(new MyTimerTask(), 0+count*2);
}
}
TimerTask task=new MyTimerTask();
System.out.println("开始");
new Timer().schedule(task, 3000);
while(true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(" "+Thread.currentThread().getName()+" "+new Date().getSeconds());
}
}
}
以下是运行结果:
……
……
Timer-3968 count:1
Timer-3969 count:0
Timer-3970 count:1
Timer-3971 count:0
Timer-3972 count:1
Timer-3973 count:0
Timer-3974 count:1
Timer-3975 count:0
Timer-3976 count:1
Exception in thread "Timer-3976"
java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Unknown Source)
at java.util.Timer.<init>(Unknown Source)
at java.util.Timer.<init>(Unknown Source)
at cn.itcast.heima2.T$1MyTimerTask.run(T.java:21)
at java.util.TimerThread.mainLoop(Unknown Source)
at java.util.TimerThread.run(Unknown Source)
main 33
main 34
main 35
main 36
main 37
内存溢出了,为什么java没给我自动回收垃圾呢?!
------解决方案--------------------
API里面有句:
对 Timer 对象最后的引用完成后,并且 所有未处理的任务都已执行完成后,计时器的任务执行线程会正常终止(并且成为垃圾回收的对象)。但是这可能要很长时间后才发生。
楼主在run函数最后加一句 System.gc(); 试试