程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> JVM內存區域劃分Eden Space、Survivor Space、Tenured Gen,Perm Gen解釋,jvmtenured

JVM內存區域劃分Eden Space、Survivor Space、Tenured Gen,Perm Gen解釋,jvmtenured

編輯:JAVA綜合教程

JVM內存區域劃分Eden Space、Survivor Space、Tenured Gen,Perm Gen解釋,jvmtenured


以下內容轉自: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





GC工作機制

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停止所有在堆中運行的線程並執行清除動作。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved