Java面向对象编程中的垃圾回收机制(Garbage Collection,简称GC)是Java虚拟机(JVM)自动管理内存的一种方式。它的主要作用是回收程序中不再使用的对象所占用的内存空间,从而避免内存泄漏和系统资源的浪费。
Java堆内存主要分为以下几个部分:
-
新生代(Young Generation):新创建的对象会被分配到新生代。新生代又分为Eden区和两个Survivor区(S0和S1)。大部分对象在创建后很快会被回收,只有经过一定次数的垃圾回收仍然存活的对象才会被晋升到老年代。
-
老年代(Old Generation):经过多次垃圾回收仍然存活的对象会被放入老年代。当老年代空间不足时,会触发Full GC,回收整个堆内存(包括新生代和老年代)。
-
永久代(Permanent Generation):在Java 8之前,永久代用于存储类的元数据信息。从Java 8开始,永久代被元空间(Metaspace)取代,元空间使用本地内存,大小不再受限于JVM的最大可用内存。
Java的垃圾回收机制主要包括以下几种算法:
-
标记-清除(Mark-Sweep):首先标记所有可达对象,然后清除所有未被标记的对象。
-
复制算法(Copying):将内存分为两个相等的部分,每次只使用其中一半。当这一半内存用完时,将存活的对象复制到另一半内存中,并清空原来的内存区域。这种算法常用于新生代的垃圾回收。
-
标记-整理(Mark-Compact):在标记-清除的基础上,将存活的对象向一端移动,以便整理出连续的空闲内存。
-
分代算法(Generational):根据对象的生命周期,将内存划分为新生代和老年代,针对不同代采用不同的垃圾回收策略。
Java的垃圾回收机制有多种实现方式,如Serial、Parallel、CMS(Concurrent Mark Sweep)和G1(Garbage First)。这些实现方式在垃圾回收的策略、效率和应用场景上有所不同。JVM会根据程序的运行情况自动选择合适的垃圾回收器。