深入理解Java虛擬機:Java垃圾回收器

本篇內容包括:7 種 Jvm 垃圾回收器的介紹、對比 以及 對應的 Jvm 參數設置,這 7 種包括了:Serial、ParNew 以及 Parallel Scavenge 三種新生代回收器 和 :Serial Old、Parallel Old 以及 CMS 三種老年代回收器,此外還有一個 G1 回收器是 Java 目前比較前沿的成果…

一、Jvm 垃圾回收器概述

我們前面提到了,垃圾回收器的 回收的內容、回收的時機以及回收的方式,接下來我們來看 Java 垃圾回收器。如果垃圾回收算法是內存回收的方法論的話,那么垃圾回收器就是內存回收的具體實現了。

Jvm 的垃圾回收器根據場景和實現方式可以分為新生代回收器和老年代回收器,新生代回收器與老年代回收器可以搭配使用。

  • 新生代回收器包括:Serial、ParNew 以及 Parallel Scavenge;
  • 老年代回收器包括:Serial Old、Parallel Old 以及 CMS;
  • 此外,Java7 update 4(第七版第四個更新升級包)之后引入了一個 G1 收集器。

Ps:不同垃圾回收器適合于不同的內存區域,有的兩個垃圾回收器之間也可以配合使用!

在這里插入圖片描述


二、新生代回收器

1、Serial 收集器

Serial 收集器是最基礎且歷史最悠久的垃圾收集器,作為單線程工作的收集器。Serial 會在它工作時要求暫停用戶所有的其他線程(Stop-the-World 機制)。采用的是 “標記-復制” 算法。垃圾清理時,Serial 回收器不存在線程間的切換,因此,在單 CPU 的環境下,垃圾清除效率比較高。

Serial / Serial Old收集器運行示意圖

雖然 Serial 收集器是最基礎最老的收集器,但是迄今為止 HotSpot 虛擬機運行在 Client 模式下的默認的新生代垃圾收集器!相較于其他收集器,Serial 具有以下 3 個優點:

  1. 簡單高效;
  2. 所有收集器中額外內存消耗最少;
  3. 針對內存幾十兆或一兩百兆的新生代,停頓時間能控制在一百毫秒內。

Ps:這里需要注意的一點是 Serial 收集器和 Serial Old 收集器在垃圾收集時不是單線程的,通常所描述的"單線程"是指的垃圾回收時暫停其他所有的工作線程。

2、ParNew 收集器

ParNew 收集器大致可以理解為是 Serial 收集器的多線程版本,因為 ParNew 收集器除了采用并行回收的方式執行內存回收外,與 Serial 收集器之間幾乎沒有任何區別。ParNew 收集器在年輕代中同樣也是采用復制算法、Stop-the-World 機制。

ParNew /Serial Old收集器運行示意圖

ParNew 收集器是很多版本 Jvm(包括 HotSpot)運行在 Server 模式下新生代的默認垃圾收集器。

ParNew 收集器運行在多 CPU 的環境下,由于可以充分利用多 CPU、多核心等物理硬件資源優勢,可以更快的完成垃圾收集,提升程序的吞吐量。但是在單個 CPU 的環境下,ParNew 收集器不比 Serial 收集器更高效,雖然 Serial 收集器是基于串行回收,但是由于 CPU不需要頻繁的切換,因此可以有效避免多線程交互過程中產生的一些額外開銷。

Ps:除了 Serial 外,目前只有 ParNew GC 能與 CMS 收集器配合工作。

3、Parallel Scavenge 收集器

Parallel Scavenge 收集器同 ParNew 收集器一樣,也是采用 “標記-復制” 算法,且為能夠并行收集的多線程收集器。

Parallel Scavenge 的特點是其關注重點為吞吐量,高吞吐量則可以高效率地利用 CPU 時間,盡快完成程序的運算,但也就是說它的線程單次停止時間可能更長,因此適用于后臺計算型任務程序:Parallel Scavenge /Parallel Old收集器運行示意圖

Ps:如果虛擬機完成某個任務,用戶代碼加上垃圾收集總共耗費了 100 分鐘,其中垃圾收集花掉 1 分 鐘,那吞吐量就是 99% :
吞吐量=運行用戶代碼時間/運行用戶代碼時間+運行垃圾回收時間吞吐量=運行用戶代碼時間/運行用戶代碼時間+運行垃圾回收時間 吞吐量=運行用戶代碼時間/運行用戶代碼時間+運行垃圾回收時間


三、老年代回收器

1、Serial Old 收集器

Serial Old 是 Serial 收集器的老年代版本,采用“標記-整理”算法,單線程收集器,也是給 Client 模式下的虛擬機使用。

Serial / Serial Old收集器運行示意圖

Ps:在 Jdk1.5 及其以前,它常與 Parallel Scavenge 回收器配合使用,達到較好的吞吐量,另外它也是 CMS 回收器在 Concurrent Mode Failure 時的后備方案。

2、Parallel Old 收集器

Parallel Old 回收器是 Parallel Scavenge 回收器的老生代版本,屬于多線程回收器,采用“標記-整理”算法。Parallel Old 回收器和 Parallel Scavenge 回收器同樣考慮了吞吐量優先這一指標,非常適合那些注重吞吐量和 CPU 資源敏感的場合。

Parallel Scavenge /Parallel Old收集器運行示意圖

Ps:在注重吞吐量以及 CPU 資源敏感的場合,可以優先考慮 Parallel Scavenge 加 Parallel Old 收集器

3、CMS 收集器

CMS 收集器,是一種以獲取最短回收停頓時間為目標的收集器,其縮寫含義為 Concurrent Mark Sweep,Mark Sweep 指的是“標記-清除”算法,在互聯網網站、B/S 架構的中常用的收集器就是 CMS,因為系統停頓的時間最短,給用戶帶來較好的體驗。

CMS 收集器運行示意圖

CMS收集器的運作過程分為4個步驟,包括:

  • 初始標記(短暫),僅僅只是標記一下 GCRoots 能直接關聯到的對象,速度很快;
  • 并發標記(和用戶的應用程序同時進行),進行 GCRoots 追蹤的過程,標記從 GCRoots 開始關聯的所有對象開始遍歷整個可達分析路徑的對象。這個時間比較長,所以采用并發處理(垃圾回收器線程和用戶線程同時工作);
  • 重新標記(短暫),為了修正并發標記期間因用戶程序繼續運作而導致標記產生變動的那一部分對象的標記記錄,這個階段的停頓時間一般會比初始標記階段稍長一些,但遠比并發標記的時間短;
  • 并發清除(和用戶的應用程序同時進行):垃圾回收

整個過程中耗時最長的并發標記和并發清除過程收集器線程都可以與用戶線程一起工作,所以,從總體上來說,CMS 收集器的內存回收過程是與用戶線程一起并發執行的。


四、G1 收集器

G1(Garbage-First)收集器是最前沿的成果之一,在Java7 update 4之后引入(Jdk7 的第 4 個版本),是一款面向服務端應用的垃圾收集器。在多 CPU 和大內存的場景下有很好的性能。HotSpot 開發團隊賦予它的使命是未來可以替換掉 CMS 收集器。

G1 是一個分代的,增量的,并行與并發的“標記-復制”垃圾回收器。它的設計目標是為了適應現在不斷擴大的內存和不斷增加的處理器數量,進一步降低暫停時間(pause time),同時兼顧良好的吞吐量。

G1收集器的優勢:

  • 獨特的分代垃圾回收器,分代GC: 分代收集器,同時兼顧年輕代和老年代;

  • 使用分區算法,不要求 eden,年輕代或老年代的空間都連續;

  • 并行性: 回收期間,可由多個線程同時工作,有效利用多核cpu資源;

  • 空間整理: 回收過程中,會進行適當對象移動,減少空間碎片;

  • 可預見性: G1 可選取部分區域進行回收,可以縮小回收范圍,減少全局停頓。

G1 收集器運行示意圖

G1收集器的階段分以下幾個步驟:

  1. 初始標記(它標記了從GC Root開始直接可達的對象);

  2. 并發標記(從GC Roots開始對堆中對象進行可達性分析,找出存活對象);

  3. 最終標記(標記那些在并發標記階段發生變化的對象,將被回收);

  4. 篩選回收(首先對各個Regin的回收價值和成本進行排序,根據用戶所期待的GC停頓時間指定回收計劃,回收一部分Region)。


五、相關知識點

1、HotSpot 的 Server 和 Client 兩種模式

HotSpot 包括 Server 和 Client 兩種模式的實現:

  • Java HotSpot Client VM(-client),為在客戶端環境中減少啟動時間而優化;
  • Java HotSpot Server VM(-server),為在服務器環境中最大化程序執行速度而設計。

比較:Server VM 啟動比 Client VM 慢,運行比 Client VM 快。Server 模式的運行中,垃圾回收處理做的比較好一些。

2、設置回收器的參數

下面給出配置回收器時,經常使用的參數:

  • -XX:+UseSerialGC:在新生代和老年代使用串行收集器
  • -XX:+UseParNewGC:在新生代使用并行收集器
  • -XX:+UseParallelGC :新生代使用并行回收收集器,更加關注吞吐量
  • -XX:+UseParallelOldGC:老年代使用并行回收收集器
  • -XX:ParallelGCThreads:設置用于垃圾回收的線程數
  • -XX:+UseConcMarkSweepGC:新生代使用并行收集器,老年代使用CMS+串行收集器
  • -XX:ParallelCMSThreads:設定CMS的線程數量
  • -XX:+UseG1GC:啟用G1垃圾回收器

3、各類回收器總結

回收器回收代回收模式回收算法特點
Serial新生代單線程標記-復制簡單高效,內存消耗少, 停頓時間能控制在一百毫秒內
ParNew新生代多線程標記-復制Serial 的多線程版本
Parallel Scavenge新生代多線程標記-復制關注重點為吞吐量
Serial Old老年代單線程標記-整理同 Serial 簡單高效,內存消耗少
Parallel Old老年代多線程標記-整理同 Parallel Scavenge 適合那些注重吞吐量和 CPU 資源敏感的場合
CMS老年代多線程標記-清除并發收集、低停頓,但是會產生大量空間碎片、并發階段會降低吞吐量
G1多線程標記-復制同時兼顧年輕代和老年代,針對于大 heap

垃圾回收器的選用決定因素:應用程序的場景、硬件的制約 以及 吞吐量的需求。

  • 串行垃圾回收是最簡單的也是效率最低的,如果只是控制臺的單線程程序,簡單任務,并且機器配置不高,推薦使用。
  • 并行垃圾回收器是 64bit server 默認的垃圾回收器,一般我們工作和生產上默認不配置,都是并行垃圾回收。對于一般的不要求吞吐的應用,并且硬件資源不是太充足的情況下,并行垃圾回收器差不多能滿足需求。
  • CMS 垃圾回收器是對并行垃圾回收器的一個優化,它以 CPU 和系統資源為代價,換取 GC 的延遲。不會一 GC 就 STW,而是根據情況 STW。一定程度上是資源換取速度。
  • G1 垃圾回收器是針對于大 heap 的垃圾回收器,如果 heap 分配的足夠大,分的 region 的優先級回收策略會優先清理垃圾多的 region 并且減少了內存空間碎片,分配大對象時不會因為無法找到連續內存空間而提前觸發下一次 GC。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/535483.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535483.shtml
英文地址,請注明出處:http://en.pswp.cn/news/535483.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

oracle跨越千年處理

如果指定的兩位年份0-4950-99 如果當前 的兩位年 份是 0-49返回的日期是當前世紀返回的日期是上個世紀50-99返回的日期是下個世紀返回的日期是當前世紀 current yearSpecified DateRR FormatYY Format199527-OCT-9519951995199527-OCT-171951917200127-OCT-1720012017200127-OC…

網絡協議:什么是網絡分層的七四五

本篇內容包括:網絡分層七層、五層、四層網絡協議概念的介紹,IOS 體系結構的介紹與構成、TCP/IP體系結構的簡介及與IOS體系的關系 以及五層體系結構的介紹。 一、七層、五層、四層網絡協議概念 1、關于網絡協議 網絡協議,即是指計算機網絡中…

查看表空間相關命令

默認表空間數據文件大小根據DATA BLOCKS的大小有關,默認最大為32GB表空間達到32G,只能增加數據文件alter tablespace 表空間名 add datafile 數據文件路徑‘ size 500m autoextend on next 100m maxsize 10000M;未達到32G,修改數據文件的擴展…

網絡協議:一文搞懂Socket套接字

本篇內容包括:Socket 套接字的簡介、Socket 套接字的分類、Java 中的 Socket 即 java.net.ServerSocket、java.net.Socket 的使用,以及Java 使用套接字 Scoket 編程的Demo。 一、Socket 簡介 TCP(傳輸控制協議)是一種面向連接的、…

RESETLOGS

使用resetlogs選項,會把當前的日志序號(log sequence number)重設為1,并拋棄所有日志信息。在以下條件時需要使用resetlogs選項: 在不完全恢復(介質恢復); 使用備份控制文件。 使…

網絡協議:透徹解析HTTP協議

本篇內容包括:HTTP 協議定義及其特點概述、關于 URL 定義及分類概述、Request 請求、Response 響應 以及 瀏覽器訪問一個網站的全過程 等內容… 一、HTTP 協議概述 HTTP(HyperText Transfer Protocol) 即 超文本傳輸協議,它是一種…

oracle參數文件和口令文件

外部 審核 口令:記錄超級用戶的用戶名和口令,做sys用戶的安全審核 oracle9以后全部使用sys登錄,但需要使用as sysdba ,之前版本需要使用internal o7字典打開 只要用戶和密碼存在于口令文件,就可以以sysdba登錄&#…

innobackup備份恢復實操步驟--gtid復制(1)(1)

首先在主庫進行備份: 備份命令: Innobackupex --defaults-file/app/dbcluster/sgrdb/mysql/my19103.cnf --no-timestamp --userdbscale --passwordS6000dbscale --host10.157.43.224 --port19103 /data/backup 如果使用setsid: setsid …

Redis系列:Redis的概述與安裝

Redis(Remote Dictionary Server) 是一個使用 C 語言編寫的,開源的(BSD許可)高性能非關系型(NoSQL)的鍵值對數據庫。 本篇內容包括:Redis 簡介(為什么快?為什么單線程?優…

安裝LibreOffice和字體

#/bin/bash # Check if user is root if [ $(id -u) ! "0" ]; thenecho "Error: You must be root to run this script, please use root"exit 1 fi echo 安裝LibreOffice cd /home/ tar -zxvf LibreOffice_6.3.3_Linux_x86-64_rpm.tar.gz cd /home/LibreO…

xtrabackup備份腳本

#!/bin/sh #備份主機 remote_ip100.0.132.160 Master_ip100.20.132.158 VIP100.20.132.166 #備份用戶 userroot #密碼 password00000 # 返回年月日 backup_datedate %F # 返回時分秒 backup_timedate %H-%M-%S # 返回今天是這周的第幾天 backup_week_daydate %u backup_ok0 #備…

Redis系列:使用Redis實現分布式鎖及相關問題

分布式鎖其實就是,控制分布式系統不同進程共同訪問共享資源的一種鎖的實現。如果不同的系統或同一個系統的不同主機之間共享了某個臨界資源,往往需要互斥來防止彼此干擾,以保證一致性。 本篇內容包括:關于 Redis 與 分布式鎖&…

Redis系列:Redis持久化機制與Redis事務

Redis 是個基于內存的數據庫。那服務一旦宕機,內存中數據必將全部丟失。所以丟失數據的恢復對于 Redis 是十分重要的,我們首先想到是可以從數據庫中恢復,但是在由 Redis 宕機時(說明相關工作正在運行)且數據量很大情況…

Java基礎:Java程序設計環境

按應用范圍,Java 可分為 3 個體系,即 Java SE、Java EE 和 Java ME。Java 語言的開發運行,也離不開 Java 語言的運行環境 JRE。沒有 JRE 的支持,Java 語言便無法運行。當然,如果還想編譯 Java 程序,搞搞小開…

負載均衡策略

輪循均衡(Round Robin):每一次來自網絡的請求輪流分配給內部中的服務器,從1至N然后重新開始。此種均衡算法適合于服務器組中的所有服務器都有相同的軟硬件配置并且平均服務請求相對均衡的情況。 我們的業務web服務器都是同樣配置…

Java基礎:Java數據類型

Java 是一種強類型語言,這就意味著必須為每一個變量聲明一種類型。在 Java 中基本數據類型共有 8 種,包括 4 種整型、2 種浮點型、1 種用于表現 Unicode 編碼的字符單元的字符類型 char 和一種用于表示真值的 boolean 類型 ~ 本篇主要記錄內容包括&#…

TCP連接的建立與終止

TCP連接的建立與終止 1.三次握手 TCP是面向連接的,無論哪一方向另一方發送數據之前,都必須先在雙方之間建立一條連接。在TCP/IP協議中,TCP協議提供可靠的連接服務,連接是通過三次握手進行初始化的。三次握手的目的是同步連接雙方…

日常問題:MySQL排序字段數據相同不能分頁問題

【問題日期】 2022-11-14 22:45:12 【問題描述】 MySQL 排序字段數據相同不能分頁問題:在分頁查詢數據時,按創建時間排序,由于數據是批量創建的,導致部分數據創建時間一樣,而此時分頁查詢數據,翻頁后出現…

數據缺失值處理

數據缺失值處理 In [1]: import pandas as pd import numpy as np from sklearn.ensemble import RandomForestRegressor,RandomForestClassifier from sklearn.preprocessing import StandardScaler from sklearn.impute import SimpleImputer In [2]: df pd.DataFrame() df[…