國內私募機構九鼎控股打造APP,來就送 20元現金領取地址:http://jdb.jiudingcapital.com/phone.html
內部邀請碼:C8E245J (不寫邀請碼,沒有現金送)
國內私募機構九鼎控股打造,九鼎投資是在全國股份轉讓系統掛牌的公眾公司,股票代碼為430719,為“中國PE第一股”,市值超1000億元。
------------------------------------------------------------------------------------------------------------------------------------------------------------------
原文地址: http://blog.csdn.net/kingofworld/article/details/17718587
JVM內存模型總體架構圖

程序計數器
多線程時,當線程數超過CPU數量或CPU內核數量,線程之間就要根據時間片輪詢搶奪CPU時間資源。因此每個線程有要有一個獨立的程序計數器,記錄下一條要運行的指令。線程私有的內存區域。如果執行的是JAVA方法,計數器記錄正在執行的java字節碼地址,如果執行的是native方法,則計數器為空。
虛擬機棧
線程私有的,與線程在同一時間創建。管理JAVA方法執行的內存模型。每個方法執行時都會創建一個楨棧來存儲方法的的變量表、操作數棧、動態鏈接方法、返回值、返回地址等信息。棧的大小決定了方法調用的可達深度(遞歸多少層次,或嵌套調用多少層其他方法,-Xss參數可以設置虛擬機棧大小)。棧的大小可以是固定的,或者是動態擴展的。如果請求的棧深度大於最大可用深度,則拋出stackOverflowError;如果棧是可動態擴展的,但沒有內存空間支持擴展,則拋出OutofMemoryError。
使用jclasslib工具可以查看class類文件的結構。下圖為棧幀結構圖:

本地方法區
和虛擬機棧功能相似,但管理的不是JAVA方法,是本地方法,本地方法是用C實現的。
JAVA堆
線程共享的,存放所有對象實例和數組。垃圾回收的主要區域。可以分為新生代和老年代(tenured)。
新生代用於存放剛創建的對象以及年輕的對象,如果對象一直沒有被回收,生存得足夠長,老年對象就會被移入老年代。
新生代又可進一步細分為eden、survivorSpace0(s0,from space)、survivorSpace1(s1,to space)。剛創建的對象都放入eden,s0和s1都至少經過一次GC並幸存。如果幸存對象經過一定時間仍存在,則進入老年代(tenured)。

方法區
線程共享的,用於存放被虛擬機加載的類的元數據信息:如常量、靜態變量、即時編譯器編譯后的代碼。也成為永久代。如果hotspot虛擬機確定一個類的定義信息不會被使用,也會將其回收。回收的基本條件至少有:所有該類的實例被回收,而且裝載該類的ClassLoader被回收
垃圾回收算法
標記-清除算法(Mark-Sweep)
從根節點開始標記所有可達對象,其余沒標記的即為垃圾對象,執行清除。但回收后的空間是不連續的。
復制算法(copying)
將內存分成兩塊,每次只使用其中一塊,垃圾回收時,將標記的對象拷貝到另外一塊中,然后完全清除原來使用的那塊內存。復制后的空間是連續的。復制算法適用於新生代,因為垃圾對象多於存活對象,復制算法更高效。在新生代串行垃圾回收算法中,將eden中標記存活的對象拷貝未使用的s1中,s0中的年輕對象也進入s1,如果s1空間已滿,則進入老年代;這樣交替使用s0和s1。這種改進的復制算法,既保證了空間的連續性,有避免了大量的內存空間浪費。
標記-壓縮算法(Mark-compact)
適合用於老年代的算法(存活對象多於垃圾對象)。
標記后不復制,而是將存活對象壓縮到內存的一端,然后清理邊界外的所有對象。

JVM參數:
-XX:+PrintGCDetails 打印垃圾回收信息
-Xms 為Heap區域的初始值,線上環境需要與-Xmx設置為一致,否則capacity的值會來回飄動
-Xmx 為Heap區域的最大值
-Xss(或-ss) 線程棧大小(指一個線程的native空間)1.5以后是1M的默認大小
-XX:PermSize與-XX:MaxPermSize 方法區(永久代)的初始大小和最大值(但不是本地方法區)
-XX:NewRatio 老年代與新生代比率
-XX:SurvivorRatio Eden與Survivor的占用比例。例如8表示,一個survivor區占用 1/8 的Eden內存,即1/10的新生代內存,為什么不是1/9?因為我們的新生代有2個survivor,即S1和S22。所以survivor總共是占用新生代內存的 2/10,Eden與新生代的占比則為 8/10。
-XX:MaxHeapFreeRatio GC后,如果發現空閑堆內存占到整個預估的比例小於這個值,則減小堆空間。
-XX:MinHeapFreeRatio GC后,如果發現空閑堆內存占到整個預估的比例大於這個值,則增大堆空間。
-XX:NewSize 新生代大小
參考文章:
http://www.cubrid.org/blog/dev-platform/understanding-java-garbage-collection/
http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html
