日期:2014-05-20  浏览次数:20795 次

多线程测试,内存溢出,为什么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(); 试试