两个对象就没用了
jvm的GC会自动回收内存
请楼主放心

解决方案 »

  1.   

    你给的分好多哦
    但愿多分几分
    如果楼主还是不放心
    可以在后面加上System.gc()
    建议垃圾回收
      

  2.   

    Timer timer = new Timer(5000,performer);
    这样没有错误么? 这是你自己写的Timer类还是用的java.util.Timer类!java.util.Timer好像没有这个构造函数啊!
    如果最后你都将这些对象指向了null,也就是想jvm指示该对象已经不用,所以GC会回收这些对象占有的内存!
      

  3.   

    不归JVM管的资源(如数据库连接, JNI, ...)才可能出现资源泄漏
      

  4.   

    用的是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对象?
      

  5.   

    不知道有没有说清楚,这么说吧:GC的对象回收条件是此对象已无句柄指向它。mouseControlPerformer虽然是作为局部对象来创建的,但它与timer关联在了一起,timer类中有一个句柄是指向它的,通过这个句柄去回调它的actionPerformed(ActionEvent evt),我用了:timer.removeActionListener(this);之后,它应该能满足GC的条件。
    而timer有点不同,即使没有任何对象指向它,它也会在一个独立的线程中运行(所有定时器共享这个线程),那么,它的回收条件呢?是timer.stop()后吗?显然不可能,所以,虽然做了timer = null;timer.removeActionListener(this);后,mouseControlPerformer应该会是被释放的,timer我就没有把握了。
      

  6.   

    PS:不知道GC是否会在timer.removeActionListener(this);后,检查此timer未被监听,则将其删除。
      

  7.   

    这么说吧:GC的对象回收条件是此对象已无句柄指向它。
    加上一句,当内存快用完的时候 JVM在调用GC的对象回收,
      

  8.   

    这么说吧:GC的对象回收条件是此对象已无句柄指向它。
    加上一句,当内存快用完的时候 JVM在调用GC的对象回收,
    ----------------------------------------------------
    注意看一下我前面的回复,我的问题是:怎样让timer满足,无句柄指向它,至于GC何时回收我并不关心,关键是要满足GC条件。
      

  9.   

    好啦,搞定了,经过对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的实现方法及算法简单有效,绝无冗余。有一定基础后,来看看源代码,对程序的技巧、算法的设计有总莫大的好处啊。