六、JVM之垃圾回收

来源:https://www.cnblogs.com/lee0527/archive/2020/01/21/12221383.html
-Advertisement-
Play Games

GC日誌 Heap PSYoungGen total 305664K, used 26214K [0x00000000eab00000, 0x0000000100000000, 0x0000000100000000) eden space 262144K, 10% used [0x00000000e ...


GC日誌

-Xmx1024m -Xms1024m -XX:+PrintGCDetails

Heap
PSYoungGen total 305664K, used 26214K [0x00000000eab00000, 0x0000000100000000, 0x0000000100000000)
eden space 262144K, 10% used [0x00000000eab00000,0x00000000ec499be8,0x00000000fab00000)
from space 43520K, 0% used [0x00000000fd580000,0x00000000fd580000,0x0000000100000000)
to space 43520K, 0% used [0x00000000fab00000,0x00000000fab00000,0x00000000fd580000)
ParOldGen total 699392K, used 0K [0x00000000c0000000, 0x00000000eab00000, 0x00000000eab00000)
object space 699392K, 0% used [0x00000000c0000000,0x00000000c0000000,0x00000000eab00000)
Metaspace used 3224K, capacity 4496K, committed 4864K, reserved 1056768K
class space used 351K, capacity 388K, committed 512K, reserved 1048576K

下麵再編寫一個代碼,觀察GC的觸發操作

public class Demo {
    public static void main(String[] args){
        Random random = new Random();
        String  val = "test";
        while (true){
            val+=val+random.nextInt(999999999)+random.nextInt(999999999);
        }
    }
}

[GC (Allocation Failure) [PSYoungGen: 2031K->488K(2560K)] 2031K->676K(9728K), 0.0013870 secs] [Times: user=0.06 sys=0.00, real=0.00 secs]
[GC (Allocation Failure) [PSYoungGen: 2441K->504K(2560K)] 2629K->1254K(9728K), 0.0010120 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC (Allocation Failure) [PSYoungGen: 1950K->488K(2560K)] 2700K->1951K(9728K), 0.0011297 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC (Allocation Failure) [PSYoungGen: 1940K->488K(2560K)] 4796K->4049K(9728K), 0.0012419 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC (Allocation Failure) [PSYoungGen: 1257K->488K(2560K)] 6212K->5443K(9728K), 0.0009412 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC (Allocation Failure) [PSYoungGen: 488K->496K(1536K)] 5443K->5491K(8704K), 0.0005513 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[Full GC (Allocation Failure) [PSYoungGen: 496K->0K(1536K)] [ParOldGen: 4995K->2727K(7168K)] 5491K->2727K(8704K), [Metaspace: 3281K->3281K(1056768K)], 0.0066911 secs] [Times: user=0.09 sys=0.00, real=0.01 secs]
[GC (Allocation Failure) [PSYoungGen: 30K->32K(2048K)] 6938K->6940K(9216K), 0.0004666 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[Full GC (Ergonomics) [PSYoungGen: 32K->0K(2048K)] [ParOldGen: 6908K->2030K(7168K)] 6940K->2030K(9216K), [Metaspace: 3281K->3281K(1056768K)], 0.0082892 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
[GC (Allocation Failure) [PSYoungGen: 19K->0K(2048K)] 6231K->6211K(9216K), 0.0003457 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[Full GC (Ergonomics) [PSYoungGen: 0K->0K(2048K)] [ParOldGen: 6211K->4817K(7168K)] 6211K->4817K(9216K), [Metaspace: 3281K->3281K(1056768K)], 0.0027242 secs] [Times: user=0.08 sys=0.00, real=0.00 secs]
[GC (Allocation Failure) [PSYoungGen: 0K->0K(2048K)] 4817K->4817K(9216K), 0.0003852 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[Full GC (Allocation Failure) [PSYoungGen: 0K->0K(2048K)] [ParOldGen: 4817K->4798K(7168K)] 4817K->4798K(9216K), [Metaspace: 3281K->3281K(1056768K)], 0.0095410 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

GC日誌分析

JVM垃圾回收

垃圾對象判定標準

jvm的GC工作主要針對的對象是堆記憶體,在做GC工作之前,首先要判定堆記憶體中的對象實例是否為垃圾,通常使用以下兩種演算法來定義

1.引用計數演算法

java在運行時,當有一個地方引用該對象實例,會將這個對象實例加1,引用失效時就減1,jvm在掃描記憶體時,發現引用計數值為0的則是垃圾對象,計數值大於0的則為活躍對象。

目前垃圾回收演算法,沒有採用引用計數演算法,原因是在對象互相引用的情況下,無法判定兩者是否為垃圾對象。

2. 根搜索演算法

根搜索演算法是以“GC ROOTS”為起始點往下搜索,所有經過的對象合併起來稱為引用鏈,在這引用鏈里,沒有的對象稱為垃圾對象,在引用鏈里的是活躍對象。那什麼樣的對象才能稱為“GC ROOTS”呢?以下四種可以

  • 虛擬機棧(棧幀中的本地變數表)中引用的對象。
  • 方法區中的類靜態屬性引用的對象。
  • 方法區中的常量引用的對象。
  • 本地方法棧中 JNI(Native 方法)的引用對象。

垃圾回收演算法

1. 標記-清除(Mark-Sweep)

jvm會掃描所有的對象實例,通過根搜索演算法,將活躍對象進行標記,jvm再一次掃描所有對象,將未標記的對象進行清除,只有清除動作,不作任何的處理,這樣導致的結果會存在很多的記憶體碎片。

2. 複製(copying)

jvm掃描所有對象,通過根搜索演算法標記被引用的對象,之後會申請新的記憶體空間,將標記的對象複製到新的記憶體空間里,存活的對象複製完,會清空原來的記憶體空間,將新的記憶體最為jvm的對象存儲空間。這樣雖然解決了記憶體記憶體碎片問題,但是如果對象很多,重新申請新的記憶體空間會很大,在記憶體不足的場景下,會對jvm運行造成很大的影響

3. 標記-整理(Mark-compact)

標記整理實際上是在標記清除演算法上的優化,執行完標記清除全過程之後,再一次對記憶體進行整理,將所有存活對象統一向一端移動,這樣解決了記憶體碎片問題。

4. 分代回收

目前jvm常用回收演算法就是分代回收,年輕代以複製演算法為主,老年代以標記整理演算法為主。原因是年輕代對象比較多,每次垃圾回收都有很多的垃圾對象回收,而且要儘可能快的減少生命周期短的對象,存活的對象較少,這時候複製演算法比較適合,只要將有標記的對象複製到另一個記憶體區域,其餘全部清除,並且複製的數量較少,效率較高;而老年代是年輕代篩選出來的對象,被標記比較多,需要刪除的對象比較少,顯然採用標記整理效率較高。


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

-Advertisement-
Play Games
更多相關文章
  • 本文提供數百個電腦畢設題目可以參考 並提供成品源碼下載,都是從網上收集而來 源碼技術全部採用java+MySQL開發,並結合了其他技術如ssm,ssh,jsp等等。 下載鏈接在文末! 以下是項目名稱目錄: jd 1-CRM客戶關係管理系統-ssh2-戶籍管理系統-jsp3-Java聊天室的設計與實 ...
  • 一、關於Integer中常用的方法 package com.bjpowernode.java_learning; ​ public class D77_1_ { public static void main(String[] args) { Integer i1 = new Integer(10) ...
  • 開發環境: Windows操作系統 開發工具: MyEclipse+Jdk+Tomcat+MySql資料庫 職工管理系統作為一種管理軟體正在各公司中得到越來越廣泛的應用,且已達到了良好效果。 運行效果圖: 源碼及原文鏈接:http://javadao.xyz/forum.php?mod=viewth ...
  • 我看的這本是Bjarne Stroustrup寫的,南開大學的楊巨峰和王剛譯的。這本書不適合初學者看,我就是大概翻了翻其中感興趣的章節。 這本書第14章的標題是“歷史和相容性”,這節內容我看了收穫很深。p144-145的內容值得去看。 從中可以看出,ISO C和ISO C++是K&R C [Kern ...
  • 這次是關於spring的面試題,和上次一樣依舊挑了幾個具有代表性的。 一. 談談你對 Spring 的理解 Spring 是一個開源框架,為簡化企業級應用開發而生。Spring 可以是使簡單的 JavaBean 實現以前只有 EJB 才能實現的功能。Spring 是一個 IOC 和 AOP 容器框架 ...
  • YAML 是 "YAML Ain't a Markup Language"(YAML 不是一種標記語言)的遞歸縮寫。在開發的這種語言時,YAML 的意思其實是:"Yet Another Markup Language"(仍是一種標記語言)。 YAML 的語法和其他高級語言類似,並且可以簡單表達清單、 ...
  • 原文地址: "http://www.work100.net/training/java if else.html" 更多教程: "光束雲 免費課程" 條件語句 序號|文內章節|視頻 : :|: |: 1| "概述" | 2| "if...else語句" | 3| "if...else...if... ...
  • 當我開始使用Flutter實施該應用程式時,我開始擔心“如何最好地編寫?”以及“如何使其更好地放置?”。 在這種情況下,您將需要參考GitHub上發佈的代碼和應用程​​序。 因此,我收集了似乎對Flutter 應用程式開發有用的代碼/庫/專有技術。 Flutter公式:編寫您的第一個Flutter應 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...