JVM 及內存管理:掌握 Java 8 的內存模型與垃圾回收機制

Java 虛擬機(JVM)是運行 Java 程序的核心,它負責代碼執行和內存管理。Java 8 引入了一些重要的內存模型和垃圾回收機制優化。本文將詳細解析 JVM 的內存模型、垃圾回收機制,并配以相關圖解,幫助你深刻理解 JVM 的工作原理。


一、JVM 內存模型

Java 的內存模型將程序運行時所需的內存分為幾個區域,每個區域負責特定的任務。以下是 JVM 的內存模型主要組成部分:

1.1 JVM 內存結構

JVM 的內存結構大致分為以下區域:

  1. 程序計數器
    • 每個線程獨立擁有。
    • 保存當前線程正在執行的字節碼指令地址。
  2. Java 虛擬機棧(Java Stack)
    • 每個線程獨立擁有。
    • 保存局部變量、操作數棧、方法調用信息等。
  3. 本地方法棧(Native Method Stack)
    • 用于執行本地方法(如 JNI 調用)。
  4. 堆內存(Heap)
    • 所有線程共享。
    • 用于存儲對象實例和數組。
    • 主要進行垃圾回收。
  5. 方法區(Method Area,Java 8 后稱為元空間 Metaspace)
    • 所有線程共享。
    • 用于存儲類信息、常量池、方法元數據等。
    • Java 8 將永久代(PermGen)替換為元空間(Metaspace)。

以下是 JVM 內存模型的結構圖:

+---------------------+          +-------------------------+
|     程序計數器       |   ----> |      執行字節碼指令      |
+---------------------+          +-------------------------+
|    Java 虛擬機棧    |   ----> | 方法調用棧幀、局部變量 |
+---------------------+          +-------------------------+
| 本地方法棧(JNI)   |   ----> |      本地方法調用       |
+---------------------+          +-------------------------+
|       堆內存        |   ----> |      對象實例存儲      |
+---------------------+          +-------------------------+
|     方法區/元空間   |   ----> | 類信息、常量池、元數據 |
+---------------------+          +-------------------------+

1.2 堆內存的分代模型

Java 堆內存被分為三個區域,用于優化垃圾回收性能:

  1. 新生代(Young Generation)
    • 包括 Eden 區和兩個 Survivor 區(S0、S1)。
    • 存儲生命周期短的對象。
  2. 老年代(Old Generation)
    • 存儲生命周期較長的對象。
  3. 元空間(Metaspace)
    • 存儲類元數據,位于本地內存而非堆內存中。

以下是堆內存分代模型的示意圖:

+-------------------------------+
|          堆內存               |
|-------------------------------|
| 新生代 | 老年代 | 元空間       |
|-------------------------------|
| Eden  | Survivor0 | Survivor1 |
+-------------------------------+

二、垃圾回收機制(GC)

Java 的垃圾回收機制自動管理對象的內存回收,減少了開發者的負擔。

2.1 垃圾回收的基本原理

垃圾回收的核心是通過不同算法識別“垃圾對象”,釋放其占用的內存。主要通過以下兩種方式進行判斷:

  1. 引用計數法(Reference Counting)
    • 每個對象維護一個引用計數,計數為 0 時即為垃圾。
    • 缺點:無法解決循環引用問題。
  2. 可達性分析算法(Reachability Analysis)
    • 通過 GC Roots 作為起點,分析可以被直接或間接訪問的對象。
    • 無法被訪問的對象會被標記為垃圾。

2.2 常見垃圾回收算法

  1. 標記-清除算法(Mark-Sweep)
    • 標記可達對象,清除不可達對象。
    • 缺點:容易導致內存碎片。
  2. 復制算法(Copying)
    • 將對象復制到新區域,原區域釋放。
    • 優點:無內存碎片,適用于新生代。
  3. 標記-整理算法(Mark-Compact)
    • 標記可達對象,將存活對象整理到一端。
    • 優點:適用于老年代。
  4. 分代回收算法(Generational GC)
    • 新生代采用復制算法,老年代采用標記-整理算法。

2.3 Java 8 的垃圾回收器

Java 8 提供了多種垃圾回收器,可根據需求選擇:

垃圾回收器適用場景特點
Serial GC單線程環境簡單高效,適合小型應用
Parallel GC多線程環境注重吞吐量
CMS GC低延遲需求適合需要快速響應的應用
G1 GC大內存、低延遲場景分區管理,減少全堆掃描
示例:如何設置垃圾回收器

通過 JVM 參數配置垃圾回收器,例如:

# 使用 G1 垃圾回收器
java -XX:+UseG1GC -jar yourapp.jar

三、垃圾回收過程示意圖

以下是垃圾回收的主要過程:

  1. 新生代回收(Minor GC)
    • 當 Eden 區滿時觸發。
    • 存活對象復制到 Survivor 區。
  2. 老年代回收(Major GC 或 Full GC)
    • 老年代空間不足時觸發。
    • 掃描整個堆內存,進行對象回收。

以下是垃圾回收過程的示意圖:

+---------+       +---------+       +---------+
|  Eden   | ----> | Survivor| ----> |   Old   |
+---------+       +---------+       +---------+

四、如何優化 JVM 的內存和 GC

4.1 分析 JVM 內存

使用以下工具分析 JVM 內存使用情況:

  • JConsole:實時監控 JVM。
  • VisualVM:分析堆內存和線程。
  • jstat:查看垃圾回收統計信息。

4.2 JVM 參數調優

  1. 設置堆大小
java -Xms512m -Xmx1024m -jar yourapp.jar
  1. 調整 GC 參數
  • 設置新生代與老年代比例:

    java -XX:NewRatio=3
    
  • 設置 Eden 和 Survivor 比例:

    java -XX:SurvivorRatio=8
    

4.3 避免 Full GC

  • 減少創建短生命周期對象。
  • 使用對象池技術。
  • 合理配置堆內存大小。

五、總結

本文從 JVM 內存模型到垃圾回收機制進行了全面解析,并介紹了 Java 8 中的重要改進。掌握這些知識不僅有助于提升代碼性能,還能幫助你更好地定位和解決內存問題。在實際項目中,建議結合具體場景選擇合適的垃圾回收器并進行調優,以最大化系統性能。

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

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

相關文章

Maple軟件的安裝和使用

文章目錄 1.前言說明2.我為什么要學習Maple3.軟件的安裝4.如何使用4.1基本的賦值語句4.2函數的定義4.3三個類型的書寫介質 5.指數運算5.1使用面板5.2自己輸入 6.對數的使用 1.前言說明 眾所周知,我雖然是一名這個計算機專業的學生,但是我對于數學&#…

【超級詳細】Vue3項目上傳文件到七牛云的詳細筆記

概述 繼上一篇筆記介紹如何綁定七牛云的域名之后,這篇筆記主要介紹了如何在Vue3項目中實現文件上傳至七牛云的功能。我們將使用Cropper.js來處理圖像裁剪,并通過自定義組件和API調用來完成整個流程。 這里直接給出關鍵部分js代碼,上傳之前要先…

Sqoop的使用

每個人的生活都是一個世界,即使最平凡的人也要為他那個世界的存在而戰斗。 ——《平凡的世界》 目錄 一、sqoop簡介 1.1 導入流程 1.2 導出流程 二、使用sqoop 2.1 sqoop的常用參數 2.2 連接參數列表 2.3 操作hive表參數 2.4 其它參數 三、sqoop應用 - 導入…

FFmpeg 4.3 音視頻-多路H265監控錄放C++開發二十一.4,SDP協議分析

SDP在4566 中有詳細描述。 SDP 全稱是 Session Description Protocol, 翻譯過來就是描述會話的協議。 主要用于兩個會話實體之間的媒體協商。 什么叫會話呢,比如一次網絡電話、一次電話會議、一次視頻聊天,這些都可以稱之為一次會話。 那為什…

智簡未來創新與簡化的AI之路

附上鏈接地址:https://aint.top 在這個數字化迅速發展的時代,人工智能(AI)不僅僅是技術的前沿,它正在成為每個行業創新的核心推動力。作為一家專注于AI技術應用與創新的公司,智簡未來旨在通過智能化的工具…

[極客大挑戰 2019]HardSQL 1

看了大佬的wp,沒用字典爆破,手動試出來的,屏蔽了常用的關鍵字,例如:order select union and 最搞的是,空格也有,這個空格后面讓我看了好久,該在哪里加括號。 先傳入1’ 1試試&#…

【Pytorch實用教程】深入了解 torchvision.models.resnet18 新舊版本的區別

深入了解 torchvision.models.resnet18 新舊版本的區別 在深度學習模型開發中,PyTorch 和 torchvision 一直是我們不可或缺的工具。近期,torchvision 對其模型加載 API 進行了更新,將舊版的 pretrained 參數替換為新的 weights 參數。本文將介紹這一變化的背景、具體區別,…

Elasticsearch名詞解釋

文章目錄 1.什么是Elasticsearch?2.什么是elastic stack(ELK)?3.什么是Lucene?4.什么是文檔(document)?5.什么是詞條(term)?6.什么是正向索引?7.什么是倒排索引?8.ES中的索引(index)9.映射(Mapping)10.DSL11.elastcisearch與my…

網絡滲透測試實驗三:SQL注入

1.實驗目的和要求 實驗目的:了解SQL注入的基本原理;掌握PHP腳本訪問MySQL數據庫的基本方法;掌握程序設計中避免出現SQL注入漏洞的基本方法;掌握網站配置。 系統環境:Kali Linux 2、Windows Server 網絡環境:交換網絡結構 實驗工具: SqlMAP;DVWA 2.實驗步驟 實驗目…

SQL-Server鏈接服務器訪問Oracle數據

SQL Server 鏈接服務器訪問 Oracle 離線安裝 .NET Framework 3.5 方法一:使用 NetFx3.cab 文件 下載 NetFx3.cab 文件,并將其放置在 Windows 10 系統盤的 C:Windows 文件夾中。 以管理員身份運行命令提示符,輸入以下命令并回車: …

【R語言】校準曲線,繪制原理

①獲取predict的結果,“prob.Case”這一列就是預測風險概率,“truth”列為實際發生結局的分組 ②將prob.Case進行分桶(簡單理解為分組,一般分10組),常見的分桶方式有兩種:一是將prob.Case從大到小排序后&a…

QTDemo:串口調試工具

項目簡介 本項目通過QT框架設計一款可以在Windows、Linux等平臺的跨平臺串口助手,串口功能能夠滿足基本的調試需求。 本項目采用的版本為:QT5.14 visual studio 2022 進行開發。 項目源碼:https://github.com/say-Hai/MyCOMDemo 項目頁面&am…

基于SpringBoot和OAuth2,實現通過Github授權登錄應用

基于SpringBoot和OAuth2,實現通過Github授權登錄應用 文章目錄 基于SpringBoot和OAuth2,實現通過Github授權登錄應用0. 引言1. 創建Github應用2. 創建SpringBoot測試項目2.1 初始化項目2.2 設置配置文件信息2.3 創建Controller層2.4 創建Html頁面 3. 啟動…

CMS漏洞靶場攻略

DeDeCMS 環境搭建 傻瓜式安裝 漏洞一:通過文件管理器上傳WebShel 步驟?:訪問目標靶場其思路為 dedecms 后臺可以直接上傳任意文件,可以通過?件管理器上傳php文件獲取webshell 登陸網站后臺 步驟二:登陸到后臺點擊 【核心】 --》 【文件式…

0xc0000020錯誤代碼怎么處理,Windows11、10壞圖像錯誤0xc0000020的修復辦法

“0xc0000020”是一種 Windows 應用程序錯誤代碼,通常表明某些文件缺失或損壞。這可能是由于系統文件損壞、應用程序安裝或卸載問題、惡意軟件感染、有問題的 Windows 更新等原因導致的。 比如,當運行軟件時,可能會出現類似“C:\xx\xxx.dll …

LabVIEW 中 NI Vision 模塊的IMAQ Create VI

IMAQ Create VI 是 LabVIEW 中 NI Vision 模塊(NI Vision Development Module)的一個常用 VI,用于創建一個圖像變量。該圖像變量可以存儲和操作圖像數據,是圖像處理任務的基礎。 ? 通過以上操作,IMAQ Create VI 是構建…

HTML5 標簽輸入框(Tag Input)詳解

HTML5 標簽輸入框(Tag Input)詳解 標簽輸入框(Tag Input)是一種用戶界面元素,允許用戶輸入多個標簽或關鍵詞,通常用于表單、搜索框或內容分類等場景。以下是實現標簽輸入框的詳細講解。 1. 任務概述 標…

使用位操作符實現加減乘除!

歡迎拜訪:霧里看山-CSDN博客 本篇主題:使用位操作符實現加減乘除 發布時間:2025.1.1 隸屬專欄:C語言 目錄 位操作實現加法運算()原理代碼示例 位操作實現減法運算(-)原理代碼示例 位…

[Spring] Spring AOP

🌸個人主頁:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵?熱門專欄: 🧊 Java基本語法(97平均質量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection與…

Java-數據結構-時間和空間復雜度

一、什么是時間和空間復雜度? 📚 那么在了解時間復雜度和空間復雜度之前,我們先要知道為何有這兩者的概念: 首先我們要先了解"算法",在之前我們學習過關于"一維前綴和與差分","…