怎樣添加jvm啟動參數(shù) 如何獲取JVM的dump文件?
如何獲取JVM的dump文件?資源JVM的dump文件的兩種1.JVM啟動時增強兩個參數(shù):#出現(xiàn)OOME時化合堆dump:-XX:HeapDumpOnOutOfMemoryError#生成沉淀堆文件地
如何獲取JVM的dump文件?
資源JVM的dump文件的兩種
1.JVM啟動時增強兩個參數(shù):
#出現(xiàn)OOME時化合堆dump:
-XX:HeapDumpOnOutOfMemoryError
#生成沉淀堆文件地址:
-XX:HeapDumpPath/home/liuke/jvmlogs/
2.才發(fā)現(xiàn)程序異常前實際想執(zhí)行指令,就能生成當前JVM的dmp文件,6214是指JVM的進程號
jmap-dump:formatb,fileserviceDump.dat6214
而第一種是一種之后,要耐心的等待當前JVM直接出現(xiàn)問題后才能生成dmp文件,實時性不高,第二種在執(zhí)行時,JVM是暫停服務(wù)的,所以對線上的運行會產(chǎn)生影響。所以個人建議第一種。
如何正確學會Java虛擬機調(diào)優(yōu)?
一點小經(jīng)驗皆有可能:
1)堆
運行時數(shù)據(jù)區(qū)域,所有類實例和數(shù)組的內(nèi)存均從此處分配。Java虛擬機啟動時時創(chuàng)建角色。對象的堆內(nèi)存由稱作垃圾回收器的自動出現(xiàn)內(nèi)存管理系統(tǒng)回收。
堆由兩部分分成:
其中edenfromspacetospace也叫年長代(young),oldspace叫舊生代.
其中有S1,S0(在JDK的從網(wǎng)上下載工具輸出中會看見),四個指的是Survivorspace,存放每次來垃圾回收后能夠存活的對象.
OldGeneration,比較多存放應(yīng)用程序中生命周期長的存活對象
垃圾回收要注意是對YoungGeneration塊和OldGeneration塊內(nèi)存接受回收,YG用來放新才能產(chǎn)生的對象,當經(jīng)過幾次回收都還沒回收掉的對象往OG中移動,
對YG接受垃圾回收又叫做MinorGC,對OG垃圾回收叫MajorGC,幾塊內(nèi)存回收井水不犯河水
2)非堆內(nèi)存
JVM具有一個由所有線程互相訪問的方法區(qū)。方法區(qū)屬于非堆內(nèi)存。它儲存每個類結(jié)構(gòu),如運行時常數(shù)池、字段和方法數(shù)據(jù),包括方法和構(gòu)造方法的代碼。它是在Java虛擬機啟動后時創(chuàng)建角色的。
以外方法區(qū)外,Java虛擬機利用肯定是需要主要用于內(nèi)部處理或優(yōu)化的內(nèi)存,這種內(nèi)存也非堆內(nèi)存。的或,JIT編譯器要內(nèi)存來存儲文件從Java虛擬機代碼可以轉(zhuǎn)換而來的本機代碼,使額外低性能。
Permanent Generation(圖中的PermanentSpace)貯存JVM自己的反射對象,諸如類對象和方法對象
3)回收算法和過程
JVM常規(guī)一種分代回收(generationalcollection)的策略,用較高的頻率對年長的對象(younggeneration)通過掃描和工廠回收,這種叫作minorcollection,而對老對象(oldgeneration)的檢查回收頻率要低比較多,一般稱ti國際邀請賽collection。那樣的話就不必須每次GC都將內(nèi)存中所有對象都去檢查一遍。
當一個URL被ftp連接時,內(nèi)存申請過程不勝感激:
A.JVM會企圖為咨詢Java對象在Eden中重新初始化一塊內(nèi)存區(qū)域
B.當Eden空間足夠時,內(nèi)存可以申請結(jié)束了。不然的話到接下來
C.JVM借著釋放出在Eden中所有不亢奮狀態(tài)的對象(這屬于1或更低級的垃圾回收),釋放后若Eden空間仍舊絕對無法放進去新對象,則企圖將部分Eden中亢奮狀態(tài)對象放入Survivor區(qū)D. Survivor區(qū)被利用作為Eden及OLD的中間同樣區(qū)域,當OLD區(qū)空間足夠時,Survivor區(qū)的對象會被移到Old區(qū),否則會被可以保留在Survivor區(qū)
E.當OLD區(qū)空間夠不夠時,JVM會在OLD區(qū)進行幾乎的垃圾收集(0級)
F.幾乎垃圾收集后,若Survivor及OLD區(qū)依舊難以存放從Eden不能復制進來的部分對象,會造成JVM根本無法在Eden區(qū)為新對象創(chuàng)建角色內(nèi)存區(qū)域,則再次出現(xiàn)”out ofmemory錯誤”
對象衰老的過程
younggeneration的內(nèi)存,由一塊Eden(伊甸園,很好玩)和四塊Survivor Space(1.4文檔中被稱semi-space)構(gòu)成。新創(chuàng)建家族的對象的內(nèi)存都分區(qū)分配自eden。三塊SurvivorSpace總有會一塊是空閑的,使用較多copyingcollection的目標空間。Minorcollection的過程應(yīng)該是將eden和在用survivorspace中的活對象copy到閑時survivorspace中。說白survivor,也就是大部分對象在伊甸園出生后,完全沒有活但是三次GC。對象在younggeneration里奇遇了是有次數(shù)的minorcollection后,年紀大了,是會被移到oldgeneration中,稱為tenuring。(有無僅當survivorspace不足的時候才會將老對象tenuring?目前資料中還沒有找到描述)
剩下的內(nèi)存空間不足會不觸發(fā)GC,如eden空間夠不夠了還要進行minorcollection,oldgeneration空間夠不夠要進行faceitcollection,permanentgeneration空間不繼會引發(fā)clearGC。
4接下來的這部分回答的是TOMCAT或者其他服務(wù)器直接出現(xiàn)萬分感謝錯誤時的分析:
1、簡單是:Javaheapspace
請解釋:
Heapsize設(shè)置里
JVM堆的設(shè)置是指java程序運行過程中JVM是可以調(diào)配在用的內(nèi)存空間的設(shè)置.JVM在正常啟動的時候會自動啟動系統(tǒng)設(shè)置Heapsize的值,其精靈召喚空間(即-Xms)是物理內(nèi)存的1/64,最大空間(-Xmx)是物理內(nèi)存的1/4。是可以用來JVM提供的-Xmn-Xms-Xmx等選項可參與設(shè)置中。Heapsize的大小是YoungGeneration和TenuredGeneraion之和。
提示:在JVM中如果98%的時間是主要是用于GC且后用的Heapsize不足以2%的時候?qū)伋龃水惓P畔ⅰ?/p>
提示:HeapSize的最千萬不能將近用些物理內(nèi)存的80%,象的要將-Xms和-Xmx選項設(shè)置為是一樣的,而-Xmn為1/4的-Xmx值。
解決方法:
手動啟動系統(tǒng)設(shè)置Heapsize
如何修改TOMCAT_,在“echoUsingCATALINA_BASE:$CATALINA_BASE”上面加入200以內(nèi)行:
Java代碼
setJAVA_OPTS%JAVA_OPTS%-server-Xms800m-Xmx800m-XX:MaxNewSize256m
setJAVA_OPTS%JAVA_OPTS%-server-Xms800m-Xmx800m-XX:MaxNewSize256m
或可以修改
在“echoUsingCATALINA_BASE:$CATALINA_BASE”上面加入200以內(nèi)行:
JAVA_OPTS$JAVA_OPTS -server -Xms800m-Xmx800m-XX:MaxNewSize256m
2、主要是:PermGenspace
原因:
PermGenspace的全稱是Permanent Generation space,是指內(nèi)存的永久保存區(qū)域,這塊內(nèi)存比較多是被JVM貯放Class和Meta信息的,Class在被Loader時可能會被弄到PermGenspace中,它和存放類實例(Instance)的Heap區(qū)域有所不同,GC(Garbage Collection)不會在主程序運行期對PermGen space參與清理,所以才假如你的應(yīng)用中有很CLASS的話,就很可能會出現(xiàn)PermGenspace錯誤,這種錯誤較常見在web服務(wù)器對JSP并且precompile的時候。如果沒有你的WEBAPP下都我用大量的第三方j(luò)ar,其大小將近了jvm設(shè)置成的大小(4M)那你都會產(chǎn)生此錯誤信息了。
解決方法:
1.不自動設(shè)置里MaxPermSize大小
可以修改TOMCAT_(Linux下為),在Java代碼
“echoUsingCATALINA_BASE:$CATALINA_BASE”上面加入200以內(nèi)行:
setJAVA_OPTS%JAVA_OPTS%-server-XX:PermSize128M-XX:MaxPermSize512m
“echoUsingCATALINA_BASE:$CATALINA_BASE”上面加入到以上行:
setJAVA_OPTS%JAVA_OPTS%-server-XX:PermSize128M-XX:MaxPermSize512m
下為:
Java代碼
JAVA_OPTS$JAVA_OPTS-server-XX:PermSize128M-XX:MaxPermSize512m
JAVA_OPTS$JAVA_OPTS-server-XX:PermSize128M-XX:MaxPermSize512m
JVM的默認設(shè)置
堆(heap)(NewsGeneration和OldGeneraion之和)的設(shè)置
葉綠里分配的內(nèi)存由-Xms更改,默認是物理內(nèi)存的1/64但大于1G。
大分配的內(nèi)存由-Xmx指定你,默認是物理內(nèi)存的1/4但大于01G。
設(shè)置為空余堆內(nèi)存大于140%時,JVM就會大小改變堆等到-Xmx的大的限制,可以由-XX:MinHeapFreeRatio指定。
設(shè)置成空閑區(qū)域堆內(nèi)存大于70%時,JVM會增加堆待到-Xms的最大值限制,可以不由-XX:MaxHeapFreeRatio重新指定。
服務(wù)器像是設(shè)置-Xms、-Xmx大小關(guān)系以盡量的避免在有時候GC后按照堆的大小,因為上面的兩個參數(shù)真沒什么用。
-Xmn設(shè)置里younggeneration的heap大小
-XX:MinHeapFreeRatio與-XX:MaxHeapFreeRatio設(shè)置閑時內(nèi)存占總內(nèi)存的比例范圍,這兩個參數(shù)會影響不大GC的頻率和單次GC的耗時。-XX:NewRatio確定young與oldgeneration的比例。Younggeneration空間越大,minorcollection頻率越低,可是sillygeneration空間小了,又很有可能倒致faceitcollection頻率提高。-XX:NewSize和-XX:MaxNewSize再指定你了younggeneration的缺省大小和最大大小。
非堆內(nèi)存的設(shè)置
默認分配為64M
-XX:PermSize設(shè)置中小于分配空間,-XX:MaxPermSize可以設(shè)置最大分配空間。好象把這兩個數(shù)值設(shè)為不同,以減少去申請內(nèi)存空間的時間。
再講解時和筆記下,JDK下的一些去相關(guān)看內(nèi)存管理工具的使用:
欄里點jvm內(nèi)存狀態(tài):
jstat-gcutilpid100020
發(fā)現(xiàn)異常的例子
jstat-gcutilpid100020
S0S1EOPYGC YGCT FGC FGCT GCT
0.000.0099.9982.5153.1124091.205101177250.3937251.598
0.000.0083.4282.5553.1024091.205101187252.6507253.855
0.000.0056.0682.4653.1024101.205101207254.4677255.672
0.000.0032.1182.5553.1024111.205101217256.6737257.877
0.000.0099.9982.5553.1024121.205101237257.0267258.231
0.000.0076.0082.5053.1024121.205101247259.2417260.446
這個數(shù)據(jù)顯示clearGC不穩(wěn)定不可能發(fā)生。
正常了情況的例子
S0S1EOPYGC YGCT FGC FGCT GCT
0.000.000.2455.3999.601710.6671339393.364394.031
0.000.000.2455.3999.601710.6671339393.364394.031
0.000.000.2455.3999.601710.6671339393.364394.031
0.000.000.2455.3999.601710.6671339393.364394.031
0.000.000.2455.3999.601710.6671339393.364394.031
0.000.000.2455.3999.601710.6671339393.364394.031
參數(shù)含義:
S0:Heap上的Survivorspace0段已在用空間的百分比
S1:Heap上的Survivorspace1段已不使用空間的百分比
E:Heap上的Eden space段已不使用空間的百分比
O:Heap上的Old space段已可以使用空間的百分比
P:Permspace已不使用空間的百分比
YGC:從程序啟動到采樣時發(fā)生了什么YoungGC的次數(shù)
YGCT:YoungGC所是用時間(單位秒)
FGC:從程序啟動到采樣時發(fā)生了什么endlessGC的次數(shù)
FGCT:clearGC所帶的時間(單位秒)
GCT:作用于垃圾回收的總時間(單位秒)
2Dump出內(nèi)存
2.1找出要dump的線程pid
在Linux下,在用ps–aux
2.2Dump出內(nèi)存使用詳情
也可以命令:
jmap-dump:filea.hprofpid
例如:jmap-heap2343,可以清晰的看到
AttachingtoprocessID2343,pleasewait...
Debuggerattachedsuccessfully.
Servercompilerdetected.
JVMversionisn't11.0-b16
usingthread-localobjectallocation.
ParallelGCwith8thread(s)
HeapConfiguration:
MinHeapFreeRatio40
MaxHeapFreeRatio 70 MaxHeapSize 4294967296 (4096.0MB)
NewSize2686976(2.5625MB)
MaxNewSize-65536(-0.0625MB)
OldSize5439488(5.1875MB)
NewRatio2(YG,OG大小比為1:2)
SurvivorRatio8
PermSize21757952(20.75MB)
MaxPermSize 268435456 (256.0MB)
HeapUsage:
PSYoungGeneration
EdenSpace:
capacity1260060672(1201.6875MB)
needed64868288(61.86322021484375MB)
fun1195192384(1139.8242797851562MB)
5.148028935546367%employed
aroundSpace:
capacity85524480(81.5625MB)
used59457648(56.70323181152344MB)
free26066832(24.859268188476562MB)
69.52120375359195%needed
didSpace: capacity 85852160 (81.875MB)
needed0(0.0MB)
cool85852160(81.875MB)
0.0%utilized
~~~~~~~~~~~~~~~~~~~~~~~~~~這三塊為上面所說的YG大小和建議使用情況
PS Old Generation capacity 2291138560 (2185.0MB)
used1747845928(1666.8757705688477MB)
fit543292632(518.1242294311523MB)
76.28722062099989%utilized
~~~~~~~~~~~~~~~~~~~~~~~~~~OG大小和不使用情況
PS Perm Generation capacity 108265472 (103.25MB)
needed107650712(102.6637191772461MB)
go614760(0.5862808227539062MB)
99.43217353728436%needed
jstat
jstat是vm的狀態(tài)監(jiān)控工具,監(jiān)控的內(nèi)容有類加載、運行程序時代碼編譯及GC。
使用時,需另外查看進程的進程id,和所選參數(shù)。以下具體點能介紹各個參數(shù)的意義。
jstat-classpid:會顯示運行程序class的數(shù)量,及所占空間等信息。
jstat-compilerpid:不顯示VM實時編譯的數(shù)量等信息。
jstat-gcpid:是可以會顯示gc的信息,打開系統(tǒng)gc的次數(shù),及時間。其中結(jié)果五項,三個是younggc的次數(shù),younggc的時間,cleargc的次數(shù),endlessgc的時間,gc的總時間。
jstat-gccapacity:可以沒顯示,VM內(nèi)存中三代(young,old,perm)對象的使用和電腦資源大小,如:PGCMN不顯示的是最大值perm的內(nèi)存在用量,PGCMX沒顯示的是perm的內(nèi)存最大不使用量,PGC是當前新生成的perm內(nèi)存占用量,PC是但前perm內(nèi)存占用量。其他的是可以參照這個以此類推,OC是old內(nèi)純的占用量。
jstat-gcnewpid:next對象的信息。
jstat-gcnewcapacitypid:future對象的信息及電腦資源量。
jstat-gcoldpid:old對象的信息。
jstat-gcoldcapacitypid:old對象的信息非盈利組織會計占用量。
jstat-gcpermcapacitypid:perm對象的信息非盈利組織會計電腦資源量。
jstat-utilpid:統(tǒng)計gc信息統(tǒng)計。
jstat-printcompilationpid:當前VM負責執(zhí)行的信息。
除此之外以上一個參數(shù)外,還也可以同樣的而且兩個數(shù)字,如:jstat-printcompilation30242506是每250毫秒不打印四次,最少打印6次,還可以另外-h3每三行會顯示一下標題。
例子:
jstat-gcutilpid100020
S0S1EOPYGC YGCT FGC FGCT GCT
47.490.0064.8246.0847.69208222058.6316822.7342081.365
0.0037.9138.5746.1347.69208232058.6916822.7342081.425這里突然發(fā)生了兩次YGGC,也就是MinorGC,前后歷時0.06s
46.690.0015.1946.1847.69208242058.7766822.7342081.510
46.690.0074.5946.1847.69208242058.7766822.7342081.510
0.0040.2919.9546.2447.69208252058.8486822.7342081.582
MajorGC來算時間:22.734/680.334秒
MinorGC來算時間:2058.691/208230.099秒