第三章 JVM記憶體回收區域+對象存活的判斷+引用類型+垃圾回收線程

来源:http://www.cnblogs.com/java-zhao/archive/2016/02/05/5183048.html
-Advertisement-
Play Games

註意:本文主要參考自《深入理解Java虛擬機(第二版)》 說明:查看本文之前,推薦先知道JVM記憶體結構,見《第一章 JVM記憶體結構》 1、記憶體回收的區域 堆:這是GC的主要區域 方法區:回收兩樣東西 無用的類 廢棄的常量 棧和PC寄存器是線程私有區域,不發生GC 2、怎樣判斷對象是否存活 垃圾回收:


註意:本文主要參考自《深入理解Java虛擬機(第二版)》

說明:查看本文之前,推薦先知道JVM記憶體結構,見《第一章 JVM記憶體結構

1、記憶體回收的區域

  • 堆:這是GC的主要區域
  • 方法區:回收兩樣東西
    • 無用的類
    • 廢棄的常量
  • 棧和PC寄存器是線程私有區域,不發生GC

 

2、怎樣判斷對象是否存活

垃圾回收:回收掉死亡對象所占的記憶體。判斷對象是否死亡,有兩種方式:

  • 引用計數法
    • 原理:給對象添加一個引用計數器,每當有一個地方引用它時,計數器值+1;引用失效時,計數器值-1
    • 實際中不用,不用的兩個原因
      • 每次為對象賦值時,都要進行計數器值的增減,消耗較大
      • 對於A、B相互引用這種情況處理不了(這一點是不用的主要原因)
  • 可達性分析(跟蹤收集)
    • 原理:從根集合(GC Roots)開始向下掃描,根集合中的節點可以到達的節點就是存活節點,根集合中的節點到達不了的節點就是將要被回收的死亡節點,如下圖中的A/B/C是存活節點,D/E是死亡節點:

    • 根集合中的節點包括:簡單來講,就是全局性的引用(常量和靜態屬性)和棧引用(下邊第一、三)
      • Java棧中的對象引用(存在於局部變數表中,註意:局部變數表中存放的是基本數據類型和對象引用
        • 這是垃圾回收最多考慮的地方,所以有時,我們也會將死亡對象稱為"沒有引用指向的對象"
      • 方法區中:常量+靜態(static)變數
      • 傳到本地方法中,還沒有被本地方法釋放的對象引用

 

3、3種引用類型

  • 強引用(Strong Reference):A a = new A();//a是強引用
  • 軟引用(Soft Reference):當記憶體不足時,釋放軟引用所引用的對象;當記憶體足夠時,就是一個普通對象(強引用)
  • 弱引用(Weak Reference):弱引用對象只能存活到下一次垃圾回收之前,一旦發生垃圾回收,立刻被回收掉

 

4、方法區的回收

  • 廢棄常量:例如,沒有任何一個引用指向常量池中的"abc"字元串,則"abc"字元串被回收
  • 無用的類:滿足以下三個條件
    • Java堆中不存在該類的任何實例
    • 載入該類的ClassLoader被回收
    • 該類的Class對象沒有在任何地方被引用

註意:

  • 在實際開發中,儘量不用JSP去做前端,而是用velocity、freemarker這樣的模板引擎去做
  • 與類相關常用的三個參數:
    • -XX:+PrintClassHistogram:輸出類統計狀態
    • -XX:-TraceClassLoading:列印類載入信息
    • -XX:-TraceClassUnloading:列印類卸載信息 View Code

 

5、垃圾回收線程

系統的垃圾回收是由垃圾回收線程來檢測操作的,該線程是一個後臺線程(daemon thread)。

5.1、後臺線程與我們使用的前臺線程而言,有一個特點:當JVM中的前臺線程數量為0時,後臺線程自動消亡。可以這樣講,後臺線程依托於前臺線程而存在。

5.2、垃圾回收線程為什麼要設置成為後臺線程呢?

我們想一下,當前臺一個線程都沒有時,垃圾還會有嗎?或者說垃圾回收還有必要嗎?答案是沒有必要,所以此時垃圾回收線程也就失去了存活的意義。

所以可以這樣講,將一個線程是否設置為後臺線程,就看這條線程在沒有其他線程存在的情況下,是否還有存活的意義

例如,在我們使用Apache mina2做RPC時,我們在消息的接收端直接開啟一個後臺線程啟動服務來接受消息發送端發來的消息事件請求就可以。試著去想,如果在整個JVM中只有當前的這一個後臺線程了,那麼這個線程還有必要存活下來嗎?當然沒有必要,因為消息永遠都不會再發送了(前臺線程都沒了)

 


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

-Advertisement-
Play Games
更多相關文章
  • 說明:垃圾回收演算法是理論,垃圾收集器是回收演算法的實現,關於回收演算法,見《第四章 JVM垃圾回收演算法》 1、七種垃圾收集器 Serial(串列GC) ParNew(並行GC) Parallel Scavenge(並行回收GC) Serial Old(MSC)(串列GC) CMS(併發GC) Paral
  • 今天分享一個 企業級的通用鏈表庫設計和一個簡單字元串設計. 封裝一個簡單的開發框架還是比較麻煩的, 或者說說封裝一個簡單的基庫都挺麻煩的. 全當分享吧. 簡單扯一點,封裝庫其實難點在 前期是設計,中期是演算法,瓶頸在結構和語法解析上.
  • Java Magic. Part 1: java.net.URL @(Base)[JDK, url, magic, 黑魔法] " 英文原文 " 廢話不多說,首先我們看如下代碼: 代碼的第3行和第5行分別會輸出什麼呢? 當然不會是true, 如果是true的話,這篇文章也就不會有java黑魔法的尾碼了
  • 一.通配符上限和通配符下限接受的類型 通配符上限:<? extends T> 通配符下限:<? super T> 以下代碼是測試結果,註釋為解釋說明 1 package xayd.hjj; 2 3 import java.util.ArrayList; 4 import java.util.List
  • 我們知道list存儲的是有序不唯一的元素。 set存儲的是無序唯一的元素。 那麼下麵看一個例子吧: package CollectionPart; import java.util.HashSet; import java.util.Set; public class HashSet1 { publ
  • Python可以說是爬網的利器,本文主要介紹了一些python來模擬http請求的一些方法和技巧。 Python處理請求的類庫有兩個,urllib,urllib2。 這兩個類庫並不是一個類庫的兩個不同版本,urllib主要用來處理一些url相關的內容,發送請求的時候,請求對象只能是一個url。url
  • 說明:在閱讀本篇之前,需要知道怎麼判斷對象的存活與否,見《第三章 JVM記憶體回收區域+對象存活的判斷+引用類型+垃圾回收線程》 註意:本文主要參考自《分散式Java應用:基礎與實踐》,與《深入理解Java虛擬機(第二版)》中的一些說法有一些不同,但是原理一致 1、三種垃圾回收演算法 標記-清除(年老代
  • 在C++中的輸出的有關設置包含在頭文件“iomanip”中,首先看看裡面包含的一些函數: 為了實現保留小數點後N位,並以四捨五入的方式輸出,需要用到setprecision和fixed。 //eg:求半徑為r的圓的面積 ;輸出:保留小數點後七位,四捨五入輸出 #include"iostream" #
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...