把b和c的实例设为null然后 system.gc();

解决方案 »

  1.   

    java  自动回收垃圾!要哪个 干什么?
      

  2.   

    终结器的行为往往是不可预知的,通常还很危险,可能导致错误的运行行为、低下的执行效率和移植性的问题,应该尽量避免使用。终结器和C++中的析构函数不同,析构函数是释放同一个对象相关资源的,相对于构造函数。Java中的垃圾回收机制释放无用资源的内存占用,析构函数通常还可以释放非内存资源,而Java中使用try-finally来释放非内存资源。终结器有两个无法保证:1)  终结器无法保证立刻启动,也就是说在对象无用和被终结之间的时间无法估计。2)  终结器无法保证所有终结动作全部会发生,所以不应该使用终结器来更新关键的永续状态。System.gc()和System.runFinalization()仅仅能够增加终结器执行的可能性,但还是不能确保,只有方法System.runFinalizersOnExit()和Runtime.run()能够保证终结器的行为,但它们本身有一定的缺陷,所以不提倡使用它们。进行终结行为的时候,可能会发生异常,这种异常场无法捕捉,这就导致了资源为被终结情况的发生。解决之道:1)              提供一个明确的终结方法,要求客户端在每个实例不再需要时调用它。但是,每个实例必须自己保留并追踪其是否已经被终结。明确的终结方法必须使用一个成员来记录对象不再有效,而其他方法必须检查这个成员,如果终结后在调用,就抛出IllegalStateException异常,典型的终结方法是InputStream和OutputStream的close方法。2)              明确的终结方法通常和try-finally结合使用,以确保可以“立刻终结”。使用终结器的作用:1)   “安全网”的作用,即使“无法说服自杀者放弃自杀,在他跳楼之后也可以起到安全保护作用”,专门用来捕获漏网之鱼。客户端,忘记调用终结方法的时候,不致于资源永远得不到归还,“稍候归还总比永远不还得好”。2)   第二种用途与对象的本地对等体(native peer)有关。本地对等体是一个本地对象,普通对象通过本地方法(native method)委托给一个本地对象。因为本地对等体不是一个普通对象,所以垃圾回收器不会知道它,当它的普通对等体被回收的时候,它不会被回收。在本地对等体不拥有关键资源的前提下,终结函数是执行这项任务的最合适的工具。 使用终结函数时,“终结函数链(finalizer chain)”并不会被自动执行,因而子类的终结函数必须手工调用超类的终结函数。
      

  3.   

    veinstone(脉石)    能举个简单的例子吗??
      

  4.   

    我的意见是,你在A的事件某一个响应里可以结束B,C的线程这样,所有的组件在BC上都失去响应但是不需要终结器。这是一点点心得
      

  5.   

    :~)楼主可以查看一下JFrame继承Window而来的dispose()方法。只需在A中调用B和C的dispose()方法,就可以实现将B与C中的所有占用资源释放,包括线程等等。下面是Window的dispose()的解释:
    ---------------------------------
    Releases all of the native screen resources used by this Window, its subcomponents, and all of its owned children. That is, the resources for these Components will be destroyed, any memory they consume will be returned to the OS, and they will be ed as undisplayable. The Window and its subcomponents can be made displayable again by rebuilding the native resources with a subsequent call to pack or show. The states of the recreated Window and its subcomponents will be identical to the states of these objects at the point where the Window was disposed (not accounting for additional modifications between those actions).
    -------------------------------------
      

  6.   

    dispose();这个方法我知道,也试过了!
    它释放的资源不完全,例如线程,端口,COM 口 等这些资源它都无法释放!我现在主要是已经有写好的几个程序!他们单独运行都是可以的!
    现在我要做一个类似“菜单”的程序把他们关联起来!并可以互相切换,所以必须当关闭其中一个程序的时候释放他所占用的资源!!
      

  7.   

    没考虑那么深过
    我认为JVM提供的内存回收机制因该就能满足一般的需求吧
    不然这个东西只能给Java带来骂名~~~~~
      

  8.   

    dispose();这个方法我知道,也试过了!
    它释放的资源不完全,例如线程,端口,COM 口 等这些资源它都无法释放!
    -------------------------------------------------------------------------去!
    JAVA的垃圾回收机制是带点随机的,,,你只能用system.gc()来“建议”它做垃圾收集,
    至于它想什么时候收集,收集什么,这不是你能定置的!当不再有任何一个其它的对象对某对象A的引用时,A就会被列到“黑名单”里,随时恭候被回收。你最好再仔细查查是不是哪里还隐含了什么对象对某对象B的引用,导致B不能被回收。
    随便,如果你是用runtime.exec什么的来启动进程的,还可以用此函数的返回值process来kiil线程。
      

  9.   

    非内存的资源只能在 try..finally{这里} 被回收。这是所有 GC 语言的局限
      

  10.   

    你的设计有问题:干嘛要在A中构造B,B中构造C?使用MVC模式让Controller控制Frame的生命周期
      

  11.   

    Wolf0403(完美废人)(灌水是我无言的抗议)哈哈,废人也来啦~~~~~~~~~~~
      

  12.   

    如果就你题目所说的情况,根本就不需要自己搞什么析构函数,只要将b=null,c=null,之后就不用理了,不要用C++那套思维来编写java程序。要知道java就是设计为不用,也不能让用户自己随便释放内存,我们所能做的就是告诉jvm“这个类,我不用了“,仅此而已。
      

  13.   

    所谓终结器也只不过是能马上告诉jvm“这个类我不用了”而已,如果不说,jvm就会用自己的一套算法来计算你那些类不用。所以归根到底,你不需要的类,jvm都会回收,只是迟早问题。
      

  14.   

    做自己该做的事,其余的交给JVM执行就可以了。同意 JavaVsNet(JavaVsNet) 。