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í)候都可能被垃圾回收器回收。