0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

詳細(xì)解析JVM中的垃圾回收機(jī)制

冬至子 ? 來(lái)源:good7ob ? 作者:good7ob ? 2023-06-06 16:53 ? 次閱讀

Java 語(yǔ)言的一大優(yōu)勢(shì)在于其具有自動(dòng)垃圾回收(Garbage Collection,GC)機(jī)制,讓開(kāi)發(fā)者無(wú)需關(guān)心內(nèi)存的分配與釋放。

本文將詳細(xì)解析 JVM(Java Virtual Machine)中的垃圾回收機(jī)制,帶你深入了解 GC 如何運(yùn)作,以及如何優(yōu)化垃圾回收性能。

一、垃圾回收基本原理

在 Java 語(yǔ)言中,對(duì)象的內(nèi)存空間由 JVM 自動(dòng)管理。當(dāng) JVM 確定某個(gè)對(duì)象不再被使用時(shí),它將自動(dòng)回收這個(gè)對(duì)象所占用的內(nèi)存。這種自動(dòng)回收內(nèi)存的機(jī)制稱(chēng)為垃圾回收。

垃圾回收的主要任務(wù)包括兩個(gè)方面:

  1. 發(fā)現(xiàn)無(wú)用對(duì)象:JVM 通過(guò)對(duì)象的可達(dá)性分析來(lái)判斷對(duì)象是否仍在使用。如果一個(gè)對(duì)象不再被其他對(duì)象引用,那么它就被認(rèn)為是無(wú)用的,可以被回收。
  2. 回收無(wú)用對(duì)象所占用的內(nèi)存:JVM 釋放無(wú)用對(duì)象所占用的內(nèi)存,以便其他對(duì)象使用。

二、JVM 內(nèi)存結(jié)構(gòu)

要了解垃圾回收機(jī)制,首先要了解 JVM 的內(nèi)存結(jié)構(gòu)。JVM 將內(nèi)存劃分為以下幾個(gè)區(qū)域:

  1. 堆(Heap):存儲(chǔ)對(duì)象實(shí)例,是垃圾回收的主要區(qū)域。
  2. 方法區(qū)(Method Area):存儲(chǔ)已被加載的類(lèi)信息、常量、靜態(tài)變量等數(shù)據(jù)。
  3. 棧(Stack):存儲(chǔ)局部變量表、操作數(shù)棧、動(dòng)態(tài)鏈接、方法出口等信息。
  4. 程序計(jì)數(shù)器(PC Register):存儲(chǔ)當(dāng)前線程執(zhí)行的字節(jié)碼行號(hào)。

垃圾回收主要針對(duì)堆和方法區(qū)進(jìn)行。

三、垃圾收集器(Garbage Collector)

JVM 提供了多種垃圾收集器,它們各自采用不同的算法,以滿(mǎn)足不同場(chǎng)景的需求。常見(jiàn)的垃圾收集器有:

  1. Serial Collector:?jiǎn)尉€程收集器,適用于客戶(hù)端應(yīng)用。
  2. Parallel Collector:多線程收集器,適用于多核服務(wù)器端應(yīng)用。
  3. CMS(Concurrent Mark Sweep)收集器:并發(fā)收集器,適用于對(duì)響應(yīng)時(shí)間有較高要求的應(yīng)用。
  4. G1(Garbage-First)收集器:基于區(qū)域劃分的收集器,適用于大內(nèi)存應(yīng)用。

四、垃圾回收算法

  1. 標(biāo)記-清除(Mark-Sweep)算法:

標(biāo)記-清除算法分為兩個(gè)階段:標(biāo)記階段和清除階段。在標(biāo)記階段,垃圾收集器遍歷堆中的對(duì)象,將不再使用的對(duì)象進(jìn)行標(biāo)記。在清除階段,垃圾收集器將標(biāo)記的對(duì)象從內(nèi)存中移除。標(biāo)記-清除算法的主要缺點(diǎn)是內(nèi)存碎片化,可能導(dǎo)致后續(xù)對(duì)象分配時(shí)找不到足夠的連續(xù)內(nèi)存。

  1. 標(biāo)記-整理(Mark-Compact)算法:

為解決標(biāo)記-清除算法的內(nèi)存碎片化問(wèn)題,標(biāo)記-整理算法在清除階段進(jìn)行了優(yōu)化。在標(biāo)記階段與標(biāo)記-清除算法相同,都是對(duì)不再使用的對(duì)象進(jìn)行標(biāo)記。然而,在清除階段,標(biāo)記-整理算法會(huì)將存活的對(duì)象壓縮到內(nèi)存的一端,從而避免內(nèi)存碎片化。這種算法的缺點(diǎn)是移動(dòng)對(duì)象的開(kāi)銷(xiāo)較大。

  1. 復(fù)制(Copying)算法:
  • 復(fù)制算法將堆內(nèi)存分為兩個(gè)相等的區(qū)域,每次只使用其中一個(gè)區(qū)域。
  • 當(dāng)這個(gè)區(qū)域的內(nèi)存用完時(shí),垃圾收集器會(huì)將存活的對(duì)象復(fù)制到另一個(gè)區(qū)域,并將已使用區(qū)域清空。這種算法避免了內(nèi)存碎片化和對(duì)象移動(dòng)的問(wèn)題,但代價(jià)是可用內(nèi)存空間減半。
  1. 分代收集(Generational Collection)算法:
  • 大部分對(duì)象的生命周期都很短暫,因此分代收集算法將堆內(nèi)存劃分為新生代和老年代。新生代使用復(fù)制算法,老年代使用標(biāo)記-整理算法。
  • 當(dāng)對(duì)象在新生代中經(jīng)歷了一定次數(shù)的垃圾回收后,它將被晉升到老年代。分代收集算法充分利用了對(duì)象生命周期的特點(diǎn),提高了垃圾回收的效率。

五、垃圾回收實(shí)戰(zhàn)與優(yōu)化:

為了更好地理解垃圾回收機(jī)制及優(yōu)化方法,我們使用一個(gè)簡(jiǎn)單的 Java 程序來(lái)模擬內(nèi)存泄漏。

import java.util.ArrayList;
import java.util.List;
public class GCDemo {
   public static void main(String[] args) {
       List< Object > objects = new ArrayList<  >();
       while (true) {
           objects.add(new byte[1024 * 1024]);
      }
  }
}

該程序會(huì)不斷地分配內(nèi)存,從而觸發(fā)垃圾回收。我們可以使用 Java VisualVM 工具觀察程序運(yùn)行時(shí)的內(nèi)存使用情況和垃圾回收次數(shù)。

為了優(yōu)化垃圾回收,可以嘗試以下方法:

  1. 調(diào)整堆內(nèi)存大小:可以通過(guò)設(shè)置 JVM 參數(shù) -Xms-Xmx 來(lái)調(diào)整堆內(nèi)存的初始大小和最大大小。適當(dāng)增加堆內(nèi)存大小可以減少垃圾回收次數(shù),提高程序運(yùn)行效率。
java -Xms512m -Xmx1024m GCDemo
  1. 選擇合適的垃圾收集器:根據(jù)應(yīng)用場(chǎng)景選擇合適的垃圾收集器,以達(dá)到最佳的垃圾回收性能??梢允褂?-XX:+UseSerialGC、-XX:+UseParallelGC-XX:+UseConcMarkSweepGC-XX:+UseG1GC 參數(shù)選擇不同的垃圾收集器。
java -Xms512m -Xmx1024m -XX:+UseParallelGC GCDemo
  1. 調(diào)整新生代與老年代比例:使用 -XX:NewRatio 參數(shù)可以調(diào)整新生代與老年代的比例。適當(dāng)調(diào)整新生代與老年代比例可以減少對(duì)象晉升到老年代的次數(shù),降低老年代垃圾回收的頻率。
java -Xms512m -Xmx1024m -XX:+UseParallelGC -XX:NewRatio=2 GCDemo
  1. 監(jiān)控并分析垃圾回收日志:可以使用 -Xloggc 參數(shù)將垃圾回收日志輸出到文件,利用 GC 日志分析工具(如 GCViewer)分析垃圾回收的情況,從而找到合適的優(yōu)化方法。
java -Xms512m -Xmx1024m -XX:+UseParallelGC -XX:NewRatio=2 -Xloggc:gc.log GCDemo

六、總結(jié)

本文詳細(xì)介紹了 JVM 垃圾回收機(jī)制的原理、內(nèi)存結(jié)構(gòu)、垃圾收集器、垃圾回收算法,以及實(shí)戰(zhàn)與優(yōu)化方法。通過(guò)深入了解 JVM 的垃圾回收機(jī)制,我們可以更好地優(yōu)化 Java 程序的性能,降低內(nèi)存占用,提高系統(tǒng)穩(wěn)定性。

垃圾回收機(jī)制是 Java 語(yǔ)言的核心優(yōu)勢(shì)之一,但也并非完美無(wú)缺。作為開(kāi)發(fā)者,我們應(yīng)該充分了解垃圾回收的原理和限制,避免產(chǎn)生內(nèi)存泄漏等問(wèn)題,并在需要時(shí)進(jìn)行適當(dāng)?shù)膬?yōu)化。同時(shí),不斷學(xué)習(xí)和實(shí)踐,掌握更多的 Java 高級(jí)技能,以提升我們的開(kāi)發(fā)能力和水平。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 計(jì)數(shù)器
    +關(guān)注

    關(guān)注

    32

    文章

    2259

    瀏覽量

    94813
  • JAVA語(yǔ)言
    +關(guān)注

    關(guān)注

    0

    文章

    138

    瀏覽量

    20125
  • JVM
    JVM
    +關(guān)注

    關(guān)注

    0

    文章

    158

    瀏覽量

    12248
  • GCDM
    +關(guān)注

    關(guān)注

    0

    文章

    4

    瀏覽量

    2154
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    jvm的類(lèi)加載器的整體結(jié)構(gòu)及過(guò)程解析

    前言 我們很多小伙伴平時(shí)都是做JAVA開(kāi)發(fā)的,那么作為一名合格的工程師,你是否有仔細(xì)的思考過(guò)JVM的運(yùn)行原理呢。 如果懂得了JVM的運(yùn)行原理和內(nèi)存模型,像是一些JVM調(diào)優(yōu)、垃圾
    的頭像 發(fā)表于 09-27 15:49 ?3421次閱讀
    <b class='flag-5'>jvm</b>的類(lèi)加載器的整體結(jié)構(gòu)及過(guò)程<b class='flag-5'>解析</b>

    Erlang的垃圾回收機(jī)制是什么

    簡(jiǎn)單回顧一下垃圾回收的知識(shí),垃圾回收器的本質(zhì)實(shí)際上是改變存活數(shù)據(jù)結(jié)構(gòu)構(gòu)成圖的連通性.堆對(duì)象在圖中的存活性是由指針的可到達(dá)性定義的.程序可以操作三種位置的數(shù)據(jù):寄存器 程序棧(局部變量
    發(fā)表于 08-07 06:51

    詳細(xì)介紹了Java泛型、注解、并發(fā)編程

    介紹了Java泛型、注解、并發(fā)編程、數(shù)據(jù)傳輸與序列化、高效IO、容器集合、反射與類(lèi)加載以及JVM重點(diǎn)知識(shí)線程、內(nèi)存模型、JVM運(yùn)行時(shí)內(nèi)存、垃圾回收與算法、Java
    發(fā)表于 08-20 06:09

    oc有垃圾回收機(jī)制嗎?arc和垃圾回收機(jī)制的區(qū)別?

    在C#中都有GC在自動(dòng)管理內(nèi)存,但是在OC沒(méi)有垃圾回收機(jī)制,那么OC內(nèi)存又是如何管理呢?其實(shí)在OC內(nèi)存的管理是依賴(lài)對(duì)象引用計(jì)數(shù)器(re
    發(fā)表于 11-07 10:31 ?3923次閱讀
    oc有<b class='flag-5'>垃圾</b><b class='flag-5'>回收機(jī)制</b>嗎?arc和<b class='flag-5'>垃圾</b><b class='flag-5'>回收機(jī)制</b>的區(qū)別?

    Jvm垃圾回收機(jī)制及性能調(diào)優(yōu)實(shí)戰(zhàn)

    JVM自動(dòng)檢測(cè)并移除不再使用的數(shù)據(jù)對(duì)象的這種機(jī)制稱(chēng)為:垃圾回收,簡(jiǎn)稱(chēng)GC。JVM通過(guò)使用
    發(fā)表于 04-03 14:31 ?2次下載

    蒸汽回收機(jī)是什么,它的特點(diǎn)以及原理是什么

    蒸汽回收機(jī)又叫蒸汽冷凝水回收器,蒸汽凝結(jié)水回收器,凝結(jié)水回收裝置,閉式凝結(jié)水回收裝置等,是蒸汽供熱系統(tǒng)
    發(fā)表于 09-27 11:01 ?2915次閱讀

    智能垃圾回收機(jī)器人的應(yīng)用優(yōu)勢(shì)是什么

    為什么需要垃圾回收機(jī)器人? 首先,垃圾分類(lèi)回收是實(shí)現(xiàn)地球資源循環(huán)利用至關(guān)重要的一環(huán),對(duì)于可持續(xù)發(fā)展有重大意義。垃圾分類(lèi)也是對(duì)付
    發(fā)表于 07-22 09:26 ?2113次閱讀

    智能垃圾回收機(jī)器人的應(yīng)用優(yōu)勢(shì)有哪些

    為什么需要垃圾回收機(jī)器人? 首先,垃圾分類(lèi)回收是實(shí)現(xiàn)地球資源循環(huán)利用至關(guān)重要的一環(huán),對(duì)于可持續(xù)發(fā)展有重大意義。垃圾分類(lèi)也是對(duì)付
    發(fā)表于 08-17 16:08 ?4282次閱讀

    帶顏色的JVM垃圾回收三色標(biāo)記法

    三色標(biāo)記法是一種垃圾回收法,它可以讓JVM不發(fā)生或僅短時(shí)間發(fā)生STW(Stop The World),從而達(dá)到清除JVM內(nèi)存垃圾的目的。
    的頭像 發(fā)表于 10-20 14:23 ?1666次閱讀

    詳解JVM垃圾回收算法和垃圾回收

    JVM 垃圾回收機(jī)制是對(duì)堆沒(méi)有使用的對(duì)象進(jìn)行回收,那么判斷對(duì)象是否“存活”就至關(guān)重要。在判斷對(duì)象是否“存活”的方法
    的頭像 發(fā)表于 03-29 13:55 ?1528次閱讀
    詳解<b class='flag-5'>JVM</b>的<b class='flag-5'>垃圾</b><b class='flag-5'>回收</b>算法和<b class='flag-5'>垃圾</b><b class='flag-5'>回收</b>器

    JVM入門(mén)之關(guān)于GC的擴(kuò)展知識(shí)1

    本章主要是對(duì)上一篇文章講的垃圾回收機(jī)制的擴(kuò)展,垃圾回收其實(shí)本身是有很多可以?xún)?yōu)化的點(diǎn)的,本章就進(jìn)行對(duì)這些優(yōu)化點(diǎn)進(jìn)行介紹。
    的頭像 發(fā)表于 02-10 11:35 ?567次閱讀
    <b class='flag-5'>JVM</b>入門(mén)之關(guān)于GC的擴(kuò)展知識(shí)1

    JVM入門(mén)之關(guān)于GC的擴(kuò)展知識(shí)2

    本章主要是對(duì)上一篇文章講的垃圾回收機(jī)制的擴(kuò)展,垃圾回收其實(shí)本身是有很多可以?xún)?yōu)化的點(diǎn)的,本章就進(jìn)行對(duì)這些優(yōu)化點(diǎn)進(jìn)行介紹。
    的頭像 發(fā)表于 02-10 11:35 ?572次閱讀
    <b class='flag-5'>JVM</b>入門(mén)之關(guān)于GC的擴(kuò)展知識(shí)2

    JVM入門(mén)之垃圾回收算法

    根據(jù)如何判定對(duì)象是垃圾,垃圾回收算法分為兩類(lèi):1、 「引用計(jì)數(shù)式垃圾收集」 (判定垃圾是通過(guò)引用計(jì)數(shù)器)別名:直接
    的頭像 發(fā)表于 02-10 11:40 ?847次閱讀
    <b class='flag-5'>JVM</b>入門(mén)之<b class='flag-5'>垃圾</b><b class='flag-5'>回收</b>算法

    jvm配置的mx

    用于設(shè)置JVM的最大堆內(nèi)存大小,即堆的上限。當(dāng)堆內(nèi)存不足時(shí),JVM會(huì)觸發(fā)垃圾回收機(jī)制以釋放內(nèi)存。如果垃圾
    的頭像 發(fā)表于 12-05 14:24 ?738次閱讀

    MK米客方德SD NAND的垃圾回收機(jī)制

    的無(wú)人機(jī)應(yīng)用。而無(wú)人機(jī)能夠高效運(yùn)行的背后,離不開(kāi)SD NAND的關(guān)鍵技術(shù)——垃圾回收機(jī)制(Garbage Collection, GC)。
    的頭像 發(fā)表于 06-05 14:00 ?724次閱讀
    MK米客方德SD NAND的<b class='flag-5'>垃圾</b><b class='flag-5'>回收機(jī)制</b>