主要是三種參數
Trace跟蹤參數
堆的分配參數
棧的分配參數
1.Trace跟蹤參數
-XX:+PrintGCDetails 打印GC詳細信息
-XX:+PrintGCDateStamps 輸出GC的時間戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
-Xloggc:log/gc.log 將gc信息輸出到文件,:後表示文件路徑
2.堆的分配參數
-Xmx 最大化堆內存大小
–Xms 初始化對內存大小
程序在Runtime中含有三個信息分別是
runtime.maxMemory() 即最大化堆內存大小
runtime.totalMemory() 當前運行分配的總內存大小,java會盡量維持在最小堆內存
runtime.freeMemory() 當前運行分配的總內存中有多少是沒被佔用的
堆內存
由新生代和老年代組成,新生代中又分爲兩個Survivor區和eden
-Xmn 設置新生代大小
-XX:NewRatio 新生代(eden+2*s)和老年代(不包含永久區)的比值 ,4 表示 新生代:老年代=1:4,即年輕代佔堆的1/5
-XX:SurvivorRatio 設置兩個Survivor區和eden的比 ,8表示 兩個Survivor :eden=2:8,即一個Survivor佔年輕代的1/10
如下圖
堆溢出問題
-XX:+HeapDumpOnOutOfMemoryError OOM時導出堆到文件
-XX:+HeapDumpPath 導出OOM的路徑
如:
-Xmx20m -Xms5m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:/a.dump
或者在堆溢出時執行一個腳本
nXX:OnOutOfMemoryError
–在OOM時,執行一個腳本
-XX:OnOutOfMemoryError=D:/tools/jdk1.7_40/bin/printstack.bat %p
堆內存總結:
根據實際事情調整新生代和倖存代的大小
官方推薦新生代佔堆的3/8
倖存代佔新生代的1/10
在OOM時,記得Dump出堆,確保可以排查現場問題
堆溢出錯誤:java.lang.OutOfMemoryError
*******有時候堆空間實際佔用非常少,但是永久區溢出 一樣拋出OOM
3.棧內存參數
-Xss 每個線程私有,對於線程運行不可缺少
通常只有幾百K 越大能容納的線程數越少
決定了函數調用的深度 越大能遞歸調用的次數越大
每個線程都有獨立的棧空間
局部變量、參數 分配在棧上
棧空間溢出錯誤:java.lang.StackOverflowError
常見堆棧錯誤見鏈接https://blog.csdn.net/sinat_29912455/article/details/51125748