一.jvm常用參數(shù)
1. -verbose:gc
2. -XX:+PrintGC? 打印gc
3. -XX:+PrintGCDetails? ? ? 打印gc的詳細(xì)信息
Heap
PSYoungGen? ? ? total 76288K, used 5243K [0x000000076b380000, 0x0000000770880000, 0x00000007c0000000)
eden space 65536K, 8% used [0x000000076b380000,0x000000076b89ed38,0x000000076f380000)
from space 10752K, 0% used [0x000000076fe00000,0x000000076fe00000,0x0000000770880000)
to? space 10752K, 0% used [0x000000076f380000,0x000000076f380000,0x000000076fe00000)
ParOldGen? ? ? total 175104K, used 0K [0x00000006c1a00000, 0x00000006cc500000, 0x000000076b380000)
object space 175104K, 0% used [0x00000006c1a00000,0x00000006c1a00000,0x00000006cc500000)
Metaspace? ? ? used 2874K, capacity 4486K, committed 4864K, reserved 1056768K
class space? ? used 308K, capacity 386K, committed 512K, reserved 1048576K
4.-XX:+PrintGCTimeStamps? 打印gc發(fā)生的時間戳
5.-Xloggc:log/gc.log? 指定log文件位置
6.-XX:+PrintHeapAtGC? 查看gc前后堆的大小
7.-XX:+TraceClassLoading? 監(jiān)控類的加載
8.-XX:+PrintClassHistogram? 按下ctrl+break 打印類的信息
9.-Xmx? -Xms
指定最大推和最小堆
比如? -Xmx20m -Xms5M
10.-Xmn? 設(shè)置新生代的大小
11.-XX:SurvivorRatio
設(shè)置兩個Survivor區(qū)(s0,s1)和eden的比
8表示 兩個survivor:eden=2:8 ,即一個survivor占年輕代的1/10
-XX:NewRatio
新生代(eden+2*s)和老年代(不包含永久區(qū))的比值
新生代:老年代 = 1:4 即年輕代占堆的1/5
12. -XX:+HeapDumpOnOutOfMemoryError? oom 時導(dǎo)出oom堆到文件
13. -XX:+HeapDumpPath 導(dǎo)出oom的路徑
-Xmx20m -Xms5m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:/log.txt
14. -XX:OnOutOfMemoryError
在發(fā)生內(nèi)存不夠的時候執(zhí)行一個腳本
-XX:OnOutOfMemoryError=D:/tools/jdk1.7_40/bin/printstack.bat %p
當(dāng)程序OOM時,在D:/a.txt中將會生成線程的dump
注:
根據(jù)事件調(diào)整新生代和幸存代的大小
官方推薦新生代占堆的3/8
幸存代占新生代的1/10
在oom 時根蟹,記得dump出堆嘁扼,確惫昧眩可以排查現(xiàn)場問題
永久區(qū)配置參數(shù)
15. -XX:PermSize? -XX:MaxPermSize
設(shè)置永久區(qū)的初始空間和最大空間
一個系統(tǒng)可以容納多少個類型
16. -Xss? 棧大小
通常只有幾百K
決定了函數(shù)調(diào)用的深度
每個線程都有獨(dú)立的棽鐾啵空間
二.垃圾回收器
1.串行垃圾回收器
? ? 局部變量、參數(shù) 分配在棧上
? ? 最古老舶斧,最穩(wěn)定
? ? 效率高
? ? 可能會產(chǎn)生較長的停頓
? ? -XX:+UseSerialGC
? ? ? ?新生代桃焕、老年代使用串行回收
? ? ? 新生代復(fù)制算法
2.并行垃圾回收器
2.1ParNew
? ? ? ?-XX:+UseParNewGC
? ? ? ?新生代并行
? ? ? ?老年代串行
? ? ? ?Serial收集器新生代的并行版本
? ? ? ?復(fù)制算法
? ? ? ?多線程,需要多核支持
? ? ? ?-XX:ParallelGCThreads 限制線程數(shù)量
2.2Parallel收集器
? ? ? 類似ParNew
? ? ?新生代復(fù)制算法
? ? ?老年代 標(biāo)記-壓縮
? ? ?更加關(guān)注吞吐量
? ? -XX:+UseParallelGC 使用Parallel收集器+ 老年代串行
? ? -XX:+UseParallelOldGC 使用Parallel收集器+ 并行老年代
2.3CMS收集器
? ?Concurrent Mark Sweep 并發(fā)標(biāo)記清除
? ?標(biāo)記-清除算法
? ?與標(biāo)記-壓縮相比? ?并發(fā)階段會降低吞吐量
? ?老年代收集器(新生代使用ParNew)
? ?-XX:+UseConcMarkSweepGC
2.3.1運(yùn)行流程
? ?CMS運(yùn)行過程比較復(fù)雜捧毛,著重實(shí)現(xiàn)了標(biāo)記的過程,可分為
? ?1.初始標(biāo)記
? ? ? ? ? 根可以直接關(guān)聯(lián)到的對象
? ? ? ? ? 速度快
? ?2.并發(fā)標(biāo)記(和用戶線程一起)
? ? ? ? ?主要標(biāo)記過程让网,標(biāo)記全部對象
? ?3.重新標(biāo)記
? ? ? ? 由于并發(fā)標(biāo)記時呀忧,用戶線程依然運(yùn)行,因此在正式清理前溃睹,再做修正
? ?4.并發(fā)清除(和用戶線程一起)
? ? ? ? 基于標(biāo)記結(jié)果而账,直接清理對象
三.命令精講
? ? -XX:+UseSerialGC:在新生代和老年代使用串行收集器
? ? -XX:SurvivorRatio:設(shè)置eden區(qū)大小和survivior區(qū)大小的比例
? ? -XX:NewRatio:新生代和老年代的比
? ? -XX:+UseParNewGC:在新生代使用并行收集器
? ? ?-XX:+UseParallelGC :新生代使用并行回收收集器
? ? ?-XX:+UseParallelOldGC:老年代使用并行回收收集器
? ? ?-XX:ParallelGCThreads:設(shè)置用于垃圾回收的線程數(shù)
? ? ?-XX:+UseConcMarkSweepGC:新生代使用并行收集器,老年代使用CMS+串行收集器
? ? ?-XX:ParallelCMSThreads:設(shè)定CMS的線程數(shù)量
? ? ?-XX:CMSInitiatingOccupancyFraction:設(shè)置CMS收集器在老年代空間被使用多少后觸發(fā)
? ? ?-XX:+UseCMSCompactAtFullCollection:設(shè)置CMS收集器在完成垃圾收集后是否要進(jìn)行一次內(nèi)存碎片的整理
? ? ?-XX:CMSFullGCsBeforeCompaction:設(shè)定進(jìn)行多少次CMS垃圾回收后因篇,進(jìn)行一次內(nèi)存壓縮
? ? ?-XX:+CMSClassUnloadingEnabled:允許對類元數(shù)據(jù)進(jìn)行回收
? ? ?-XX:CMSInitiatingPermOccupancyFraction:當(dāng)永久區(qū)占用率達(dá)到這一百分比時泞辐,啟動CMS回收
? ? ?-XX:UseCMSInitiatingOccupancyOnly:表示只在到達(dá)閥值的時候,才進(jìn)行CMS回收
老年代標(biāo)記-壓縮