05、GC基礎知識

JVM程序在跑起來之后,在數據的交互過程中,就會有一些數據是過期不用的,這些數據可以看做是垃圾,JVM中,這些垃圾是不用開發者管的,它自己會有一套垃圾回收系統自動回收這些內存垃圾,以備后面繼續使用。這就是JVM的GC系統。GC這塊知識很多,這篇文章主要是了解下它的基本知識點
1、如何定位垃圾
2、GC的回收算法
3、GC的內存分代模型

1、如何定位垃圾

  • 引用計數法:它的核心思想是,沒有引用指向的內存區域是垃圾區域,GC可以回收這個區域。具體的做法是,每當有引用指向這個對象,它對應的計數就+1,當有引用取消了對它的指向就-1,如果計數為0的時候,它就會被GC自動回收。
    • 它的問題:引用計數法如果碰到循環引用的垃圾,就會失效。比如a引用b,b也引用a,但是他們整體的引用在程序中已經釋放掉了,但是由于它們互相引用,引用計數永遠不可能為0,所有它們永遠不會被回收。
    • 它的解決方案是如下的“根可達算法”來解決
  • 根可達算法:它的核心思想是,如果一個對象沒有根對象直接或間接的指向它,那它就是垃圾。具體的是要弄清楚哪些是屬于根對象
    根對象
    • 根對象:
      • JVM Stacks里的對象(線程棧變量)
      • Native Method Stack(本地方法棧的對象)
      • Run-time Constant Pool(常量池里的對象)
      • Static Refercens In Method Area(方法區的靜態對象)

      程序跑起來也就是main函數跑起來之后,它里面需要用到的對象都算是根對象,如線程棧變量和本地方法棧變量,然后就是用Static申請的對象,如果是字符串類型那就是常量池數據,如果是靜態的引用那就是方法區的對象,這些算是根對象。它們直接或是間接引用的對象都不能算是垃圾。

2、GC回收算法

  • 標記清楚算法
    • 具體實現:第一階段根據GCRoot規則把存活對象進行標記,第二階段會清楚掉沒有標記的對象
    • 特點:根據它的工作特點可以發現,清除之后留下來的內存不連續,會產生內存碎片。需要經過兩次掃描,效率低
    • 使用場景:適用于對象存活時間長的情況,不如old區
  • 拷貝算法
    • 具體實現:首先把內存區域分為兩部分A,B區域,一部分空置著(比如B區),等另外一部分(A區)滿了之后,直接把A區存活對象復制到B區,然后把A區數據全部清除
    • 特點:內存位置連續,無碎片化,掃描一次即可,但是需要移動和復制內存對象,且浪費空間,有效利用率只有50%
    • 使用場景:適用于對象存活時間短的場景,比如年輕代的from區和to區
  • 標記壓縮算法
  • 具體實現:它跟標記清楚算法類似,都需要經過兩次掃描,不一樣的是,第二階段并不是刪除未標記對象,而是把標記對象壓縮到內存的一端,之后清理掉其他的空間
  • 特點:位置連續,沒有碎片,內存的利用率也很高,但也是需要兩次掃描且需要把對象移動到頭部,效率偏低
  • 使用場景:適用于對象存活時間較長的情況,比如old區

3、GC內存分代模型

3.1、常見的GC,以及他們之間的組合

GC類型

Serial系列的GC是最早版本的,它都是單線程串行回收垃圾,一般針對幾十兆內存的機器

  • Serial:底層用的是復制算法+單線程,用于年輕代回收
  • Serial Old:底層用的是標記壓縮算法+但線程,用于老年代回收

PS+PO算法是JDK1.8版本以及之前版本默認的GC,他們都是并行回收的,一般能回收幾個G的內存數據

  • Parallel Scavenge:拷貝算法+并行,用于年輕代
  • Parallel Old:標記清除算法+并行,用于老年代

PN+CMS算法是較新的一種組合,它們是期望用于更大內存的回收,其中PN算法是配合CMS對年輕代回收的一種算法

  • ParNew:拷貝算法+并行計算
  • CMS:三色標記算法+并行計算
  • G1,ZGC,Shenandoah:這些都是新一代的GC,后面會具體篇幅專門介紹。

3.2、GC的分代模型

Serial系列,Parallel Scavenge,Parallel Old,ParNew,CMS,這些都是邏輯和物理上都是進行分代的,G1是邏輯上分代,但是物理上是不分代的,之后的GC如ZGC,Shenandoah他們邏輯和物理上都不分代。如果分代的話,一般分為年輕代和老年代,他們默認的占比是New:Old=1:2

  • 年輕代:Eden+2個Survival區(from+to區),它們內存占比默認是8:1:1,其中一個區域滿了就會觸發YGC。from區和to區一般只有一個區域是在使用的
  • 老年代:垃圾相對于較少,如果滿了之后會觸發FullGC
3.2.1、對象在各個分代區域的流轉規則
  • Young區的數據流轉

在Young區,如果Eden區滿了,就會觸發YGC,就會把Eden區存活的對象復制到from區,然后清除掉Eden,如果from區滿了,會把數據復制到to區,清除掉from,Young區的流轉大致如上所述。

  • Old區的數據流轉

Old 區的數據都是從Young流轉過來的,具體的流轉條件如下所述

  • 大對象直接進入Old區(通過GC參數-XX:+MaxTenuringThreshold 來設定)
  • 動態年齡:如年齡1的占33%,年齡2的占33%,年齡3的占34%,年齡2+年齡3>50%,所以年齡2,3的對象同時晉升到old區
  • 分配擔保:YGC期間Survivor區空間不夠時,擔保的空間直接進入Old區
  • age年齡到了15歲時會進入Old區

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

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

相關文章

什么是戰略思想?

古今中外,關于戰略是什么?有非常多的理論,也有不同的視角。 中國最早的涉及戰略的書籍據傳是黃帝所著的《握奇文》,后有較為系統的兵法戰略書籍為周朝姜太公(亦稱姜尚、姜子牙等)所著的《六韜》&#xff0c…

2024.12.15 TCP/IP 網絡模型有哪幾層?(二)

2024.12.15 TCP/IP 網絡模型有哪幾層?(二) 上節課我們學習了網絡模型有四部分構成,有應用層、傳輸層、網絡層、網絡接口層。 生成了 IP 頭部之后,接下來要交給網絡接口層(Link Layer)在 IP 頭部的前面加上 MAC 頭部&#xff0c…

51c深度學習~合集9

我自己的原文哦~ https://blog.51cto.com/whaosoft/12750420 #傅里葉特征 (Fourier Feature)與核回歸 位置編碼背后的理論解釋 本文探討了位置編碼背后的理論基礎,特別是傅里葉特征(Fourier Feature)與核回歸(Kern…

Flutter Navigator2.0的原理和Web端實踐

01 背景與動機 在Navigator 2.0推出之前,Flutter主要通過Navigator 1.0和其提供的 API(如push(), pop(), pushNamed()等)來管理頁面路由。然而,Navigator 1.0存在一些局限性,如難以實現復雜的頁面操作(如移…

代碼隨想錄算法訓練營第三天 | 鏈表理論基礎 | 707.設計鏈表

要求太多&#xff0c;代碼量太大&#xff0c;實在難以完成 在以前聽說&#xff0c;好的程序員&#xff0c;可以在短時生成大量的代碼&#xff0c;本題只方法才只有6個&#xff0c;根本不算多 每天手敲代碼量太少&#xff0c;才是問題 #include <iostream>class MyLink…

數據冒險、控制冒險、結構冒險

計算機組成原理 數據冒險、控制冒險、結構冒險 對所有用戶&#xff08;所有程序員&#xff09;可見&#xff1a;PSW、PC、通用寄存器 PSW&#xff08;條件轉移需要用到&#xff0c;程序員使用CMP指令的時候也需要用到所以是對用戶可見&#xff09;PC&#xff08;跳轉指令需要…

基于32單片機的RS485綜合土壤傳感器檢測土壤PH、氮磷鉀的使用(超詳細)

1-3為RS485綜合土壤傳感器的基本內容 4-5為基于STM32F103C8T6單片機使用RS485傳感器檢測土壤PH、氮磷鉀并顯示在OLED顯示屏的相關配置內容 注意&#xff1a;本篇文件講解使用的是PH、氮磷鉀四合一RS485綜合土壤傳感器&#xff0c;但里面的講解內容適配市面上的所有多合一的RS…

SpringBoot【十一】mybatis-plus實現多數據源配置,開箱即用!

一、前言&#x1f525; 環境說明&#xff1a;Windows10 Idea2021.3.2 Jdk1.8 SpringBoot 2.3.1.RELEASE 正常情況下我們在開發系統的時候都是使用一個數據源&#xff0c;但是由于有些項目同步數據的時候不想造成數據庫io消耗壓力過大&#xff0c;便會一個項目對應多個數據源…

Node.js教程入門第一課:環境安裝

對于一個程序員來說&#xff0c;每學習一個新東西的時候&#xff0c;第一步基本上都是先進行環境的搭建&#xff01; 從本章節開始讓我們開始探索Node.js的世界吧! 什么是Node.js? 那么什么是Node.js呢&#xff1f;簡單的說Node.js 就是運行在服務端的 JavaScript JavaScript…

vim優化

1.編輯如下內容&#xff1a; cat > /root/.vimrc <<EOF set tabstop2 " 設置 Tab 為 2 個空格 set shiftwidth2 " 設置自動縮進為 2 個空格 set expandtab " 將 Tab 轉換為空格 " 基本設置 set number syntax on" 快捷鍵設置…

字符串性能對比

效率(1) : String.indexOf與String.contains效率測試_string contains效率-CSDN博客 結論是前者效率高&#xff0c;源碼里面conatins是使用indexof 在jdk8中contains直接調用的indexOf(其他版本沒有驗證),所以要說效率來說肯定是indexOf高,但contains也就多了一層方法棧,so 什…

移動網絡的原理

無線網絡是如何解決移動通信問題的 場景&#xff1a;用戶在一輛轎車內以150km/h的時速沿高速公路急速行駛時穿過多個無線接入網&#xff0c;用戶希望在整個旅程中保持一個與遠程應用的不間斷的TCP連接。 解決方案&#xff1a;移動節點的間接路由選擇方法可解決TCP鏈接不間斷的…

python學opencv|讀取圖像(十三)BGR圖像和HSV圖像互相轉換深入

【1】引言 前序學習過程中&#xff0c;我們偶然發現&#xff1a;如果原始圖像是png格式&#xff0c;將其從BGR轉向HSV&#xff0c;再從HSV轉回BGR后&#xff0c;圖像的效果要好于JPG格式。 文章鏈接為&#xff1a; python學opencv|讀取圖像&#xff08;十二&#xff09;BGR圖…

解決node.js的req.body為空的問題

從昨晚一直在試&#xff0c;明明之前用的封裝的axios發送請求給其他的后端&#xff08;springboot&#xff09;是可以的&#xff0c;但昨天用了新項目的后端&#xff08;node.js&#xff09;就不行。 之前用了代理&#xff0c;所以瀏覽器發送的post請求不會被攔截&#xff0c;…

【嵌入式】嵌入式面試題 36 問

1. volatile 是否可以修飾 const 是的&#xff0c;volatile 可以修飾 const。const 表示變量的值不能被修改&#xff0c;而 volatile 表示變量的值可能在程序之外被修改&#xff08;例如&#xff0c;由硬件修改&#xff09;。 將 volatile 用于 const 變量意味著該變量的值雖然…

java基礎概念49-數據結構2

一、樹 1-1、樹的基本概念 1、樹的節點 2、二叉樹 3、樹的高度 1-2、二叉查找樹 普通二叉樹沒有規律&#xff0c;不方便查找&#xff0c;沒什么作用。 1、基本概念 2、添加節點 此時&#xff0c;該方式添加形成的二叉查找樹&#xff0c;根節點就是第一個節點。 3、查找節點 4…

GhatGPT缺陷不足和商業應用

1. 引言 ChatGPT的興起&#xff1a; 2022年末推出&#xff0c;迅速在自然語言處理和人工智能領域引起廣泛關注。數億用戶體驗其強大智能&#xff0c;感嘆機器智能的飛速發展。 存在的缺陷&#xff1a; 事實性錯誤&#xff1a;生成的文本中包含錯誤信息。無法實時更新&#xff1…

【Linux】Macvlan介紹及LInux下例子實現

Macvlan Macvlan 是一種網絡虛擬化技術&#xff0c;允許在同一物理網絡接口上創建多個虛擬網絡接口&#xff0c;每個虛擬接口都有自己獨立的 MAC 地址。這對于需要在同一物理主機上運行多個網絡隔離的應用程序或容器時非常有用。 Macvlan 的特點和用途 獨立的 MAC 地址 每個 …

Jackson @JsonInclude 注解

1. 概述 Jackson 是一個著名的Java庫&#xff0c;以轉換Java對象為JSON格式以及從JSON反序列化回Java對象而聞名。有時候&#xff0c;我們可能希望僅在某些字段滿足特定條件時才將其包含在JSON輸出中&#xff0c;而Jackson的JsonInclude注解正是為此目的量身定制的。 JsonInc…

12.12 枚舉 共用體 數據結構 創建順序表

1.思維導圖 2. 創建順序表 1>頭文件 test.h #ifndef __TEST_H__ #define __TEST_H__#include<stdlib.h> #include<stdio.h> #include<string.h>#define MAX 30 //typedef int datatype;typedef struct sequence {int data[MAX];int len;}seqlist,*se…