讀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 MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...