面试提问垃圾回收机制

来源:互联网 发布:雅思怎么做精听 知乎 编辑:程序博客网 时间:2024/05/16 09:29

什么是垃圾回收?

垃圾回收是Java中自动内存管理的另一种叫法。垃圾回收的目的是为程序保持尽可能多的可用堆(heap)。 JVM会删除堆上不再需要从堆引用的对象。

用一个例子解释垃圾回收?

比方说,下面这个方法就会从函数调用。

void method(){ Calendar calendar = new GregorianCalendar(2000,10,30); System.out.println(calendar); }

通过函数第一行代码中参考变量calendar,在堆上创建了GregorianCalendar类的一个对象。

函数结束执行后,引用变量calendar不再有效。因此,在方法中没有创建引用到对象。

JVM认识到这一点,会从堆中删除对象。这就是所谓的垃圾回收。

什么时候运行垃圾回收?

垃圾回收在JVM突发奇想和心血来潮时运行(没有那么糟糕)。运行垃圾收集的可能情况是:

堆可用内存不足CPU空闲

垃圾回收的最佳做法?

用编程的方式,我们可以要求(记住这只是一个请求——不是一个命令)JVM通过调用System.gc()方法来运行垃圾回收。

当内存已满,且堆上没有对象可用于垃圾回收时,JVM可能会抛出OutOfMemoryException。

对象在被垃圾回收从堆上删除之前,会运行finalize()方法。我们建议不要用finalize()方法写任何代码。


另转载

在java语言中,垃圾回收(Garbage Collection,GC)的主要作用是回收程序中不再使用的内存。
为了减轻开发人员的工作,同时增加系统的安全性和稳定性,java语言提供了垃圾回收器来自动检测对象的作用域,可自动地把不再被使用的存储空间释放掉。
垃圾回收依据一定的算法执行的,垃圾回收算法如下:
1.引用计数算法:当对象被引用时,引用计数器加1,相反减1,缺点是无法解决相互引用的问题。
2.标记-清除算法:标记所用从根节点开始的可达对象,清除所有未被标记的对象。(适用于老年代)
3.复制算法:将内存空间分成两块,每次将正在使用的内存中的存活对象复制到未使用的内存块中,之后清除正在使用的内存块。算法效率高,但是代价是将系统内存折半。(适用于新生代。存活对象少,垃圾对象多)
4.标记-压缩算法:该算法是对“标记-清除算法”的改进,不是直接对标记对象进行清除,而是将存活的对象压缩到内存的一端,然后直接清理掉边界以外的内存。(适用于老年代)
5.分代算法:根据对象的存活周期的不同将内存划分为几块,每块视为一代,一般是把 java内存堆分为新生代和老年代。
根据各个年代的特点采用最适当的垃圾收集算法。

原创粉丝点击