这样用定时器会产生内存泄露吗? 两个对象就没用了jvm的GC会自动回收内存请楼主放心 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你给的分好多哦但愿多分几分如果楼主还是不放心可以在后面加上System.gc()建议垃圾回收 Timer timer = new Timer(5000,performer);这样没有错误么? 这是你自己写的Timer类还是用的java.util.Timer类!java.util.Timer好像没有这个构造函数啊!如果最后你都将这些对象指向了null,也就是想jvm指示该对象已经不用,所以GC会回收这些对象占有的内存! 不归JVM管的资源(如数据库连接, JNI, ...)才可能出现资源泄漏 用的是javax.swing.timer类,这样用没错,运行结果也正确。首先看,如果没有这两句:timer.removeActionListener(this);this.timer = timer;timer = null;和timer.setRepeats(false);,timer和监听器应该会留在内存中,定时执行actionPerformed里的内容。也就是说,即使没有全局的句柄(Timer timer是局部变量),timer也会留在内存里,此时,GC是不应该回收它的,现在,就是不知道象我这样处理后,是否满足了GC的条件,因为timer并会提供dispose之类的函数,GC要在什么情况下才会回收这个timer对象? 不知道有没有说清楚,这么说吧:GC的对象回收条件是此对象已无句柄指向它。mouseControlPerformer虽然是作为局部对象来创建的,但它与timer关联在了一起,timer类中有一个句柄是指向它的,通过这个句柄去回调它的actionPerformed(ActionEvent evt),我用了:timer.removeActionListener(this);之后,它应该能满足GC的条件。而timer有点不同,即使没有任何对象指向它,它也会在一个独立的线程中运行(所有定时器共享这个线程),那么,它的回收条件呢?是timer.stop()后吗?显然不可能,所以,虽然做了timer = null;timer.removeActionListener(this);后,mouseControlPerformer应该会是被释放的,timer我就没有把握了。 PS:不知道GC是否会在timer.removeActionListener(this);后,检查此timer未被监听,则将其删除。 这么说吧:GC的对象回收条件是此对象已无句柄指向它。加上一句,当内存快用完的时候 JVM在调用GC的对象回收, 这么说吧:GC的对象回收条件是此对象已无句柄指向它。加上一句,当内存快用完的时候 JVM在调用GC的对象回收,----------------------------------------------------注意看一下我前面的回复,我的问题是:怎样让timer满足,无句柄指向它,至于GC何时回收我并不关心,关键是要满足GC条件。 好啦,搞定了,经过对swing.Timer类源代码的研究,可以得出结论这样Timer已具备GC的条件。这里我把Timer的工作原理给大家介绍一下。定时器是由javax.swing.Timer和javax.swing.TimerQueue这两个类实现的。1、在timer.start()时,Timer类调用timerQueue().addTimer(this, System.currentTimeMillis() + (long)getInitialDelay());timerQueue()方法返回的是一个TimerQueue对象,在它的addTimer方法中,将当前的timer加入到其Timer链表队列中,此对列的排序方式为:按定时器下一次到时的时间长短为序,时间最短的排在最前面。此时,即使我们定义的timer为局部变量,因为在定时器队列中已有对它的引用,所以,不满足GC。2、在timer.stop()时,TimerQueue中的postExpiredTimers()方法(此方法在Run中循环调用)将此timer从队列中删除,此时,若此timer我们定义的事局部变量,则其符合GC条件。如是全局变量,则,当我们下次调用其start()方法时,它又被加入队列中。如果之前设了:timer.setRepeats(false),那么,也会被自动调用stop()方法,从而从队列中删除,符合GC条件,不必要去显式调用其stop()方法。3、一个例程的所有定时器共享一个线程,所以,定时器队列的排序方法为按其到时的顺序来排,每次一个定时器到时,就发出相应的event,再将其从队列中删除,判断如其isRepeats为true,则根据其delay值将其重新加入队列的合适位置中,否则,此timer将为GC回收(局部变量时)。4、在共享线程的run中,总是处理队列中的第一个timer(它最快到时),处理方法为约每1ms比对其是否到时(即在每一个循环中调用一次wait(1),在wait的同时也释放了同步锁),处理完后,将其nextTimer指向的timer(它在原队列中第二快到时)提升为firstTimer后,将其删除,重新插入,这样,就实现了在一个线程中处理所有的Timer。最后,对JAVA的开发人员赞一个,其Timer的实现方法及算法简单有效,绝无冗余。有一定基础后,来看看源代码,对程序的技巧、算法的设计有总莫大的好处啊。 我有一个tomcat的Connector 节点设置的疑问 InputStream读取文件 请教 Externalizable接口问题 JVM内存问题 求java计算八字的程序 我刚学JAVA 请高手指教一下这道题 java 和c#之间传递字符出现乱码 高手帮忙 有关Applet! 一个关于“全局变量”的奇怪问题!!!!! 急!哪位大哥help me…… Jbutton的问题 tomcat下怎么样禁止对文件夹进行列表
但愿多分几分
如果楼主还是不放心
可以在后面加上System.gc()
建议垃圾回收
这样没有错误么? 这是你自己写的Timer类还是用的java.util.Timer类!java.util.Timer好像没有这个构造函数啊!
如果最后你都将这些对象指向了null,也就是想jvm指示该对象已经不用,所以GC会回收这些对象占有的内存!
首先看,如果没有这两句:timer.removeActionListener(this);this.timer = timer;
timer = null;和timer.setRepeats(false);
,timer和监听器应该会留在内存中,定时执行actionPerformed里的内容。也就是说,即使没有全局的句柄(Timer timer是局部变量),timer也会留在内存里,此时,GC是不应该回收它的,现在,就是不知道象我这样处理后,是否满足了GC的条件,因为timer并会提供dispose之类的函数,GC要在什么情况下才会回收这个timer对象?
而timer有点不同,即使没有任何对象指向它,它也会在一个独立的线程中运行(所有定时器共享这个线程),那么,它的回收条件呢?是timer.stop()后吗?显然不可能,所以,虽然做了timer = null;timer.removeActionListener(this);后,mouseControlPerformer应该会是被释放的,timer我就没有把握了。
加上一句,当内存快用完的时候 JVM在调用GC的对象回收,
加上一句,当内存快用完的时候 JVM在调用GC的对象回收,
----------------------------------------------------
注意看一下我前面的回复,我的问题是:怎样让timer满足,无句柄指向它,至于GC何时回收我并不关心,关键是要满足GC条件。
定时器是由javax.swing.Timer和javax.swing.TimerQueue这两个类实现的。
1、在timer.start()时,Timer类调用timerQueue().addTimer(this, System.currentTimeMillis() + (long)getInitialDelay());timerQueue()方法返回的是一个TimerQueue对象,在它的addTimer方法中,将当前的timer加入到其Timer链表队列中,此对列的排序方式为:按定时器下一次到时的时间长短为序,时间最短的排在最前面。此时,即使我们定义的timer为局部变量,因为在定时器队列中已有对它的引用,所以,不满足GC。
2、在timer.stop()时,TimerQueue中的postExpiredTimers()方法(此方法在Run中循环调用)将此timer从队列中删除,此时,若此timer我们定义的事局部变量,则其符合GC条件。如是全局变量,则,当我们下次调用其start()方法时,它又被加入队列中。如果之前设了:timer.setRepeats(false),那么,也会被自动调用stop()方法,从而从队列中删除,符合GC条件,不必要去显式调用其stop()方法。
3、一个例程的所有定时器共享一个线程,所以,定时器队列的排序方法为按其到时的顺序来排,每次一个定时器到时,就发出相应的event,再将其从队列中删除,判断如其isRepeats为true,则根据其delay值将其重新加入队列的合适位置中,否则,此timer将为GC回收(局部变量时)。
4、在共享线程的run中,总是处理队列中的第一个timer(它最快到时),处理方法为约每1ms比对其是否到时(即在每一个循环中调用一次wait(1),在wait的同时也释放了同步锁),处理完后,将其nextTimer指向的timer(它在原队列中第二快到时)提升为firstTimer后,将其删除,重新插入,这样,就实现了在一个线程中处理所有的Timer。
最后,对JAVA的开发人员赞一个,其Timer的实现方法及算法简单有效,绝无冗余。有一定基础后,来看看源代码,对程序的技巧、算法的设计有总莫大的好处啊。