怎么對JVM的性能進行優(yōu)化?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
1、JVM內(nèi)存模型
總結:可以發(fā)現(xiàn)最明顯的一個變化是元空間從虛擬機轉移到了本地內(nèi)存。默認情況下,元數(shù)據(jù)空間大小僅受限于本地內(nèi)存, 這意味著以后不會因為永久代大小不夠而拋出OOM異常了。 jdk1.8以前,HotSpot VM將class和類的jar包數(shù)據(jù)存儲在PermGen里, PermGen大小是固定的,而且項目之間無法公用公有的class,所以很容易碰到OOM異常。改成MateSpace后, 各個項目會共享同樣的class空間。比如多個項目都引用了apache-common包, 在MateSpace中只會存儲一份的apache-common的class,提高了內(nèi)存的利用率,垃圾回收更有效。
2、JVM堆內(nèi)存常用參數(shù)
參數(shù) | 描述 |
---|---|
-Xms | 堆內(nèi)存初始大小,單位m、g |
-Xmx(MaxHeapSize) | 堆內(nèi)存較大允許大小,一般不要大于物理內(nèi)存的80% |
-XX:PermSize | 非堆內(nèi)存初始大小,一般應用設置初始化200m,較大1024m就夠了 |
-XX:MaxPermSize | 非堆內(nèi)存較大允許大小 |
-XX:NewSize(-Xns) | 年輕代內(nèi)存初始大小 |
-XX:MaxNewSize(-Xmn) | 年輕代內(nèi)存較大允許大小,也可以縮寫 |
-XX:SurvivorRatio=8 | 年輕代中Eden區(qū)與Survivor區(qū)的容量比例值,默認為8,即8:1 |
-Xss | 堆棧內(nèi)存大小 |
3、GC(Garbage Collection)算法
這里的GC具體指的是新生代的復制算法
首先貼一張網(wǎng)上盜來的大圖,用它來說明一下GC的過程
內(nèi)存分配策略:
大多數(shù)情況下,對象在新生代的Eden中分配。當Eden區(qū)沒有足夠的空間進行分配時,虛擬機將發(fā)起一次Minor GC,而大對象(需要大量連續(xù)內(nèi)存空間的Java對象,類似長字符串和數(shù)組)將通過分配擔保機制直接進入老年代。
Minor GC——復制算法具體過程:
將Eden和S0中還存活著的對象一次性的復制到S1中,并且清理掉Eden與S0的空間。如果S1放不下還存活著的對象,那這些對象將通過分配擔保機制進入老年代。【原理上隨時保持S0和S1有一個是空的,用來存下一次的對象】
Eden區(qū)快滿的時候,會進行上一步類似操作,將Eden和S1區(qū)的年紀大的對象放到S0區(qū)【此時S1區(qū)就是空的】
直到Eden區(qū)快滿,S0或者S1也快滿的時候,這時候就把這兩個區(qū)的年紀大的對象放到Old區(qū)。
依次循環(huán),直到Old區(qū)也快滿的時候,Eden區(qū)也快滿的時候,會對整個這一塊內(nèi)存區(qū)域進行一次大清洗(FullGC),騰出內(nèi)存,為之后的對象創(chuàng)建,程序運行騰地方。
新生代GC(Minor GC):指發(fā)生在新生代的垃圾回收動作,因為java對象大多具備朝生夕滅的特征,所以Minor GC發(fā)生的特別頻繁,
一般回收速度也很快。
老年代GC(Major GC/Full GC):指發(fā)生在老年代的GC,出現(xiàn)了Major GC,至少會伴隨一次的MinorGC(但非絕對,
在Parallel Scavenge收集器的收集策略里就有直接進行Minor GC的策略選擇過程)。Major GC的速度一般比Minor GC慢10倍以上。
4、JVM參數(shù)配置
在jdk1.8以前,生產(chǎn)環(huán)境一般有如下配置
-XX:PermSize=512M -XX:MaxPermSize=1024M
表示在JVM里存儲Java類信息,常量池和靜態(tài)變量的永久代區(qū)域初始大小為512M,較大為1024M。在項目啟動后,這個值是固定的,如果項目class過多,很可能遇到OutOfMemoryError: PermGen異常。
升級JDK1.8之后,上面的perm配置已經(jīng)變成
-XX:MetaspaceSize=512M XX:MaxMetaspaceSize=1024M
MetaspaceSize如果不做配置,通過jinfo查看默認MetaspaceSize大?。s21M),MaxMetaspaceSize很大很大,前面說過MetaSpace只受本地內(nèi)存大小限制。
jinfo -flag MetaspaceSize 1234 #結果為:-XX:MetaspaceSize=21807104
jinfo -flag MaxMetaspaceSize 1234 #結果為:-XX:MaxMetaspaceSize=18446744073709547520
干貨:MetaspaceSize為觸發(fā)FullGC的閾值,默認約為21M,如做了配置,最小閾值為自定義配置大小??臻g使用達到閾值,觸發(fā)FullGC,同時對該值擴大。當然如果元空間實際使用小于閾值,在GC的時候也會對該值縮小。
MaxMetaspaceSize為元空間的較大值,如果設置太小,可能會導致頻繁FullGC,甚至OOM。
5. JVM參數(shù)配置指南
前面三個部分對JVM進行了整體的了解,接下來是本文的重點。
-XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=256M -Xms256m -Xmx256m
文章看下來上面這段配置的意思很簡單,設置元空間的初始值和較大值,設置堆空間的初始值和較大值。
為什么MetaspaceSize要設置為128M?為什么堆內(nèi)存初始值Xms設置為256M而不是512M?
按照Java官方的指導
5. JVM監(jiān)控jstat
可以讓系統(tǒng)運行一段時間后查看系統(tǒng)的各個指標,然后在進行配置。如下用jstat工具查看jvm的情況
jstat -gc 12345
###
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
13824.0 22528.0 13377.0 0.0 548864.0 535257.2 113152.0 46189.3 73984.0 71119.8 9728.0 9196.2 14 0.259 3 0.287 0.546
OU表示老年代所占用的內(nèi)存為 46189.3 K(大約45M);那么jvm相應的配置參數(shù)應該做如下修改
-XX:MetaspaceSize=64M -XX:MaxMetaspaceSize=64M -Xms180m -Xmx180m
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)網(wǎng)站建設公司,的支持。
網(wǎng)頁標題:怎么對JVM的性能進行優(yōu)化-創(chuàng)新互聯(lián)
網(wǎng)頁URL:http://vcdvsql.cn/article2/eieoc.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、手機網(wǎng)站建設、響應式網(wǎng)站、關鍵詞優(yōu)化、外貿(mào)建站、網(wǎng)站排名
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)