JVM 第四部分—垃圾回收相關概念 2

System.gc()

  • 在默認情況下,通過System.gc()或者Runtime.getRuntime().gc()的調用,會顯式觸發Full GC,同時對老年代和新生代進行回收,嘗試釋放被丟棄對象占用的內存

  • 然而System.gc()調用附帶一個免責聲明,無法保證對垃圾收集器的調用。

  • jvm實現者可以通過System.gc()調用來決定jvm的GC行為。而一般情況下,垃圾回收是自動進行的,無須手動觸發,否則就太過于麻煩了。在一些特殊情況下,比如我們在編寫一個性能基準,我們可以在運行之前調用System.gc()

  • 方法3沒有GC,方法4GC。因為變量雖然只在代碼塊里面起作用,但是在方法3的局部變量表里還存在著,而方法4局部變量表里,value覆蓋了buffer

請添加圖片描述

請添加圖片描述

請添加圖片描述

內存溢出

請添加圖片描述

請添加圖片描述

請添加圖片描述

內存泄露

請添加圖片描述

請添加圖片描述

請添加圖片描述

STW—Stop the World

  • 指的是GC事件發生過程中,會產生應用程序的卡頓。停頓產生時整個應用程序線程都會被暫停,沒有任何響應,有點像卡死的感覺,這個停頓稱為STW
    • 可達性分析算法中枚舉根節點(GC Roots)會導致所有Java執行線程停頓。
      • 分析工具必須在一個能確保一致性的快照中進行
      • 一致性指整個分析期間整個執行系統看起來像被凍結在某個時間點上
      • 如果出現分析過程中對象引用關系還在不斷變化,則分析結果的準確性無法保證
  • 被STW中斷的應用程序線程會在完成GC之后恢復,頻繁中斷會讓用戶感覺像網速不快造成電影卡帶一樣,所以我們需要減少STW的發生
  • STW和采用哪款GC無關,所有的GC都有這個事件【只要用可達性分析算法的GC】
  • 哪怕是G1也不能完全避免stop-the-world情況發生,只能說垃圾回收器越來越優秀,回收效率越來越高,盡可能地縮短了暫停時間
  • STW是JVM在后臺自動發起和自動完成的。在用戶不可見的情況下,把用戶造成的工作線程全部停掉
  • 開發中不要用System.gc()會導致STW

垃圾回收的并發與并行

請添加圖片描述

請添加圖片描述

請添加圖片描述

請添加圖片描述

請添加圖片描述

安全點和安全區域

  • 程序執行時,并非能在所有的地方都能停下來GC,只有在特定的位置停頓下來開始GC,這些位置稱為安全點(Safepoint)
  • Safe Point 的選擇很重要,不能太多,不能太少。太多會導致程序頻繁停頓,影響程序性能,太少會導致GC等待的時間太長
  • 通常會選擇一些執行時間較長的指令作為 SafePoint,比如方法調用,循環跳轉和異常跳轉等
  • 如何在GC開始時,保證所有線程都跑到最近的安全點停下來?
    • 搶占式中斷(現在沒有虛擬機用了):先中斷所有線程,如果有線程不足安全點,恢復那些線程,讓他們跑到安全點
    • 主動式中斷:設置一個中斷標志(表示要GC了,需要中斷了),線程到達安全點會輪詢這個標志,如果這個標志為真,線程就會自己中斷掛起,如果為假,線程就繼續執行
  • 安全區域:在線程處于Sleep或Blocked等不執行的狀態時,無法響應jvm的中斷請求,無法走到安全點去中斷掛起。jvm也不會等待線程喚醒。這時就需要安全區域了。安全區域指的是在一段代碼片段中,對象的引用關系不會發生變化,在這個區域中的任何位置開始GC都是安全的。可以把安全區域看成被擴展了的安全點
  • 實際執行時:
    • 1.當線程運行到SafeRegion的代碼時,首先標識這個線程進入了SafeRegion,如果這段時間內發生GC,jvm會忽略標識為SafeRegion狀態的線程【應該講錯了,應該不會忽略】
    • 2.當線程即將離開安全區域時,會檢測GC是否已經完成,如果完成了,則繼續執行。如果沒有完成,線程必須等待直到收到可以安全離開安全區域的信號為止

引用【強軟弱虛!】

  • 強引用——不會被回收
    • 使用場景:平時new對象時,使用的就是強引用,普通程序99%都是強引用
    • 一個普通對象,如果沒有被引用,或者超出了引用的作用域,或者強引用顯式賦值為null,就可以當作垃圾收集了
    • 可以直接訪問目標對象
    • 是造成內存泄露的一個原因
    • 請添加圖片描述
  • 軟引用——直到不回收直到報OOM才會回收(內存夠的時候,GC了也不回收)
    • 使用場景:緩存
    • 只被軟引用關聯著的對象,在系統將要發生OOM前,會把這些對象列進回收范圍之中進行第二次回收。如果回收之后內存還是不夠,就OOM
    • 垃圾回收器在某個時刻決定回收軟可達的對象時,會清理軟引用,并可選地把引用放到一個引用隊列
    • 請添加圖片描述
    • 獲取對象是:userSoftRef.get()
  • 弱引用——只要GC就會被回收
    • 使用場景:緩存,比如用WeakHashMap做緩存
    • 雖然一GC就會被回收,但是GC線程優先級很低,所有不一定能很快地發現持有弱引用的對象,可以存活較長時間
    • 軟引用弱引用都很適合保存那些可有可無的緩存數據。因為它可以在內存多的時候可以存活較長時間,加速系統,內存不夠的時候也可以被回收,不被占用
    • 請添加圖片描述
  • 虛引用——有了像沒有一樣,唯一目的(不是作用)是用來通知對象被回收了
    • 也稱為“幽靈引用”“幻影引用”,是所有引用中最弱的一個
    • 對象有了虛引用也不會影響它的GC過程,有沒有都一樣
    • 虛引用不能單獨使用,也不能通過虛引用獲得被引用的對象。用get()方法得到結果為null
    • 為一個對象設置虛引用的唯一目的在于跟蹤垃圾回收過程。比如能在這個對象被GC時收到一個系統通知
    • 虛引用必須和引用隊列一起用。因為當這個對象被GC時,這個虛引用會放到引用隊列里。
    • 由于虛引用可以跟蹤對象的回收時間,因此也可以將一些資源釋放操作放在虛引用中執行和記錄
    • 請添加圖片描述
    • 請添加圖片描述
  • 終極器引用
    • 請添加圖片描述

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

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

相關文章

博途PLC 面向對象系列之“雙通氣缸功能塊“(SCL代碼)

1、面向對象系列之找對象 https://rxxw-control.blog.csdn.net/article/details/136150027https://rxxw-control.blog.csdn.net/article/details/1361500272、博途PLC 面向對象系列之"單通氣缸功能塊" https://rxxw-control.blog.csdn.net/article/details/1363399…

如何使用pip安裝和生成requirements.txt

使用 pip freeze 命令可以列出當前環境中已安裝的所有 Python 包及其版本信息,并將其輸出保存到 requirements.txt 文件中。可以使用重定向 (>) 將命令的輸出寫入文件中 pip freeze > requirements.txt使用 pip install 命令可以從 requirements.txt 文件中安…

Spark(1)-wordCount入門

1. 創建Maven項目 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

JavaScript繼承 寄生組合式繼承 extends

JavaScript繼承 1、JS 的繼承到底有多少種實現方式呢? 2、ES6 的 extends 關鍵字是用哪種繼承方式實現的呢? 繼承種類 原型鏈繼承 function Parent1() {this.name parentlthis.play [1, 2, 3] }function Child1() {this.type child2 }Child1.prototype new Parent1(…

三天學會阿里分布式事務框架Seata-seata事務日志mysql持久化配置

鋒哥原創的分布式事務框架Seata視頻教程&#xff1a; 實戰阿里分布式事務框架Seata視頻教程&#xff08;無廢話&#xff0c;通俗易懂版&#xff09;_嗶哩嗶哩_bilibili實戰阿里分布式事務框架Seata視頻教程&#xff08;無廢話&#xff0c;通俗易懂版&#xff09;共計10條視頻&…

navicat16

Navicat16: 鏈接: https://pan.baidu.com/s/1vIfX0qEEL4mhBrsEzD_-lw?pwdy3fi 提取碼: y3fi 破解教程視頻&#xff1a;2023年Navicat16破解教程(小白教程)_嗶哩嗶哩_bilibili

1、云原生安全之K8S的部署與常用命令

文章目錄 1、常用命令1.1、基本信息查看1.2、日志查看與問題排查1.3、進入pod與pod內部文件導出1.4、環境搭建相關1.5、鏡像相關1.6、電腦重啟后,重啟k8s服務1.7、關于k8s的持久卷二、k8s的部署2.1、配置環境2.1.1、安裝所需工具2.1.2、修改主機名2.1.3、編輯hosts2.1.4、其他…

第13集《靈峰宗論導讀》

《靈峰宗論》導讀。諸位法師&#xff0c;諸位同學&#xff0c;阿彌陀佛&#xff01;&#xff08;阿彌陀佛&#xff01;&#xff09; 請大家打開講義第38面。 丙三、結示 這一科是《正見篇》的結示。《正見篇》主要的是要引導我們能夠正確地觀察生命的真相。生命的真相就是說…

【RISC-V 指令集】RISC-V DSP 擴展指令集介紹(二)

前言&#xff1a; 本筆記是基于對RISC-V DSP擴展指令集文檔總結的&#xff0c;《P-ext-proposal.pdf》文檔的關鍵內容如下&#xff1a; 主要介紹了RISC-V的P擴展指令集及其相關細節。 首先&#xff0c;對P擴展指令進行了概述&#xff0c;并列出了其與其他擴展重復的指令。 …

Java 的notify 可能導致死鎖原因詳解

假設有一個共享資源庫 ResourcePool&#xff0c;它內部維護了兩類資源&#xff1a;ResourceTypeA 和 ResourceTypeB。現在有兩個線程 Thread1 和 Thread2&#xff0c;它們都需要從資源庫中分別獲取一種資源才能繼續執行。Thread1 需要 ResourceTypeA 而 Thread2 需要 ResourceT…

上位機圖像處理和嵌入式模塊部署(當前機器視覺新形態)

【 聲明&#xff1a;版權所有&#xff0c;歡迎轉載&#xff0c;請勿用于商業用途。 聯系信箱&#xff1a;feixiaoxing 163.com】 過去的機器視覺處理&#xff0c;大部分都是集中在上位機、或者是服務器領域&#xff0c;這種形式維持了很長的時間。這種業務形態下&#xff0c;無…

windows 11 藍牙突然消失

解決方法&#xff1a; 1.WinX&#xff0c;點擊設備管理器 2.選中藍牙&#xff0c;右鍵更新驅動。 3.然后就可以出現了&#xff0c;如下圖

Django多個app配置多個域名訪問

環境&#xff1a;Python 3.8.1 Django 2.2.12 項目目錄結構&#xff1a; CellMiddle -- 項目根目錄 ├─task --- 需求系統 │ ├─migrations │ ├─static │ └─templates ├─logs --- 日志目錄 ├─doc --- 文檔系統 │ ├─data │ ├─migrations │ ├─st…

程序員是如何看待“祖傳代碼”的?

目錄 ?編輯 程序員是如何看待“祖傳代碼”的&#xff1f; 一、什么是“祖傳代碼”&#xff1f; 二、“祖傳代碼”的利弊 1. 可以節省開發成本 2. 可能引入安全隱患 3. 可能增加系統的維護難度 三、祖傳代對程序員的影響 1. 豐富程序員的技能和知識 2. 提高程序員的創…

python筆記_進制

二進制 進位規則&#xff1a;滿2進1 范圍&#xff1a;0,1 符號&#xff1a;以0b和0B開頭 八進制 進位規則&#xff1a;滿8進1 范圍&#xff1a;0-7 符號&#xff1a;以0o和0O開頭 十進制 進位規則&#xff1a;滿10進1 范圍&#xff1a;0-9 十六進制 進位規則&#xff…

Python——Tchisla求解器(暴力搜索法)

Tchisla簡介 最近玩到一個挺有意思的數字解密小游戲《Tchisla》&#xff0c;其規則類似算24點&#xff0c;也是利用一些數學運算和初始數字計算出目標數字&#xff0c;與算24點不同的是&#xff0c;Tchisla允許不限次數地使用一種初始數字&#xff08;1~9&#xff09;&#xf…

【VSCODE修改代碼行間距】解決方案

在我們編碼的過程中&#xff0c;由于顯示字體和顯示器的不同&#xff0c;會需要調整行間距&#xff0c;在vscode默認的選項中沒有看到設定行間距的選項&#xff0c;不過&#xff0c;可以手動修改配置檔達到目的。 1.打開設置 2.打開配置檔&#xff0c;手動進行設定 3.在選項中添…

第七十二天 漏洞發現-Web框架中間件聯動GobyAfrogXrayAwvsVulmap

第72天 漏洞發現-Web框架中間件&聯動&Goby&Afrog&Xray&Awvs&Vulmap 知識點&#xff1a; 1、Bup簡單介紹&使用說明 2、Xray簡單介紹&使用說明 3、AWWS簡單介紹&使用說明 4、Goby簡單介紹&使用說明 5、Afrog簡單介紹&使用說明 6、…

帶你玩轉java封裝和繼承(上)

上次帶大家學習了java里面比較重要的知識點類和對象&#xff0c;而且我們知道java是一門面向對象的語言&#xff0c;有時一個程序里可能有很多類&#xff0c;那么這么多類他們之間有什么聯系嗎&#xff1f;今天就帶大家學習一下java類之間的關系。 什么是繼承&#xff1a; 我們…

Linux信號【systemV】

目錄 前言 正文&#xff1a; 1消息隊列 1.1什么是消息隊列&#xff1f; 1.2消息隊列的數據結構 1.3消息隊列的相關接口 1.3.1創建 1.3.2釋放 1.3.3發送 1.3.4接收 1.4消息隊列補充 2.信號量 2.1什么是信號量 2.2互斥相關概念 2.3信號量的數據結構 2.4…