-
JAVA的內存管理20141116162607156.png
Object o = new Object();
o.name = "com"
對象Object存在于堆中,變量o存在于棧中,變量o指向于堆中的Object對象,方法執行完(生命周期走完),即被回收掉,類比,此比喻不一定對,一個函數中的變量可以作為一個棧,聲明的時候放入棧中,函數結束的時候從棧里面移除。
“com”存在于常量池里面,對象的屬性name指向這個常量池,這個name是跟隨者Object對象,并不是作為變量存到棧中(這個需要后續驗證,暫時這么理解)
引用一篇文章里面的說法:
堆區:
1.存儲的全部是對象,每個對象都包含一個與之對應的class的信息。(class的目的是得到操作指令)
2.jvm只有一個堆區(heap)被所有線程共享,堆中不存放基本類型和對象引用,只存放對象本身
棧區:
1.每個線程包含一個棧區,棧中只保存基礎數據類型的對象和自定義對象的引用(不是對象),對象都存放在堆區中
2.每個棧中的數據(原始類型和對象引用)都是私有的,其他棧不能訪問。
3.棧分為3個部分:基本類型變量區、執行環境上下文、操作指令區(存放操作指令)。
方法區:
1.又叫靜態區,跟堆一樣,被所有的線程共享。方法區包含所有的class和static變量。
2.方法區中包含的都是在整個程序中永遠唯一的元素,如class,static變量。
而Java的GC主要就是針對于堆的處理,根據是否被引用來決定在存儲區域滿了之后需要觸發GC時,要不要回收,堆的回收分為old和young,新建對象放入young中,存活到達一定時間后,放入old中,目的是為了減低GC成本,因為能放到old中,一定的被引用的次數比較多,能被回收的概率也就越低,所以就不必一直觸發
參考文章:http://www.importnew.com/17770.html
和http://blog.csdn.net/OyangYujun/article/details/41173747
https://www.cnblogs.com/whgk/p/6138522.html(推薦)
虛擬機棧:
當在main方法中調用別的方法時,就會有另一個方法的棧幀入虛擬機棧,當該方法調用完了之后,彈棧,然后main方法處于棧頂,就繼續執行,直到結束,然后main方法棧幀也彈棧,程序就結束了。總之虛擬機棧中就是有很多個棧幀的入棧出棧,棧幀中存放的都市一些變量名等東西,所以我們平常說棧中存放的是一些局部變量,因為局部變量就是在方法中。也就是在棧幀中,就是這樣說過來的。