java 内存回收参数_JVM常用参数(内存分配 内存回收日志)(七)
內存監控
-verbose:gc
測試代碼
public static voidmain(String[] args){
List classes=new ArrayList();int count=0;for(int i=0;true;i++){
classes.add(newClasses());if(classes.size()>10000){
count++;
classes.clear();
classes=new ArrayList();
System.out.println("標記為可回收");
}if(count>20){break;
}
}
}
1253K表示為回收前占用內存 903k表示回收后占用內存 可以發現標記回收后垃圾對象被成功回收, 3584為總內存 最后一個為回收時間
GC (Allocation Failure 表示為新生代回收
如果我們不標記為可回收會怎么樣
因為沒有標記為已回收 新生代from to 迭代15次或者滿了以后直接放到老年代 循環多次后老年代內存快滿了時觸發fullGC 因為都沒有標記為可回收所以每次回收后 占用內存沒有變化 最終導致內存溢出
-XX:+PrintGCDetails
-XX:+PrintGCDetails
打印每次gc的回收情況 程序運行結束后打印堆空間內存信息(包含內存溢出的情況)
[PSYoungGen: 512K->400K(1024K)] 表示年輕代占用空間 回收前和回收后
512K->400K(1536K) 表示為java堆的空間總內存的回收簽回收后內存
PsYoungGen?為新生代?總內存(total1024k )?使用(used 462K)?其中:
eden區? 512K
from區? 512K
to區? ? ? 521K
年輕代可用空間為1024可以發現eden+from+to大于1024? 新生代的內存為eden+from或者+to 因為年輕代采用復制算法 所以復制區域會有一塊兒重復的區域512 不能使用
ParOldGen?為老年代?總空間512K
Metaspace??PermGen永久代廢棄?jdk8使用?Metaspace(元空間) 替代
-XX:+PrintGCTimeStamps
打印每次gc的間隔的時間戳?full?gc為每次對新生代老年代以及整個空間做統一的回收?系統中應該盡量避免
產生fullgc的幾種情況? ?老年代空間不足? ? 持久代(元空間?或者jdk8的元空間)空間不足? 手動調用system.gc? 可以使用可以DisableExplicitGC來禁止
-XX:+TraceClassLoading
打印類加載情況
-XX:+PrintClassHistogram
打印每個類的實例的內存占用情況
通過按ctrl+Break 會打印 用的mac不知道咋么按? 哈哈哈
-XX:+PrintHeapAtGC
打印每次gc前后的內存情況
回收前年輕代eden區使用100% 老年代使用0% 回收后 eden區放到from區? ?老年代使用14%
Xloggc
配合上面的使用將上面的日志打印到指定文件
-Xloggc:/Users/liqiang/Desktop/logs/log.log
-XX:HeapDumpOnOutOfMemoryError
發生內存溢出將堆信息轉存起來?以便分析
-XX:HeapDumpPath為轉存位置? ? ?生成的文件使用JProfiler?打開?分析
也可以在內存溢出時執行腳本 比如發送郵件給系統管理員腳本
-XX:OnOutOfMemoryError ="sh ~/cleanup.sh"
內存分配參數
-Xmx -Xms堆的最大內存和最小內存(最小內存為初始內存 ,如果滿了將不斷擴容到最大內存)默認是物理內存的1/64
-Xmx20m -Xms20m? 則固定堆空間為20m(年輕代+老年代)
-XX:SurvivorRatio? Survivor(from-to)區和eden區的占比
例如?-XX:SurvivorRatio=5 則是5:1:1
-XX:SurvivorRatio=8:則是8:1:1
2560*(2/7)? 則是from和to的大小?剩下則是eden區的大小
-XMmn? 設置新生代的大小 (絕對值)
如-Xmn2m? 則設置新生為2m
-XX:NewRatio?新生代占老年代的比例
如果是4?則是1:4? ?如果是5則為1:5 默認為2
如:
雖然新生代空間為2m但是2m通過計算eden和from?to的的空間?但是真實新生代則是?eden+from或者to
-XX:PermSize ?-XX:MaxPermSize設置永久代的值和最大值
因為jdk8之后溢出了永久代?使用元空間代替
MaxMetaspaceSize? 元空間大小受制于操作系統內存
官方推薦堆空間內存分配
新生代占堆的3/8 ? ? 幸存代占新生代的1/10
棧空間內內存分配
-Xss
棧空間是保存變量的地址?所以棧空間的大小決定了方法調用的深度 。比如遞歸方法會產生大量的變量
設置棧大小為108k? 運行?幾秒后棧溢出
則報棧溢出
我們如果我們將參數改為10m?則會等很久才會內存溢出
內存分配參數默認值
-Xms(minimum?memory?size for pile?and heap)? ?默認情況下為機器內存的64分之一
-Xmx(maximum memory size for pile and heap)? ?默認情況下為機器內存的4分之一 等同于-XX:MaxHeapSize
-Xmn(年輕代的大小具體值)默認情況下堆內存的64分之一
-XX:NewRatio(年輕代占老年代的比例)默認為2(1:2)
-XX:SurvivorRatio(eden區與form to區的比例)默認為8(8:1:1)
jdk永久代大小設置?-XX:PermSize=64M -XX:MaxPermSize=128M
避免Concurrent Mode Failure
年老代剩余空間>=EDEN+SURVIROR,即:
(Xmx-Xmn)*(1-CMSInitiatingOccupancyFraction/100)>=(Xmn-Xmn/(SurvivorRatior+2))
Minor GC、Major GC和Full GC之間的區別
Minor GC
新生代 GC(Minor GC):指發生在新生代的垃圾收集動作,因為 Java 對象大多都具
備朝生夕滅的特性,所以 Minor GC 非常頻繁,一般回收速度也比較快。一般感知不到
Major GC
老年代回收
Full GC
整堆回收 一般會至少伴隨一次Minor GC?MajorGC 的速度一般會比 Minor GC 慢 10
倍以上。
總結
以上是生活随笔為你收集整理的java 内存回收参数_JVM常用参数(内存分配 内存回收日志)(七)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java jdbc in list_ja
- 下一篇: java 单链表约瑟夫环_java循环单