多线程测试,内存溢出,为什么java没给小弟我自动回收垃圾
多线程测试,内存溢出,为什么java没给我自动回收垃圾?
以下是运行结果:
……
……
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(); 试试
- 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(); 试试