自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java 的七種垃圾收集器

開發(fā)
垃圾收集器并不只有一種,Java 虛擬機(jī)(JVM)有七種不同的垃圾收集器,了解每種垃圾收集器的目的和優(yōu)點(diǎn)是很有用的。

了解 Java 中的內(nèi)存管理。

用 C 或 C++ 這樣的編程語言寫一個(gè)應(yīng)用時(shí),需要編寫代碼來銷毀內(nèi)存中不再需要的對(duì)象。當(dāng)應(yīng)用程序擴(kuò)展得越來越復(fù)雜時(shí),未使用對(duì)象被忽略釋放的可能性就越大。這會(huì)導(dǎo)致內(nèi)存泄露,最終內(nèi)存耗盡,在某個(gè)時(shí)刻將沒有更多的內(nèi)存可以分配。結(jié)果就是應(yīng)用程序運(yùn)行失敗并出現(xiàn) OutOfMemoryError 錯(cuò)誤。但在 Java 中,垃圾收集器Garbage Collection(GC)會(huì)在程序執(zhí)行過程中自動(dòng)運(yùn)行,減輕了手動(dòng)分配內(nèi)存和可能的內(nèi)存泄漏的任務(wù)。

垃圾收集器并不只有一種,Java 虛擬機(jī)(JVM)有七種不同的垃圾收集器,了解每種垃圾收集器的目的和優(yōu)點(diǎn)是很有用的。

1、Serial 收集器

Serial threaded garbage collection

Serial threaded garbage collection

垃圾收集器的原始實(shí)現(xiàn),使用單線程。當(dāng)垃圾收集器運(yùn)行時(shí),會(huì)停止應(yīng)用程序(通常稱為“stop the world”事件)。適用于能夠承受短暫停頓的應(yīng)用程序。該垃圾收集器占用內(nèi)存空間比較小,因此這是嵌入式應(yīng)用程序的首選垃圾收集器類型。在運(yùn)行時(shí)使用以下命令啟用該垃圾收集器:

    $ java -XX:+UseSerialGC

2、Parallel 收集器

Parallel garbage collection

Parallel garbage collection

像 Serial 收集器一樣,Parallel 收集器也使用“stop the world”方法。這意味著,當(dāng)垃圾收集器運(yùn)行時(shí),應(yīng)用程序線程會(huì)停止。但是不同的是,Parallel 收集器運(yùn)行時(shí)有多個(gè)線程執(zhí)行垃圾收集操作。這種類型的垃圾收集器適用于在多線程和多處理器環(huán)境中運(yùn)行中到大型數(shù)據(jù)集的應(yīng)用程序。

這是 JVM 中的默認(rèn)垃圾收集器,也被稱為吞吐量收集器。使用該垃圾收集器時(shí)可以通過使用各種合適的 JVM 參數(shù)進(jìn)行調(diào)優(yōu),例如吞吐量、暫停時(shí)間、線程數(shù)和內(nèi)存占用。如下:

  • 線程數(shù):-XX:ParallelGCThreads=<N>
  • 暫停時(shí)間:-XX:MaxGCPauseMillis=<N>
  • 吞吐量(垃圾收集花費(fèi)的時(shí)間與實(shí)際應(yīng)用程序執(zhí)行的時(shí)間相比):-XX:GCTimeRatio=<N>
  • 最大堆內(nèi)存:-Xmx<N>

Parallel 收集器可以使用該命令顯式啟用:java -XX:+UseParallelGC 。使用這個(gè)命令,指定在新生代中通過多個(gè)線程進(jìn)行垃圾回收,而老年代中的垃圾收集和內(nèi)存壓縮仍使用單個(gè)線程完成的。

還有一個(gè)版本的的 Parallel 收集器叫做 “Parallel Old GC”,它對(duì)新生代和老年代都使用多線程,啟用命令如下:

    $ java -XX:+UseParallelOldGC

3、Concurrent Mark Sweep(CMS)收集器

Concurrent garbage collection

Concurrent garbage collection

Concurrent Mark Sweep(CMS)垃圾收集器與應(yīng)用程序并行運(yùn)行。對(duì)于新生代和老年代都使用了多線程。在 CMS 垃圾收集器刪除無用對(duì)象后,不會(huì)對(duì)存活對(duì)象進(jìn)行內(nèi)存壓縮。該垃圾收集器和應(yīng)用程序并行運(yùn)行,會(huì)降低應(yīng)用程序的響應(yīng)時(shí)間,適用于停頓時(shí)間較短的應(yīng)用程序。這個(gè)收集器在 Java8 已過時(shí),并在 Java14 中被移除。如果你仍在使用有這個(gè)垃圾收集器的 Java 版本,可以使用如下命令啟用:

    $ java -XX:+UseConcMarkSweepGC

在 CMS 垃圾收集器使用過程中,應(yīng)用程序?qū)和纱?。首次暫停發(fā)生在標(biāo)記可直接訪問的存活對(duì)象時(shí),這個(gè)暫停被稱為初始標(biāo)記。第二次暫停發(fā)生在 CMS 收集器結(jié)束時(shí)期,來修正在并發(fā)標(biāo)記過程中,應(yīng)用程序線程在 CMS 垃圾回收完成后更新對(duì)象時(shí)被遺漏的對(duì)象。這就是所謂的重新標(biāo)記。

4、G1 收集器

Garbage first

Garbage first

G1 垃圾收集器旨在替代 GMS。G1 垃圾收集器具備并行、并發(fā)以及增量壓縮,且暫停時(shí)間較短。與 CMS 收集器使用的內(nèi)存布局不同,G1 收集器將堆內(nèi)存劃分為大小相同的區(qū)域,通過多個(gè)線程觸發(fā)全局標(biāo)記階段。標(biāo)記階段完成后,G1 知道哪個(gè)區(qū)域可能大部分是空的,并首選該區(qū)域作為清除/刪除階段。

在 G1 收集器中,一個(gè)對(duì)象如果大小超過半個(gè)區(qū)域容量會(huì)被認(rèn)為是一個(gè)“大對(duì)象” 。這些對(duì)象被放置在老年代中,在一個(gè)被稱為“humongous region”的區(qū)域中。 啟用 G1 收集器的命令如下:

    $ java -XX:+UseG1GC

5、Epsilon 收集器

該垃圾收集器是在 Java11 中引入的,是一個(gè) no-op(無操作)收集器。它不做任何實(shí)際的內(nèi)存回收,只負(fù)責(zé)管理內(nèi)存分配。Epsilon 只在當(dāng)你知道應(yīng)用程序的確切內(nèi)存占用情況并且不需要垃圾回收時(shí)使用。啟用命令如下:

    $ java -XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC

6、Shenandoah 收集器

Shenandoah 是在 JDK12 中引入的,是一種 CPU 密集型垃圾收集器。它會(huì)進(jìn)行內(nèi)存壓縮,立即刪除無用對(duì)象并釋放操作系統(tǒng)的空間。所有的這一切與應(yīng)用程序線程并行發(fā)生。啟用命令如下:

    $ java -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC

7、ZGC 收集器

ZGC 為低延遲需要和大量堆空間使用而設(shè)計(jì),允許當(dāng)垃圾回收器運(yùn)行時(shí) Java 應(yīng)用程序繼續(xù)運(yùn)行。ZGC 收集器在 JDK11 引入,在 JDK12 改進(jìn)。在 JDK15,ZGC 和 Shenandoah 都被移出了實(shí)驗(yàn)階段。啟用 ZGC 收集器使用如下命令:

    $ java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC

靈活的垃圾收集器

Java 為我們提供了靈活的內(nèi)存管理方式,熟悉不同的可用方法有助于為正在開發(fā)或運(yùn)行的應(yīng)用程序選擇最合適的內(nèi)存管理方式。

責(zé)任編輯:未麗燕 來源: Linux中國
相關(guān)推薦

2011-07-21 14:54:26

java垃圾收集器

2023-11-16 08:00:56

Java11G1

2011-05-10 16:04:45

Java垃圾收集器

2017-09-21 14:40:06

jvm算法收集器

2020-02-25 22:01:36

理解JVM垃圾收集器

2009-10-30 10:47:48

VB.NET垃圾收集器

2024-12-30 08:03:08

2024-08-26 08:58:50

2022-04-19 11:25:31

JVMZGC垃圾收集器

2013-12-19 09:46:04

垃圾收集器

2024-03-27 10:27:35

延遲垃圾收集器

2015-06-17 14:10:52

OracleJava 9垃圾收集器

2024-03-14 09:00:00

2013-01-07 10:14:06

JavaJava枚舉

2011-12-20 10:43:21

Java

2024-05-23 12:40:06

2021-08-15 18:59:13

垃圾收集器JDK

2020-01-14 08:00:00

.NET緩存編程語言

2022-05-10 08:08:01

find命令Linux

2025-01-21 08:00:00

限流微服務(wù)算法
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)