JVM手動分配內存(轉載)
原文內容很詳細,不利於快速瀏覽,所以只保留了重點
原文地址 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手動分配內存(轉載)