📅  最后修改于: 2023-12-03 15:16:31.991000             🧑  作者: Mango
当Java程序运行时,它会在内存中创建各种对象(Object)。这些对象使用内存,但是不再需要时,它们可以被垃圾收集器回收,以释放内存。
Java中有多种垃圾收集算法,在实现中通常是多种垃圾收集算法的组合。其中常见的垃圾收集算法有:
标记-清除算法是最早的垃圾收集算法。这种算法会先标记出所有需要回收的对象,然后回收这些对象所占用的内存。它的缺点是会产生内存碎片。
复制算法是将堆内存分成两个区域,每次只使用其中一个区域。当一个区域的内存用完后,将还活着的对象复制到另一个区域中,再将原来的区域全部清空。这种算法每次只需要回收一半的内存,而且不会产生内存碎片。
标记-整理算法也是先标记出所有需要回收的对象,但与标记-清除算法不同,它会将存活的对象都移动到内存的一端,然后清除边界之外的所有内容。这种算法可以避免内存碎片的产生。
分代算法是将Java堆划分为新生代和老年代两个区域,新生代用复制算法,老年代用标记-整理算法。新生代中的对象很容易就被回收,而老年代中的对象生命周期较长,因此采用标记-整理算法。
Java中的垃圾收集器会根据算法来实现垃圾回收。常用的垃圾收集器包括:
Serial收集器是最古老的垃圾收集器,它是单线程收集器,只能使用标记-复制算法。Serial收集器简单、高效,在单线程环境下表现良好,但在多线程环境下性能差。
Parallel收集器使用多线程收集垃圾,它适用于多核环境。它比Serial收集器的垃圾收集速度快,但更容易产生停顿。
CMS(Concurrent Mark Sweep)收集器是一种以低停顿时间为目标的垃圾收集器。它可以和应用程序线程一起并发地回收垃圾,但由于会产生内存碎片,因此适用于堆内存较小时的应用程序。
G1(Garbage First)收集器是一种适用于大内存、多核心计算机的垃圾收集器。它是基于分代收集理论的,采用标记-整理算法。它可以更为高效地处理大内存的Java应用程序。
Java Heap分配策略指定了Java对象的创建和消亡方式。常用的Java Heap分配策略包括:
Serial Heap适用于单核CPU、小型应用程序。它是串行执行的,效率低。
Parallel Heap适用于多核CPU、需要高效率的应用程序。它是并行执行的,效率高。
CMS Heap适用于需要低停顿时间的应用程序。它可以与应用程序一起并发执行,但会产生更多内存碎片。
G1 Heap适用于大型应用程序,它支持多核、多线程。它采用分代收集理论,可以处理大内存中的Java对象。