JVM 內存儲器

JVM 內存-Xms512m表示JVM Heap(堆內存)最小尺寸512MB,初始分配-Xmx1024m 表示JVM Heap(堆內存)最大容許的java

JVM 內存
-Xms512m  表示JVM Heap(堆內存)最小尺寸512MB,初始分配
-Xmx1024m 表示JVM Heap(堆內存)最大容許的尺寸1024MB,按需分配
說明:若是-Xmx不指定或者指定偏小,應用可能會致使java.lang.OutOfMemory錯誤,
此錯誤來自JVM不是Throwable的,沒法用try...catch捕捉

-XX:PermSize=64MB 最小尺寸,初始分配
-XX:MaxNewSize=512m 
-XX:MaxPermSize=512m 最大容許分配尺寸,按需分配 
說明:太小會致使:java.lang.OutOfMemoryError: PermGen space
MaxPermSize缺省值和-server -client選項相關。
-server選項下默認MaxPermSize爲64m
-client選項下默認MaxPermSize爲32m
經驗:
一、慎用最小限制選項Xms,PermSize已節約系統資源。
   幾個基本概念:
   PermGen space:全稱是Permanent Generation space,即永久代。
   就是說是永久保存的區域,用於存放Class和Meta信息,Class在被Load的時候被放入該區域,
   GC(Garbage Collection)應該不會對PermGen space進行清理,因此若是你的APP會LOAD不少CLASS的話,
   就極可能出現PermGen space錯誤。
   Heap space:存放Instance。Java Heap分爲3個區,Young即新生代,Old即老生代和Permanent。
   Young保存剛實例化的對象。當該區被填滿時,GC會將對象移到Old區。
   Permanent區則負責保存反射對象。
  幾個參數設置的意義:
  xms/xmx:定義YOUNG+OLD段的總尺寸,ms爲JVM啓動時YOUNG+OLD的內存大小;
   mx爲最大可佔用的YOUNG+OLD內存大小。在用戶生產環境上通常將這兩個值設爲相同,
   以減小運行期間系統在內存申請上所花的開銷。
   NewSize/MaxNewSize:定義YOUNG段的尺寸,NewSize爲JVM啓動時YOUNG的內存大小;
       MaxNewSize爲最大可佔用的YOUNG內存大小。在用戶生產環境上通常將這兩個值設爲相同,
       以減小運行期間系統在內存申請上所花的開銷。
   PermSize/MaxPermSize:定義Perm段的尺寸,PermSize爲JVM啓動時Perm的內存大小;
   MaxPermSize爲最大可佔用的Perm內存大小。在用戶生產環境上通常將這兩個值設爲相同,
   以減小運行期間系統在內存申請上所花的開銷。
   SurvivorRatio:設置YOUNG代中Survivor空間和Eden空間的比例
   
申請一塊內存的過程:
   A. JVM會試圖爲相關Java對象在Eden中初始化一塊內存區域
   B. 當Eden空間足夠時,內存申請結束。不然到下一步
   C. JVM試圖釋放在Eden中全部不活躍的對象(這屬於1或更高級的垃圾回收);釋放後若Eden空間仍然不足以放入新對象,則試圖將部分Eden中活躍對象放入Survivor區/OLD區
   D. Survivor區被用來做爲Eden及OLD的中間交換區域,當OLD區空間足夠時,Survivor區的對象會被移到Old區,不然會被保留在Survivor區
   E. 當OLD區空間不夠時,JVM會在OLD區進行徹底的垃圾收集(0級)
   F. 徹底垃圾收集後,若Survivor及OLD區仍然沒法存放從Eden複製過來的部分對象,致使JVM沒法在Eden區爲新對象建立內存區域,則出現」out of memory錯誤」
  內存監控的方法:
   1.  jmap -heap pid  查看java 堆(heap)使用狀況
       using thread-local object allocation.
       Parallel GC with 4 thread(s)          //GC 方式
       Heap Configuration://堆內存初始化配置
       MinHeapFreeRatio=40 //對應jvm啓動參數-XX:MinHeapFreeRatio設置JVM堆最小空閒比率(default 40)
       MaxHeapFreeRatio=70  //對應jvm啓動參數 -XX:MaxHeapFreeRatio設置JVM堆最大空閒比率(default 70)
       MaxHeapSize=512.0MB //對應jvm啓動參數-XX:MaxHeapSize=設置JVM堆的最大大小
       NewSize  = 1.0MB    //對應jvm啓動參數-XX:NewSize=設置JVM堆的‘新生代’的默認大小
       MaxNewSize =4095MB  //對應jvm啓動參數-XX:MaxNewSize=設置JVM堆的‘新生代’的最大大小
       OldSize  = 4.0MB    //對應jvm啓動參數-XX:OldSize=<value>:設置JVM堆的‘老生代’的大小
       NewRatio  = 8       //對應jvm啓動參數-XX:NewRatio=:‘新生代’和‘老生代’的大小比率
       SurvivorRatio = 8   //對應jvm啓動參數-XX:SurvivorRatio=設置年輕代中Eden區與Survivor區的大小比值 
       PermSize= 16.0MB    //對應jvm啓動參數-XX:PermSize=<value>:設置JVM堆的‘永生代’的初始大小
       MaxPermSize=64.0MB //對應jvm啓動參數-XX:MaxPermSize=<value>:設置JVM堆的‘永生代’的最大大小
    Heap Usage:               //堆內存分步
    PS Young Generation
    Eden Space:          //Eden區內存分佈
    capacity = 20381696 (19.4375MB)  //Eden區總容量
    used = 20370032 (19.426376342773438MB)  //Eden區已使用
free = 11664 (0.0111236572265625MB)  //Eden區剩餘容量
99.94277218147106% used  //Eden區使用比率
    From Space:        //其中一個Survivor區的內存分佈
    capacity = 8519680 (8.125MB)
    used = 32768 (0.03125MB)
free = 8486912 (8.09375MB)
    0.38461538461538464% used
    To Space:            //另外一個Survivor區的內存分佈
    capacity = 9306112 (8.875MB)
    used = 0 (0.0MB)
free = 9306112 (8.875MB)
0.0% used
PS Old Generation  //當前的Old區內存分佈
capacity = 366280704 (349.3125MB)
used = 322179848 (307.25464630126953MB)
free = 44100856 (42.05785369873047MB)
87.95982001825573% used
PS Perm Generation  //當前的 「永生代」 內存分佈
capacity = 32243712 (30.75MB)
used = 28918584 (27.57891082763672MB)
free = 3325128 (3.1710891723632812MB)
89.68751488662348% usedjvm

相關文章
相關標籤/搜索