一 JVM內存模型
Java棧
Java棧是與每一個線程關聯的JVM在創建每一個線程的時候會分配一定的棧空間給線程它主要用來存儲線程執行過程中的局部變量方法的返回值以及方法調用上下文棧空間隨著線程的終止而釋放StackOverflowError如果在線程執行的過程中棧空間不夠用那麼JVM就會拋出此異常這種情況一般是死遞歸造成的
堆
Java中堆是由所有的線程共享的一塊內存區域堆用來保存各種JAVA對象比如數組線程對象等
Generation
JVM堆一般又可以分為以下三部分
◆ Perm
Perm代主要保存classmethodfiled對象這部門的空間一般不會溢出除非一次性加載了很多的類不過在涉及到熱部署的應用服務器的時候有時候會遇到javalangOutOfMemoryError : PermGen space 的錯誤造成這個錯誤的很大原因就有可能是每次都重新部署但是重新部署後類的class沒有被卸載掉這樣就造成了大量的class對象保存在了perm中這種情況下一般重新啟動應用服務器可以解決問題
◆ Tenured
Tenured區主要保存生命周期長的對象一般是一些老的對象當一些對象在Young復制轉移一定的次數以後對象就會被轉移到Tenured區一般如果系統中用了application級別的緩存緩存中的對象往往會被轉移到這一區間
◆ Young
Young區被劃分為三部分Eden區和兩個大小嚴格相同的Survivor區其中Survivor區間中某一時刻只有其中一個是被使用的另外一個留做垃圾收集時復制對象用在Young區間變滿的時候minor GC就會將存活的對象移到空閒的Survivor區間中根據JVM的策略在經過幾次垃圾收集後任然存活於Survivor的對象將被移動到Tenured區間
Sizing the Generations
JVM提供了相應的參數來對內存大小進行配置正如上面描述JVM中堆被分為了個大的區間同時JVM也提供了一些選項對YoungTenured的大小進行控制
◆ Total Heap
Xms 指定了JVM初始啟動以後初始化內存
Xmx指定JVM堆得最大內存在JVM啟動以後會分配Xmx參數指定大小的內存給JVM但是不一定全部使用JVM會根據Xms參數來調節真正用於JVM的內存
Xmx Xms之差就是三個Virtual空間的大小
◆ Young Generation
XX:NewRatio=意味著tenured 和 young的比值這樣eden+*survivor=/
堆內存
XX:SurvivorRatio=意味著eden和一個survivor的比值是這樣一個Survivor就占Young區的/
Xmn 參數設置了年輕代的大小
◆ Perm Generation
XX:PermSize=M XX:MaxPermSize=M
Thread Stack
XX:Xss=K
堆棧分離的好處
呵呵其它的先不說了就來說說面向對象的設計吧當然除了面向對象的設計帶來的維護性復用性和擴展性方面的好處外我們看看面向對象如何巧妙的利用了堆棧分離如果從JAVA內存模型的角度去理解面向對象的設計我們就會發現對象它完美的表示了堆和棧對象的數據放在堆中而我們編寫的那些方法一般都是運行在棧中因此面向對象的設計是一種非常完美的設計方式它完美的統一了數據存儲和運行
From:http://tw.wingwit.com/Article/program/Java/hx/201311/27140.html