Java中有两种核心机制,一个是java虚拟机|(JavaViretul Machine),另一个就是垃圾收集机制(GarbageCollection),下面就简单说一说关于java中的垃圾收集机制,并简单总结一下面试中如何回答此类问题。 一、概述: 1、简述: Java的垃圾回收机制是java虚拟机提供的能力,用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的内存空间。它会自动进行,程序员无法进行精确的控制和干预。 2、垃圾收集的意义: 1)释放废弃对象的内存空间为新对象所用。 在Java中,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾。JVM的一个系统级线程会自动释放该内存块。垃圾收集意味着程序不再需要的对象是"无用信息",这些信息将被丢弃。当一个对象不再被引用的时候,内存回收它占领的空间,以便空间被后来的新对象使用。 2)垃圾回收可清楚内存记录碎片,即创建和释放对象时产生的碎片,以及对象内存块之间的空闲内存洞。碎片整理将所占用的堆内存移到堆的一端,JVM将整理出的内存分配给新的对象。 3)垃圾收集能自动释放内存空间,减轻编程的负担。 这使Java 虚拟机具有一些优点。首先,它能使编程效率提高。在没有垃圾收集机制的时候,可能要花许多时间来解决一个难懂的存储器问题。在用Java语言编程的时候,靠垃圾收集机制可大大缩短时间。其次是它保护程序的完整性, 垃圾收集是Java语言安全性策略的一个重要部份。 3、垃圾收集的缺点: 垃圾收集的一个潜在的缺点是它的开销影响程序性能。Java虚拟机必须追踪运行程序中有用的对象, 而且最终释放没用的对象。这一个过程需要花费处理器的时间。 二、关于垃圾回收机制的几个重要问题 要想了解java中垃圾收集机制是如何运作的,就要先明白几个重要问题,才能更好地了解垃圾收集机制的具体算法。 1、谁在做GC(GarbageCollection)? Java采用一种不同于c++的,很方便的方法:GarbageCollection。Java垃圾回收机制放在JVM里。JVM完全负责垃圾回收事宜,应用只在需要时申请空间,而在抛弃对象时不必关心空间回收问题。 垃圾收集的实现和具体的JVM 以及JVM的内存模型有非常紧密的关系。不同的JVM 可能采用不同的垃圾收集,而JVM 的内存模型决定着该JVM可以采用哪些类型垃圾收集。现在,HotSpot系列JVM中的内存系统都采用先进的面向对象的框架设计,这使得该系列JVM都可以采用最先进的垃圾收集。 2、对象在什么时候被丢弃? 每个对象都是有自己的作用域的,确切说是对象的引用和作用域有关,因为没有引用的对象,一般被认为是废弃的对象。一个对象,可以有多个引用指向它,但当一个对象不再有任何的引用变量指向它的时候,那么这个对象就被抛弃了,或者说这个对象可以被垃圾收集器回收了(是可以,但是不知道在何时)。 这就是说,当不存在对某对象的任何引用时,就意味着,应用告诉JVM:我不要这个对象,你可以回收了。JVM的垃圾回收机制会对堆空间做实时检测。当发现某对象无引用(或者说在引用计数算法中计数为0)时,就将该对象列入待回收列表中。但是,并不是马上予以销毁。 3、对象被丢弃就被回收? 该对象被认定为没有存在的必要了,那么它所占用的内存就可以被释放。被回收的内存可以用于后续的再分配。但是,并不是对象被抛弃后当即被回收的。JVM进程做空间回收有较大的系统开销。如果每当某应用进程丢弃一个对象,就立即回收它的空间,势必会使整个系统的运转效率非常低下。 下面将说道,JVM的垃圾回收机制有多个算法。除了引用计数法是用来判断对象是否已被抛弃外,其它算法是用来确定何时及如何做回收。JVM的垃圾回收机制要在时间和空间之间做个平衡。 因此,为了提高系统效率,垃圾回收器通常只在满足两个条件时才运行:即有对象要回收且系统需要回收。切记垃圾回收要占用时间,因此,Java运行时系统只在需要的时候才使用它。因此你无法知道垃圾回收发生的精确时间。
|