熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

JVM內存模型及垃圾收集策略解析(1)

2022-06-13   來源: Java核心技術 

  一 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
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.