Java內(nèi)存管理垃圾回收基礎(chǔ)詳解
Java內(nèi)存模型
在Java中,內(nèi)存被劃分為以下幾個(gè)區(qū)域:
- 堆(Heap):存儲(chǔ)對(duì)象實(shí)例和數(shù)組,是垃圾回收的主要區(qū)域。
- 棧(Stack):存儲(chǔ)局部變量和方法調(diào)用。每個(gè)線程有自己的棧。
- 方法區(qū)(Method Area):存儲(chǔ)類信息,如類的結(jié)構(gòu)、方法、字段等。
- 本地方法棧(Native Method Stack):存儲(chǔ)本地方法(如JNI)的調(diào)用。
- 程序計(jì)數(shù)器(Program Counter Register):指示當(dāng)前線程執(zhí)行的字節(jié)碼指令。
Java對(duì)象的生命周期
Java對(duì)象的生命周期分為以下幾個(gè)階段:
- 創(chuàng)建:使用
new
關(guān)鍵字創(chuàng)建對(duì)象實(shí)例。 - 使用:對(duì)象被程序引用和使用。
- 不可達(dá):對(duì)象沒(méi)有任何引用指向它,無(wú)法被程序訪問(wèn)。
- 垃圾回收:垃圾回收器回收不可達(dá)對(duì)象所占用的內(nèi)存。
- 內(nèi)存釋放:內(nèi)存被釋放并歸還給系統(tǒng)。
垃圾回收
Java的垃圾回收器自動(dòng)回收不再使用的對(duì)象。垃圾回收的目的是釋放無(wú)用對(duì)象占用的內(nèi)存,避免內(nèi)存泄漏。垃圾回收過(guò)程主要發(fā)生在堆內(nèi)存區(qū)域。
垃圾回收器的工作原理:
- 標(biāo)記:垃圾回收器會(huì)找出所有不可達(dá)的對(duì)象,并將它們標(biāo)記為垃圾。
- 清除:垃圾回收器會(huì)回收被標(biāo)記的對(duì)象所占用的內(nèi)存。
Java中常用的垃圾回收算法:
- 引用計(jì)數(shù)法:每個(gè)對(duì)象維護(hù)一個(gè)引用計(jì)數(shù),當(dāng)引用計(jì)數(shù)為0時(shí),對(duì)象被視為垃圾。但這種方法無(wú)法解決循環(huán)引用問(wèn)題。
- 標(biāo)記-清除(Mark-Sweep):分為標(biāo)記和清除兩個(gè)階段,標(biāo)記階段標(biāo)記所有不可達(dá)對(duì)象,清除階段回收它們的內(nèi)存。但可能產(chǎn)生內(nèi)存碎片。
- 標(biāo)記-整理(Mark-Compact):在標(biāo)記-清除基礎(chǔ)上,將存活對(duì)象整理到內(nèi)存的一端,回收邊界以外的內(nèi)存。解決了內(nèi)存碎片問(wèn)題。
- 分代收集(Generational Collection):將堆內(nèi)存劃分為新生代和老年代,針對(duì)不同代采用不同的垃圾回收策略。新生代使用復(fù)制算法(Copying),老年代使用標(biāo)記-清除或標(biāo)記-整理算法。
內(nèi)存泄漏與內(nèi)存溢出
- 內(nèi)存泄漏:程序中某個(gè)對(duì)象不再使用,但仍然被引用,導(dǎo)致無(wú)法被垃圾回收器回收。內(nèi)存泄漏可能導(dǎo)致內(nèi)存溢出。
- 內(nèi)存溢出:程序請(qǐng)求的內(nèi)存超過(guò)了系統(tǒng)可分配的最大內(nèi)存,導(dǎo)致程序崩潰。
避免內(nèi)存泄漏的方法:
- 及時(shí)釋放不再使用的對(duì)象引用。
- 避免靜態(tài)集合類引用長(zhǎng)期占用內(nèi)存的對(duì)象。
- 使用WeakReference、SoftReference等弱引用類型。
示例
下面的示例展示了一個(gè)簡(jiǎn)單的類及其實(shí)例化過(guò)程,以及垃圾回收的觸發(fā)。
public class Student { private String name; private int age; public Student(String name, int age) { this.name = name; this.age = age; } public static void main(String[] args) { Student student1 = new Student("Alice", 20); // 創(chuàng)建一個(gè)Student實(shí)例 Student student2 = new Student("Bob", 22); // 創(chuàng)建另一個(gè)Student實(shí)例 student1 = student2; // student1引用指向student2,此時(shí)原先的"student1"實(shí)例無(wú)法訪問(wèn),成為垃圾 System.gc(); // 建議JVM進(jìn)行垃圾回收(注意:這并不保證立即進(jìn)行垃圾回收) } }
在這個(gè)示例中,我們創(chuàng)建了兩個(gè)Student
實(shí)例。當(dāng)student1
引用指向student2
時(shí),原來(lái)的student1
實(shí)例變得不可達(dá),成為垃圾。我們使用System.gc()
建議JVM進(jìn)行垃圾回收。需要注意的是,System.gc()
并不保證立即進(jìn)行垃圾回收,具體的回收時(shí)機(jī)取決于JVM的實(shí)現(xiàn)。
這一節(jié)我們?cè)敿?xì)講解了Java內(nèi)存管理與垃圾回收的相關(guān)知識(shí),包括內(nèi)存模型、對(duì)象的生命周期、垃圾回收原理及算法、內(nèi)存泄漏與內(nèi)存溢出等內(nèi)容。我們還通過(guò)一個(gè)簡(jiǎn)單的示例展示了垃圾回收的觸發(fā)。希望這些內(nèi)容對(duì)你有所幫助,更多關(guān)于Java內(nèi)存管理垃圾回收的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java的各種集合為什么不安全(List、Set、Map)以及代替方案
這篇文章主要介紹了java的各種集合為什么不安全(List、Set、Map)以及代替方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10SpringBoot+Redis大量重復(fù)提交問(wèn)題的解決方案
Spring Boot Redis重復(fù)提交是指在使用Spring Boot框架和Redis緩存時(shí),為了防止用戶重復(fù)提交表單或者請(qǐng)求,采取的一種解決方案,本文通過(guò)代碼示例給大家介紹了SpringBoot+Redis大量重復(fù)提交問(wèn)題的解決方案,需要的朋友可以參考下2024-03-03Spring 事件監(jiān)聽機(jī)制實(shí)現(xiàn)跨模塊調(diào)用的思路詳解
之前一個(gè)項(xiàng)目,有兩個(gè)模塊,A 模塊需要依賴 B 模塊,但現(xiàn)在 B 模塊有地方需要調(diào)用 A 模塊的方法,如果直接依賴,又會(huì)產(chǎn)生循環(huán)依賴問(wèn)題,最終選擇使用 spring 的事件監(jiān)聽來(lái)解決該問(wèn)題,下面給大家介紹Spring 事件監(jiān)聽機(jī)制實(shí)現(xiàn)跨模塊調(diào)用的思路,感興趣的朋友一起看看吧2024-05-05Spring-cloud 注冊(cè)服務(wù)提供者搭建方法
本篇文章主要介紹了Spring-cloud 注冊(cè)服務(wù)提供者搭建方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04Springboot集成mybatis與jsp過(guò)程詳解
這篇文章主要介紹了Springboot集成mybatis與jsp過(guò)程,Spring Boot是一種全新的框架(相對(duì)而言),是用來(lái)簡(jiǎn)化Spring應(yīng)用的初始搭建以及開發(fā)過(guò)程。該框架使用了特定的方式來(lái)進(jìn)行配置2021-09-09Java實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)(使用數(shù)據(jù)庫(kù))
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)學(xué)生信息管理系統(tǒng),使用數(shù)據(jù)庫(kù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01如何在springMVC的controller中獲取request
這篇文章主要介紹了如何在springMVC的controller中獲取request,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12