Java垃圾回收机制(GC机制)

Java垃圾回收机制

  说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来。在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给了JVM来处理。顾名思义,垃圾回收就是Java虚拟机提供的能力,用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的内存空间。那么在Java中,什么样的对象会被认定为“垃圾”?那么当一些对象被确定为垃圾之后,采用什么样的策略(或者说按机回收算法)来进行回收(释放空间)?在目前的商业虚拟机中,有哪些典型的垃圾收集器?这些只做些了解就可,因为我们程序员不需要太深入了解,而且目前已近推出JDK8.0,相应的也有JVM8.0更新文档帮助大家深入了解JVM机制。

  一.如何确定某个对象是“垃圾”?

  二.典型的垃圾收集算法

  三.典型的垃圾收集器


       传统的C/C++等编程语言,需要程序员负责回收已经分配的内存,因为对象所占用的内存不会自动释放,如果程序员没没有显示释放该内存,此块内存就不能分配给其他对象,该内存在程序结束之前将一直被占用;但是显示回收会出现很多问题,如果一些分配的内存没有及时回收,会使系统运行速度减慢,甚至导致程序瘫痪,这种现象叫内存泄露。总之显示回收会有2个缺点:

                 1.程序员并不是总知道何时应该回收内存,导致内存泄露;

                 2.有时会忘记回收,或错误回收导致系统崩溃。

      因此java的GC机制,自动垃圾回收机制是可靠的、安全的,为程序员省去很多精力。在java中,当没有引用变量指向原先分配给某个对象的内存时,该内存就成为垃圾,自动垃圾回收都是由JRE(Java Runtime Environment,Java运行环境)后台自动进行的,通常JRE会提供一个后台线程进行检测和控制,这个线程是典型的“守护线程”;一般都是在CPU空闲或内存不足时自动进行垃圾回收,内存中的“信息”将被丢弃。

       除了JRE的后台自动回收以外,还有2中程序员可以显示方式回收

System.gc();
Runtime.getRuntime().gc();  
上面的方法调用时用于显式通知JVM可以进行一次垃圾回收,但真正垃圾回收机制具体在什么时间点开始发生动作这同样是不可预料的,这和抢占式的线程在发生作用时的原理一样。
      垃圾回收除了释放没有引用变量指向原先分配给某个对象的内存,还会清除内存记录碎片(碎片是分配给对象之间的内存块之间的空闲内存区)。由于创建对象和垃圾回收器丢弃对象所占用内存空间,会产生碎片,JVM可以将内存碎片分配给新的对象。

     讲完垃圾回收机制的优点,其实它也是有缺点的。其中一个潜在的缺点就是垃圾回收线程的开销会影响程序性能,因为它是个守护线程,会一直“陪伴”着程序,但是随着计算机软硬件的发展,通常我们使用的计算机性能都还可以,这点影响是微不足道的。另外一个就是垃圾回收采用的算法:无论采用哪种特殊的回收算法都会做2件基本的事:发现无用对象和回收无用内存。由于回收算法的不完备,早先采用的回收算法并不能百分之百完全回收。随着回收算法的改进此问题也会迎刃而解。

    









你可能感兴趣的:(Java基础)