Java基礎---java虛擬機內存結構

  

JVM 內存包含如下幾個部分:

  • Heap Memory 存放Java對象
  • Non-Heap Memory 存放類加載信息和其它meta-data
  • Other 存放JVM 自身代碼等

在JVM啓動時,就已經保留了固定的內存空間給Heap內存,這部分內存並不一定都會被JVM使用,但是可以確定的是這部分保留的內存不會被其他進程使用。這部分內存大小由 -Xmx 參數指定。而另一部分內存在JVM啓動時就分配給JVM,作爲JVM的初始Heap內存使用。影響這個的參數是 -Xms

默認空餘堆內存小於40%時,JVM 就會增大堆直到-Xmx的最大限制,可以由-XX:MinHeapFreeRatio指定。 
默認空餘堆內存大於70%時,JVM 會減少堆直到-Xms的最小限制,可以由-XX:MaxHeapFreeRatio指定。

可以通過-XX:MaxPermSize設置Non-Heap大小.

GC 的年代劃分

如果 -Xms指定的值比-Xmx的小,那麼兩者的差值就是Virtual內存值。隨着程序的運行,Eden區、 Tenured區和Perm區會逐漸使用保留的Virtual空間。

JVM內存模型中Heap區分兩大塊,一塊是 NEW Generation,另一塊是Old Generation. 在NewGeneration中,有一個叫Eden的空間,主要是用來存放新生的對象,還有兩個Survivor Spaces(from,to),它們的大小總是一樣,它們用來存放每次垃圾回收後存活下來的對象。在OldGeneration中,主要存放應用程序中生命週期長的內存對象。在NewGeneration塊中,垃圾回收一般用Copying的算法,速度快。每次GC的時候,存活下來的對象首先由Eden拷貝到某個SurvivorSpace, 當Survivor Space空間滿了後, 剩下的live對象就被直接拷貝到OldGeneration中去。因此,每次GC後,Eden內存塊會被清空。在OldGeneration塊中,垃圾回收一般用mark-compact的算法,速度慢些,但減少內存要求.
垃圾回收分多級,0級爲全部(Full)的垃圾回收,會回收OLD段中的垃圾;1級或以上爲部分垃圾回收,只會回收NEW中的垃圾,內存溢出通常發生於OLD段或Perm段垃圾回收後,仍然無內存空間容納新的Java對象的情況。

還有個Permanent Generation,主要用來放JVM自己的反射對象,比如類對象和方法對象等。關於這個區,它還提供String pool,看下面的例子:

[java] view plaincopy
  1. String first = "abc";   
  2. String second = new String ("abc");  

第一個對象存貯在Permanent Generation,而第二個對象存儲在Heap裏面。所以:

[java] view plaincopy
  1. String s = "abc";  
  2. String p = "abc";  

對象s和p指向同一個對象,這樣效率大大提高。

 

內存申請過程如下:

  1. JVM 會試圖爲相關Java對象在Eden中初始化一塊內存區域
  2. 當Eden空間足夠時,內存申請結束。否則到下一步
  3. JVM 試圖釋放在Eden中所有不活躍的對象(這屬於1或更高級的垃圾回收),釋放後若Eden空間仍然不足以放入新對象,則試圖將部分Eden中活躍對象放入Survivor區
  4. Survivor區被用來作爲Eden及OLD的中間交換區域,當OLD區空間足夠時,Survivor區的對象會被移到Old區,否則會被保留在Survivor區
  5. 當OLD區空間不夠時,JVM 會在OLD區進行完全的垃圾收集(0級)
  6. 完全垃圾收集後,若Survivor及OLD區仍然無法存放從Eden複製過來的部分對象,導致JVM無法在Eden區爲新對象創建內存區域,則出現”out of memory錯誤”


具體算法請參考:JDK5.0中JVM堆模型、GC垃圾收集詳細解析 


參考:

  • http://www.yourkit.com/docs/kb/sizes.jsp
  • http://blog.csdn.net/sfdev/article/details/4483442
  • http://longdick.iteye.com/blog/473866
  • http://javarevisited.blogspot.com/2011/04/garbage-collection-in-java.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章