以下內容轉自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=29632145&id=4616836
jvm區域總體分兩類,heap區和非heap區。heap區又分:Eden Space(伊甸園)、Survivor Space(幸存者區)、Tenured Gen(老年代-養老區)。 非heap區又分:Code Cache(代碼緩存區)、Perm Gen(永久代)、Jvm Stack(java虛擬機棧)、Local Method Statck(本地方法棧)。
HotSpot虛擬機GC算法采用分代收集算法:
1、一個人(對象)出來(new 出來)後會在Eden Space(伊甸園)無憂無慮的生活,直到GC到來打破了他們平靜的生活。GC會逐一問清楚每個對象的情況,有沒有錢(此對象的引用)啊,因為GC想賺錢呀,有錢的才可以敲詐嘛。然後富人就會進入Survivor Space(幸存者區),窮人的就直接kill掉。
2、並不是進入Survivor Space(幸存者區)後就保證人身是安全的,但至少可以活段時間。GC會定期(可以自定義)會對這些人進行敲詐,億萬富翁每次都給錢,GC很滿意,就讓其進入了Genured Gen(養老區)。萬元戶經不住幾次敲詐就沒錢了,GC看沒有啥價值啦,就直接kill掉了。
3、進入到養老區的人基本就可以保證人身安全啦,但是億萬富豪有的也會揮霍成窮光蛋,只要錢沒了,GC還是kill掉。
分區的目的:新生區由於對象產生的比較多並且大都是朝生夕滅的,所以直接采用標記-清理算法。而養老區生命力很強,則采用復制算法,針對不同情況使用不同算法。
非heap區域中Perm Gen中放著類、方法的定義,jvm Stack區域放著方法參數、局域變量等的引用,方法執行順序按照棧的先入後出方式。
以上轉自:http://lhc1986.iteye.com/blog/1421832
以下轉自:http://www.cnblogs.com/xhr8334/archive/2011/12/01/2270994.html
SUN的jvm內存池被劃分為以下幾個部分:
Eden Space (heap)
內存最初從這個線程池分配給大部分對象。
Survivor Space (heap)
用於保存在eden space內存池中經過垃圾回收後沒有被回收的對象。
Tenured Generation (heap)
用於保持已經在survivor space內存池中存在了一段時間的對象。
Permanent Generation (non-heap)
保存虛擬機自己的靜態(reflective)數據,例如類(class)和方法(method)對象。Java虛擬機共享這些類數據。這個區域被分割為只讀的和只寫的。
Code Cache (non-heap)
HotSpot Java虛擬機包括一個用於編譯和保存本地代碼(native code)的內存,叫做“代碼緩存區”(code cache)。
簡單來講,jvm的內存回收過程是這樣的:
對象在Eden Space創建,當Eden Space滿了的時候,gc就把所有在Eden Space中的對象掃描一次,把所有有效的對象復制到第一個Survivor Space,同時把無效的對象所占用的空間釋放。當Eden Space再次變滿了的時候,就啟動移動程序把Eden Space中有效的對象復制到第二個Survivor Space,同時,也將第一個Survivor Space中的有效對象復制到第二個Survivor Space。如果填充到第二個Survivor Space中的有效對象被第一個Survivor Space或Eden Space中的對象引用,那麼這些對象就是長期存在的,此時這些對象將被復制到Permanent Generation。
若垃圾收集器依據這種小幅度的調整收集不能騰出足夠的空間,就會運行Full GC,此時jvm gc停止所有在堆中運行的線程並執行清除動作。