Hotspot JVM垃圾回收器

来源:http://www.cnblogs.com/yulinfeng/archive/2017/07/15/7188609.html
-Advertisement-
Play Games

前兩篇《JVM入門——運行時數據區》《JVM常見垃圾回收演算法》所提到的實際上JVM規範以及常用的垃圾回收演算法,具體的JVM實現實際上不止一種,有JRockit、J9等待,當然最有名當屬HotSpot JVM。下麵是HotSpot JVM的整體架構圖,本文著重介紹HotSpot中的垃圾回收器(Garb ...


  前兩篇《JVM入門——運行時數據區》《JVM常見垃圾回收演算法》所提到的實際上JVM規範以及常用的垃圾回收演算法,具體的JVM實現實際上不止一種,有JRockitJ9等待,當然最有名當屬HotSpot JVM。下麵是HotSpot JVM的整體架構圖,本文著重介紹HotSpot中的垃圾回收器(Garbage Collector)。

  現有的HotSpot垃圾回收器以及之間的關係和應用範圍如下圖所示:

  其中G1 GC非常顯眼的處於新生代和老年代之間,可以猜測這個G1 GC可同時運用在新生代和老年代,確實可以說G1是一個劃時代新概念GC

  在介紹上面的垃圾回收器之前要先說明JVM虛擬機的Client模式和Server模式,Java所能做的事一是做客戶端簡單說就是GUI桌面應用程式,二是可以用作伺服器端。兩種模式Client模式啟動快,啟動後性能較差,Server模式啟動慢,啟動後性能較高。

Serial GC-XX:+UseSerialGC,複製演算法,新生代

  這是一個比較古老的垃圾收集器,我理解它為簡單粗暴,簡單粗暴的方法往往可以應對簡單的環境,事實上Serial GCClient模式下正是如此。它是一個串列的垃圾收集器,串列意味著就算是有多核處理器也不會有多個線程來並行回收,在串列的同時,其它的正常工作線程也要停止工作,稱為“Stop the world”。這實際很好理解,你在清掃垃圾的時候,總不希望有人同時在丟垃圾吧。當然Serial GC在如今的HotSpot JVMServer模式下已經幾乎廢棄。另外,它工作使用垃圾回收的複製演算法工作在Java堆的新生代。   

ParNew GC-XX:+UseParNewGC複製演算法新生代

  ParNew GC實際上是Serial GC的多線程版本。上面提到了Serial GC即使是多核CPU的環境下也是單線程進行垃圾記憶體的回收。此垃圾收集器側可以做到多線程環境下進行垃圾記憶體的回收,這個多線程也僅僅是垃圾回收的多線程,而不是與用戶線程併發執行。並且只有它能與CMS老年代的垃圾回收器配合使用,而CMS又恰恰是劃時代意義的垃圾回收器,所以當JVM的老年代垃圾回收器是CMS的話,新生代的垃圾回收器通常是ParNew GC

Parallel GC-XX:+UseParallelGC,複製演算法,新生代)

  它有點和ParaNew GC類似,從名字上來看也是並行的多線程收集器。我們之前提到過,在進行GC的過程中要“Stop the world”,停頓時間越短當然越好,很多垃圾回收器(包括前兩個)關註的就是如何提高停頓時間。而Parallel GC關註的則是吞吐量。它關註的是垃圾回收的整體耗時,如果垃圾回收所占用的整體耗時較短,則吞吐量高,CPU就能將越多的時間用於任務的執行上,(吞吐量 任務運行時間 (任務運行時間 垃圾回收時間))

Serial Old GC-XX:+UseSerialOldGC,標記-壓縮演算法,老年代)

  它是Serial GC的老年代版本,同樣也是單線程,也能與Parallel GC配合使用作為它的老年代GC

Parallel Old GC-XX+UseParallelOldGC,標記-壓縮演算法,老年代)

  為了避免如果在新生代選擇了Parallel GC而老年代則只有選擇Serial Old GC的困境,出現了Parallel GC的老年代版本——Parallel Old GC。故如果在一些需要高吞吐量的常量利用Parallel GCParallel Old GC組合將會是一個很好的選擇。

☆Concurrent Mark Sweep(CMS) GC -XX:+UseConcMarkSweepGC,標記-清除演算法,老年代)

  CMS GC幾乎占據著JVM老年代垃圾收集器的半壁江山,它劃時代的意義就是垃圾回收線程幾乎能用戶線程做到同時工作。幾乎是因為它還是不能做到完全不需要“Stop the world”,只是它儘可能的縮短了停頓時間。

它的整個垃圾回收過程可分為以下4個步驟:

  1. 初始標記
  2. 併發標記
  3. 重新標記
  4. 併發清理

  這4個步驟初始標記重新標記需要進行短暫的“Stop the world”,併發標記的過程實際上就是和用戶線程同時工作,也就是一邊丟垃圾,一邊打掃,這樣就會帶來一個問題,如果垃圾的產生是在標記後發生,那麼這次垃圾就只有等到下次再回收。當然等到標記完了過後垃圾自然不會和用戶線程產生衝突,而清理過程就能和用戶線程同時處理了。對於此垃圾回收器有一個比較顯著且不可避免的一個問題就是它所採用的是標記-清除演算法,也就是說它不同會壓縮存活的對象,這樣就會帶來記憶體空間碎片化的問題,如果出現需要分配一個連續的較大的記憶體空間則只能觸發一次Full GC。上一篇JVM常見垃圾回收演算法中談到了在新生代的垃圾回收稱為“Minor GC”,老年代的垃圾回收稱為“Major GC”,而“Full GC”則是在整個堆上觸發一次垃圾回收,可想而知代價會相當高,而且此時不得不暫停用戶線程,只能針對具體使用場景通過調整CMS GC的參數對其進行調整優化。

Garbage-First(G1) GC(-XX:+UseG1GC)

  G1 GC較之前所有的垃圾回收器都不同,從開頭的第二幅圖就能看出,它涵蓋了新生代和老年代,或者說僅僅是從邏輯上還保留新生代老年代這種說法,實際上它已不存在記憶體分代,它在JDK6中僅僅是實驗版,在JDK7u4過後才正式商用,對於此垃圾回收器我將會單獨對其講解,另外它的論文地址在:http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.63.6386&rep=rep1&type=pdf


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

-Advertisement-
Play Games
更多相關文章
  • 在web開發中,靜態資源的訪問是必不可少的,如:圖片、js、css 等資源的訪問。 spring Boot 對靜態資源訪問提供了很好的支持,基本使用預設配置就能滿足開發需求。 一、預設靜態資源映射 Spring Boot 對靜態資源映射提供了預設配置 Spring Boot 預設將 / 所有訪問映射 ...
  • 在使用spring boot過程中,可以發現項目中只需要極少的配置就能完成相應的功能,這歸功於spring boot中的模塊化配置,在pom.xml中依賴的每個Starter都有預設配置,而這些預設配置足以滿足正常的功能開發。 如果需要修改自定義修改預設配置,spring boot 提供了很簡便的方 ...
  • 一 概述 1.目錄進入點 目錄進入點是文件在壓縮文件中的映射,代表壓縮文件。壓縮文件時,創建目錄進入點,將文件寫入該目錄進入點。解壓時,獲取目錄進入點,將該目錄進入點的內容寫入硬碟指定文件。 如果目錄進入點是一個文件夾,在命名時必須以路徑分隔符結尾,在Window操作系統中名稱分隔符為“/”。 2. ...
  • 什麼是電腦程式設計? 簡單的說,它就是告訴電腦要做什麼。電腦可以做很多事情,但是不太擅長自主思考,程式員需要像給小孩子喂飯一樣告訴它具體的細節,並且使電腦能夠理解的語言——演算法。 演算法(Algorithm)是指解題方案的準確而完整的描述,是一系列解決問題的清晰指令,演算法代表著用系統的方法描述 ...
  • Snapman集合了TCC編譯器可以直接編譯執行C語言腳本,其腳本執行效率和C#編譯程式進行效率對比,包括下麵4方面: 1、函數執行效率 2、數字轉換成字元串 3、字元串的疊加 4、MD5演算法 這是C#代碼: using System; using System.Collections.Generi ...
  • 安裝Python-Windows 在開始Python編程前,需要先安裝Python環境。Python安裝包可以到Python的官網下載,官網地址是https://www.python.org/,如果想直接跳過關於Python的介紹相關直接下載安裝包,則可以直接訪問https://www.python ...
  • 最近在折騰Django的WSGI應用,雖然Django自帶的runserver很方便,但是對於複雜的功能它就無能為力了。 首先在Windows上遇到坑了,然後在windows10自帶的Ubuntu遇到坑了,最後在虛擬機上總算解決了。 待補充 ...
  • Java程式預設輸出為Console,如果要想將Console輸出結果保存到文件中,則需要做如下配置: 在JAVA程式上右鍵--> Run As --> Run Configurations 選擇Common視窗,設置文件保存路徑,以及是否以追加方式保存console輸出到文件。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...