📜  Java中的垃圾收集(1)

📅  最后修改于: 2023-12-03 15:16:31.991000             🧑  作者: Mango

Java中的垃圾收集

当Java程序运行时,它会在内存中创建各种对象(Object)。这些对象使用内存,但是不再需要时,它们可以被垃圾收集器回收,以释放内存。

垃圾收集算法

Java中有多种垃圾收集算法,在实现中通常是多种垃圾收集算法的组合。其中常见的垃圾收集算法有:

  • 标记-清除算法(Mark-Sweep)
  • 复制算法(Copy)
  • 标记-整理算法(Mark-Compact)
  • 分代算法(Generational)
标记-清除算法

标记-清除算法是最早的垃圾收集算法。这种算法会先标记出所有需要回收的对象,然后回收这些对象所占用的内存。它的缺点是会产生内存碎片。

复制算法

复制算法是将堆内存分成两个区域,每次只使用其中一个区域。当一个区域的内存用完后,将还活着的对象复制到另一个区域中,再将原来的区域全部清空。这种算法每次只需要回收一半的内存,而且不会产生内存碎片。

标记-整理算法

标记-整理算法也是先标记出所有需要回收的对象,但与标记-清除算法不同,它会将存活的对象都移动到内存的一端,然后清除边界之外的所有内容。这种算法可以避免内存碎片的产生。

分代算法

分代算法是将Java堆划分为新生代和老年代两个区域,新生代用复制算法,老年代用标记-整理算法。新生代中的对象很容易就被回收,而老年代中的对象生命周期较长,因此采用标记-整理算法。

垃圾收集器

Java中的垃圾收集器会根据算法来实现垃圾回收。常用的垃圾收集器包括:

  • Serial收集器
  • Parallel收集器
  • CMS收集器
  • G1收集器
Serial收集器

Serial收集器是最古老的垃圾收集器,它是单线程收集器,只能使用标记-复制算法。Serial收集器简单、高效,在单线程环境下表现良好,但在多线程环境下性能差。

Parallel收集器

Parallel收集器使用多线程收集垃圾,它适用于多核环境。它比Serial收集器的垃圾收集速度快,但更容易产生停顿。

CMS收集器

CMS(Concurrent Mark Sweep)收集器是一种以低停顿时间为目标的垃圾收集器。它可以和应用程序线程一起并发地回收垃圾,但由于会产生内存碎片,因此适用于堆内存较小时的应用程序。

G1收集器

G1(Garbage First)收集器是一种适用于大内存、多核心计算机的垃圾收集器。它是基于分代收集理论的,采用标记-整理算法。它可以更为高效地处理大内存的Java应用程序。

Java Heap分配策略

Java Heap分配策略指定了Java对象的创建和消亡方式。常用的Java Heap分配策略包括:

  • Serial Heap
  • Parallel Heap
  • CMS Heap
  • G1 Heap
Serial Heap

Serial Heap适用于单核CPU、小型应用程序。它是串行执行的,效率低。

Parallel Heap

Parallel Heap适用于多核CPU、需要高效率的应用程序。它是并行执行的,效率高。

CMS Heap

CMS Heap适用于需要低停顿时间的应用程序。它可以与应用程序一起并发执行,但会产生更多内存碎片。

G1 Heap

G1 Heap适用于大型应用程序,它支持多核、多线程。它采用分代收集理论,可以处理大内存中的Java对象。