如果java虚拟机的内存不足,就会自动进行垃圾收集。当然也可以手动进行,怎么做我也不知道。不过这是没有必要的,编写良好的程序不大会经常激活垃圾自动收集。

解决方案 »

  1.   

    JAVA中的内存管理是动态和自动的.当创建那个对象的时候,JAVA自动为那个对象分配足够数量的内存.在大多数情况下,当不再使用已经创建的对象时,JAVA可以确定已经没有任何活动的引用指向它(也就是这个对象被认为不在需要了).在程序运行中,JAVA定期查看没有使用的对象(一般是在系统闲置的时候),并重新申明那些对象正在使用的内存(这个过程称为垃圾回收).它是完全自动的,所以你完全没有必要显式释放对象所占用的内存.垃圾回收只是在程序执行的过程中偶然发生.垃圾回收的优先级别比较低,当有别的比较高一级的任务的时候,垃圾回收任务就会被忽略,到下个时间再去执行它的回收任务.(不知道这样说能不能明白?)
      

  2.   

    在java中有一个跟垃圾处理器功能相似的方法,finalize()方法.该方法可以再删除一个对象之前,确认某些动作已经完成.也就是再删除这个对象之前要确认该资源已经全部释放.使用这个终止可以定义指定的动作,这个动作再一个对象刚好被垃圾回收器回收时发生.
      

  3.   

    举例来说:
    Object obj = new Object();
    obj 这个引用将引用堆中存储的一个对象。只要 obj 引用还存在,垃圾收集器就永远不会释放用来容纳该对象的存储空间。当 obj 超出范围或被显式地指定为 null 时,垃圾收集器就认为没有对这个对象的其它引用,也就可以收集它了。然而您还需要注意一个重要的细节:仅凭对象可以被收集并不意味着垃圾收集器的一次指定运行就能够回收它。由于各种垃圾收集算法有所不同,某些算法会更频繁地分析生存期较短的对象,而不是较老、生存期较长的对象。因此,一个可供收集的对象可能永远也不会被回收。如果程序在垃圾收集器释放对象之前结束,这种情况就可能会出现。因此,概括地说,永远无法保证可供收集的对象总是会被垃圾收集器收集。
      

  4.   

    再开始运行一个java时,JVM会首先被分配一个数量的内存,这个数量可以通过java -ms64m -mx256m 来设定,如果我们把对象看作节点,一个对象对另一个对象的调用看作有向边,那么就得到了一个图的结构,当jvm的内存不够时候,他会看看试不是还能够项内存申晴新的空间,如果这个空间已经到达了你的jvm允许占有的最大值。则它开始垃圾会收,吧没有边指向的节点回收(这就是为什么对于一些对象我们将它赋值为null后它就可以被很好的回收的原因)如果一个对象(节点)已经不被使用了,但是还有一个有向的边指向他,他就不能被回收,内存泄漏就出现了。如果你想使用自己的代码控制gc的运行,每个方法在java doc中都有说明,并不保证gc一定被调用。所以你只要保证你的代码没有内存泄漏就可以了。