Java堆棧和垃圾回收

1.寄存器:最快的存儲(chǔ)區(qū), 由編譯器根據(jù)需求進(jìn)行分配,我們在程序中無法控制。

2. 棧:存放基本類型的變量數(shù)據(jù)和對(duì)象的引用,但對(duì)象本身不存放在棧中,而是存放在堆(new 出來的對(duì)象)。

3. 堆:存放所有new出來的對(duì)象。?

4. 靜態(tài)域:存放靜態(tài)成員(static定義的) 。

5. 常量池:存放字符串常量和基本類型常量(public static final)。

1,棧 -?基本類型的變量和對(duì)象引用

數(shù)據(jù)可以共享。

棧中的數(shù)據(jù)大小和生命周期必須是確定的,當(dāng)沒有引用指向數(shù)據(jù)時(shí),這個(gè)數(shù)據(jù)就會(huì)消失。

存取速度比堆要快。

2,堆 -?由new創(chuàng)建的對(duì)象實(shí)體和數(shù)組

運(yùn)行時(shí)動(dòng)態(tài)分配內(nèi)存大小。

由java虛擬機(jī)自動(dòng)垃圾回收器來管理。

3.強(qiáng)引用

當(dāng)內(nèi)存空間不足時(shí),Java虛擬機(jī)寧愿拋出OOM錯(cuò)誤,使程序異常終止,也不會(huì)靠隨意回收具有強(qiáng)引用的對(duì)象來解決內(nèi)存不足的問題。?

全局變量:

Object strongReference = new Object();

如果強(qiáng)引用對(duì)象不使用時(shí),需要弱化從而使GC能夠回收:

strongReference = null;

成員變量:

public void test() {

? ? ? ? ?Object strongReference = new Object();

}

在一個(gè)方法的內(nèi)部有一個(gè)強(qiáng)引用,這個(gè)引用保存在Java棧中,而真正的引用內(nèi)容(Object)保存在Java堆中。?

當(dāng)這個(gè)方法運(yùn)行完成后,就會(huì)退出方法棧,則引用對(duì)象的引用數(shù)為0,這個(gè)對(duì)象會(huì)被回收。

4.軟引用

如果一個(gè)對(duì)象只具有軟引用,則內(nèi)存空間充足時(shí),垃圾回收器就不會(huì)回收它;如果內(nèi)存空間不足了,就會(huì)回收這些對(duì)象的內(nèi)存。

String str = new String("abc");

SoftReference<String> softReference = new SoftReference<String>(str);

注意:軟引用對(duì)象是在jvm內(nèi)存不夠的時(shí)候才會(huì)被回收,我們調(diào)用System.gc()方法只是起通知作用,JVM什么時(shí)候掃描回收對(duì)象是JVM自己的狀態(tài)決定的。就算掃描到軟引用對(duì)象也不一定會(huì)回收它,只有內(nèi)存不夠的時(shí)候才會(huì)回收。

5.弱引用

垃圾回收器線程掃描過程中,一旦發(fā)現(xiàn)了只具有弱引用的對(duì)象,不管當(dāng)前內(nèi)存空間足夠與否,都會(huì)回收它的內(nèi)存。

6.虛引用

任何時(shí)候都可能被垃圾回收器回收。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Java中變量、對(duì)象的存儲(chǔ)位置 Java內(nèi)存分配時(shí)涉及5個(gè)區(qū)域,分別是寄存器、棧(stack)、堆(heap)、常...
    于闐閱讀 431評(píng)論 0 1
  • 1 JVM棧 (Java Virtual Machine Stacks) 在介紹JVM棧之前,我先了解一下 棧幀 ...
    轝巐閱讀 5,110評(píng)論 0 2
  • Java堆棧 Java把內(nèi)存劃分為兩種:一種是堆,一種是棧。 棧 存放一些基本類型的變量和對(duì)象的引用變量。java...
    Mrrr_K閱讀 1,098評(píng)論 1 2
  • 棧區(qū):每個(gè)線程包含一個(gè)棧區(qū),棧中只保存方法中(不包括對(duì)象的成員變量)的基礎(chǔ)數(shù)據(jù)類型和自定義對(duì)象的引用(不是對(duì)象),...
    沉淀之際閱讀 141評(píng)論 0 0
  • 最近在看JAVA虛擬機(jī)規(guī)范,談下自己對(duì)java堆棧的理解 java虛擬機(jī)內(nèi)存分為:棧、本地方法棧、堆、程序計(jì)數(shù)器、...
    HopeMan閱讀 1,443評(píng)論 0 0

友情鏈接更多精彩內(nèi)容