讀Java性能權威指南(第2版)筆記14_垃圾回收A

来源:https://www.cnblogs.com/lying7/archive/2023/03/12/17207369.html
-Advertisement-
Play Games

1. 垃圾回收器 1.1. 對象可以在被需要時創建,不再使用時由JVM自動回收 1.2. GC是查找不再使用的對象,然後回收這些對象相關記憶體的過程 1.2.1. 找到不使用的對象、回收其記憶體、壓縮堆記憶體 1.3. 優化垃圾回收器比跟蹤指針引起的bug要容易得多(且耗時更少) 1.4. VM必須定期搜 ...


1. 垃圾回收器

1.1. 對象可以在被需要時創建,不再使用時由JVM自動回收

1.2. GC是查找不再使用的對象,然後回收這些對象相關記憶體的過程

1.2.1. 找到不使用的對象、回收其記憶體、壓縮堆記憶體

1.3. 優化垃圾回收器比跟蹤指針引起的bug要容易得多(且耗時更少)

1.4. VM必須定期搜索堆中不使用的對象

1.4.1. 從GC根(GC root)對象開始搜索,GC根是可以從堆外被訪問的對象,主要包括線程棧和系統類

1.4.2. 當GC演算法找到不使用的對象時,JVM會回收這些對象占用的記憶體,並將這些記憶體分配給其他對象

2. 垃圾回收器運行多個線程

2.1. 一組執行應用程式邏輯,通常被稱為mutator線程

2.1.1. 作為應用程式邏輯的一部分會改變對象

2.2. 另一組執行GC,當GC線程跟蹤對象引用(用於回收對象)或者在記憶體中移動對象時,它們必須確保應用程式線程不使用這些對象

2.3. 所有線程都停止運行的停頓被稱為STW停頓(stop-the-world pause)

2.3.1. 儘量減少這些停頓是優化GC的重中之重

3. 垃圾回收器分代

3.1. 分代理由

3.1.1. 大量對象(有時甚至是大多數對象)是臨時對象

3.1.2. 很多對象的使用時間很短

3.2. 老年代

3.2.1. old generation或tenured generation

3.2.2. Full GC

3.2.2.1. 一般會造成應用程式線程較長時間的停頓

3.3. 新生代

3.3.1. young generation

3.3.2. 只是整個堆的一部分

3.3.2.1. 對象首先在新生代中分配

3.3.2.2. 比處理整個堆要快

3.3.3. Eden空間

3.3.3.1. 占據了新生代的絕大多數空間

3.3.3.2. 最初對象會被分配到Eden空間

3.3.3.3. 不再使用的對象被丟棄

3.3.3.4. 仍在使用的對象被移動到一個Survivor空間或者晉升到老年代

3.3.4. Survivor空間

3.3.4.1. 在回收結束時,Eden空間和一個Survivor空間被清空,新生代中剩餘的對象都被壓縮到另一個Survivor空間中

3.3.5. Minor GC

3.3.5.1. Young GC

3.3.5.2. 當新生代被填滿時,垃圾回收器會停止所有的應用程式線程,並清空新生代

3.3.5.3. 不再使用的對象被丟棄

3.3.5.4. 仍在使用的對象被移到其他地方

4. 併發回收器

4.1. concurrent collector

4.2. 低停頓(low-pause)回收器

4.3. 無停頓(pauseless)回收器

4.4. 查找的代碼可以在不停止應用程式線程的情況下運行

4.5. 代價是應用程式總體上使用更多的CPU時間

4.5.1. 避免長時間停頓是以消耗額外的CPU周期為代價的

4.6. 更難優化以達到最佳性能

5. 選型

5.1. 單個請求會受停頓時間的影響,尤其是Full GC時較長時間的停頓

5.1.1. 減少停頓對響應時間的影響,那麼併發回收器可能更合適

5.2. 如果平均響應時間比異常值(例如第90百分位響應時間)更重要

5.2.1. 併發回收器可能會產生更好的結果

6. GC演算法

6.1. Serial垃圾回收器

6.1.1. 最簡單的回收器

6.1.2. 在只有一個CPU可用且額外的GC線程會幹擾應用程式的情況下使用(而且是預設的)

6.1.2.1. 只有一個核心(甚至是以兩個CPU形式出現的超線程核心)的虛擬機和Docker容器讓這個演算法又有了使用的意義

6.1.3. 使用單線程來處理堆

6.1.3.1. 處理堆時會停止所有的應用程式線程(不管是Minor GC還是Full GC)

6.1.3.2. 在Full GC期間,它將完全壓縮老年代

6.1.4. -XX:+UseSerialGC標誌可以開啟

6.1.5. -XX:-UseSerialGC並不會禁用

6.1.5.1. 禁用需要設定另外一個垃圾回收器

6.2. CMS垃圾回收器

6.2.1. 第一個併發垃圾回收器

6.2.1.1. JDK 8中相當流行

6.2.1.2. 自JDK 11被正式廢棄,而且不鼓勵在JDK 8中使用

6.2.2. 會在Minor GC的過程中停止所有的應用程式線程

6.2.3. 主要缺陷是它不能在後臺處理過程中壓縮堆

6.2.4. -XX:+UseConcMarkSweepGC標誌開啟

6.2.4.1. 預設值是false

6.3. Throughput垃圾回收器

6.3.1. 並行回收器(parallel collector)

6.3.2. JDK8中任何有兩個或者多個CPU的64位機器的預設垃圾回收器

6.3.3. -XX:+UseParallelGC標誌

6.3.4. -XX:+UseParallelOldGC標誌

6.3.4.1. 已經過時了

6.3.4.2. 可以禁用這個標誌,只對新生代進行並行回收

6.4. G1 GC

6.4.1. 垃圾優先垃圾回收器

6.4.2. 使用併發回收策略來以最小的停頓回收堆

6.4.3. JDK 11和之後版本的預設垃圾回收器

6.4.4. -XX:+UseG1GC標誌開啟


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、初識爬蟲,requests使用 requests介紹: Request支持HTTP連接保持和連接池,支持使用cookie保持會話,支持文件上傳,支持自動響應內容的編碼,支持國際化的URL和POST數據自動編碼。requests會自動實現持久連接keep-alive # 導入模塊 import r ...
  • 資料庫的重要性不言而喻,不管是什麼系統,什麼應用軟體,也不管它們是 Windows 上的應用程式,還是 Web 應用程式,存儲(持久化)和查詢(檢索)數據都是核心的功能。 大家學習資料庫時,比如 MySQL 這個資料庫管理系統,都是在 CLI(Command Line Interface)上操作數據... ...
  • Tomcat 是 Apache 軟體基金會(Apache Software Foundation)的一個開源項目,實現了 Servlet 及 JSP 規範,可以用來部署 WEB 應用及 WebService;本文主要介紹其基本概念。 1、Tomcat 安裝 安裝 Tomcat 之前需要先安裝 Jav ...
  • 零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學習目錄 >> OpenGL ES 特效 零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學習目錄 >> O ...
  • java 線程池預設提供了幾種拒絕策略: 這幾個策略都實現了RejectedExecutionHandler,拿DiscardOldestPolicy來說,查看源碼: 核心代碼只有2行: e.getQueue().poll() 從列表裡彈出1個(最早的)任務,以便讓隊列空出1個位置 e.execut ...
  • 什麼是Git? Git是一個版本控制系統,用於跟蹤電腦文件的變化。Git是一個跟蹤電腦文件變化的版本控制系統,用於幫助協調一個項目中幾個人的工作,同時跟蹤一段時間的進展。換句話說,我們可以說它是一個促進軟體開發中源代碼管理的工具。 Git和SVN的區別 Git是分散式版本控制系統,SVN是集中式 ...
  • 廣發基金外包面試題 說說Spring AOP 說說stream流的常用API 線程池的參數 MCVV,什麼是普通讀和快照讀 redis分片模式是什麼,redis事務,分片模式下事務會生效嗎 說說rocket mq分散式事務是怎麼做的 為什麼要劃分session,怎麼解決耦合問題 說說是怎麼解決分散式 ...
  • 最近接到一個新的需求,需要上傳2G左右的視頻文件,用測試環境的OSS試了一下,上傳需要十幾分鐘,再考慮到公司的資源問題,果斷放棄該方案。 一提到大文件上傳,我最先想到的就是各種網盤了,現在大家都喜歡將自己收藏的「小電影」上傳到網盤進行保存。網盤一般都支持斷點續傳和文件秒傳功能,減少了網路波動和網路... ...
一周排行
    -Advertisement-
    Play Games
  • 基於.NET Framework 4.8 開發的深度學習模型部署測試平臺,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等應用場景,同時支持圖像與視頻檢測。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runti... ...
  • 十年沉澱,重啟開發之路 十年前,我沉浸在開發的海洋中,每日與代碼為伍,與演算法共舞。那時的我,滿懷激情,對技術的追求近乎狂熱。然而,隨著歲月的流逝,生活的忙碌逐漸占據了我的大部分時間,讓我無暇顧及技術的沉澱與積累。 十年間,我經歷了職業生涯的起伏和變遷。從初出茅廬的菜鳥到逐漸嶄露頭角的開發者,我見證了 ...
  • C# 是一種簡單、現代、面向對象和類型安全的編程語言。.NET 是由 Microsoft 創建的開發平臺,平臺包含了語言規範、工具、運行,支持開發各種應用,如Web、移動、桌面等。.NET框架有多個實現,如.NET Framework、.NET Core(及後續的.NET 5+版本),以及社區版本M... ...
  • 前言 本文介紹瞭如何使用三菱提供的MX Component插件實現對三菱PLC軟元件數據的讀寫,記錄了使用電腦模擬,模擬PLC,直至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1. PLC開發編程環境GX Works2,GX Works2下載鏈接 https:// ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 1、jQuery介紹 jQuery是什麼 jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之後又一個優秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計的宗旨是“write Less,Do More”,即倡導寫更少的代碼,做更多的事情。它封裝 ...
  • 前言 之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼 ...
  • 引言 現代的操作系統(Windows,Linux,Mac OS)等都可以同時打開多個軟體(任務),這些軟體在我們的感知上是同時運行的,例如我們可以一邊瀏覽網頁,一邊聽音樂。而CPU執行代碼同一時間只能執行一條,但即使我們的電腦是單核CPU也可以同時運行多個任務,如下圖所示,這是因為我們的 CPU 的 ...
  • 掌握使用Python進行文本英文統計的基本方法,並瞭解如何進一步優化和擴展這些方法,以應對更複雜的文本分析任務。 ...
  • 背景 Redis多數據源常見的場景: 分區數據處理:當數據量增長時,單個Redis實例可能無法處理所有的數據。通過使用多個Redis數據源,可以將數據分區存儲在不同的實例中,使得數據處理更加高效。 多租戶應用程式:對於多租戶應用程式,每個租戶可以擁有自己的Redis數據源,以確保數據隔離和安全性。 ...