1. 程式人生 > >JVM手動分配內存(轉載)

JVM手動分配內存(轉載)

permsize pri 轉載 決定 項目 新生代 棧幀 maxperm 獨立

原文內容很詳細,不利於快速瀏覽,所以只保留了重點

原文地址 http://blog.csdn.net/mr__fang/article/details/47723767

內存檢測工具jvisualVM參考

https://www.ibm.com/developerworks/cn/java/j-lo-visualvm/

內存設置的主要參數:

Trace跟蹤參數(打印日誌):

1、打印GC的簡要信息

-verbose:gc
-XX:+printGC

2、打印GC的詳細信息:

-XX:+PrintGCDetails

3打印CG發生的時間戳

-XX:+PrintGCTimeStamps

4指定GC log的位置:

-Xloggc:log/gc.log

5每一次GC前和GC後,都打印堆信息。

-XX:+PrintHeapAtGC

6監控類的加載。

-XX:+TraceClassLoading

7按下Ctrl+Break後,打印類的信息(mac上沒法用)

-XX:+PrintClassHistogram

二、堆的分配參數:

1.-Xmx –Xms:指定最大堆和最小堆

2.

  • -Xmn

    設置新生代大小

  • -XX:NewRatio

    新生代(eden+2*s)和老年代(不包含永久區)的比值

    例如:4,表示新生代:老年代=1:4,即新生代占整個堆的1/5

  • -XX:SurvivorRatio(幸存代)
    -XX:SurvivorRatio=8

    設置兩個Survivor區和eden的比值

    例如:8,表示兩個Survivor:eden=2:8,即一個Survivor占年輕代的1/10

3、-XX:+HeapDumpOnOutOfMemoryError、-XX:+HeapDumpPath

  • -XX:+HeapDumpOnOutOfMemoryError

    OOM時導出堆到文件

      根據這個文件,我們可以看到系統dump時發生了什麽。

  • -XX:+HeapDumpPath(這個可以不設置,默認到處到當前項目根目錄下,設置後會因為文件名相同無法導出第二次)

    導出OOM的路徑

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:/a.dump

4、-XX:OnOutOfMemoryError:

  • -XX:OnOutOfMemoryError

    在OOM時,執行一個腳本。

      可以在OOM時,發送郵件,甚至是重啟程序。

-XX:OnOutOfMemoryError=D:/tools/jdk1.7_40/bin/printstack.bat %p //p代表的是當前進程的pid 

5.

堆的分配參數總結:

  • 根據實際事情調整新生代和幸存代的大小
  • 官方推薦新生代占堆的3/8
  • 幸存代占新生代的1/10
  • 在OOM時,記得Dump出堆,確保可以排查現場問題

6、永久區(也就是常說的methodSpace)分配參數:

  • -XX:PermSize -XX:MaxPermSize
  • 類多了就炸了

    設置永久區的初始空間和最大空間。也就是說,jvm啟動時,永久區一開始就占用了PermSize大小的空間,如果空間還不夠,可以繼續擴展,但是不能超過MaxPermSize,否則會OOM。

    他們表示,一個系統可以容納多少個類型

三、棧的分配參數:

1、Xss:

-Xss256K 

設置棧空間的大小。通常只有幾百K

  決定了函數調用的深度

  每個線程都有獨立的棧空間

  局部變量、參數 分配在棧上

註:棧空間是每個線程私有的區域。棧裏面的主要內容是棧幀,而棧幀存放的是局部變量表,局部變量表的內容是:局部變量、參數。

用沒有出口的遞歸調用可導致棧溢出

JVM手動分配內存(轉載)