详解:JVM内存调优参数
分享一波:程序員賺外快-必看的巔峰干貨
-Xms
JVM啟動(dòng)時(shí)申請(qǐng)的初始Heap值,默認(rèn)為操作系統(tǒng)物理內(nèi)存的1/64但小于1G。默認(rèn)當(dāng)空余堆內(nèi)存大于70%時(shí),JVM會(huì)減小heap的大小到-Xms指定的大小,可通過(guò)-XX:MaxHeapFreeRation=來(lái)指定這個(gè)比列。Server端JVM最好將-Xms和-Xmx設(shè)為相同值,避免每次垃圾回收完成后JVM重新分配內(nèi)存;開發(fā)測(cè)試機(jī)JVM可以保留默認(rèn)值。
-Xmx
JVM可申請(qǐng)的最大Heap值,默認(rèn)值為物理內(nèi)存的1/4但小于1G,默認(rèn)當(dāng)空余堆內(nèi)存小于40%時(shí),JVM會(huì)增大Heap到-Xmx指定的大小,可通過(guò)-XX:MinHeapFreeRation=來(lái)指定這個(gè)比列。最佳設(shè)值應(yīng)該視物理內(nèi)存大小及計(jì)算機(jī)內(nèi)其他內(nèi)存開銷而定。
-Xmn
Java Heap Young區(qū)大小。整個(gè)堆大小=年輕代大小 + 年老代大小 + 持久代大小(相對(duì)于HotSpot 類型的虛擬機(jī)來(lái)說(shuō))。持久代一般固定大小為64m,所以增大年輕代后,將會(huì)減小年老代大小。此值對(duì)系統(tǒng)性能影響較大,Sun官方推薦配置為整個(gè)堆的3/8。
程序新創(chuàng)建的對(duì)象都是從年輕代分配內(nèi)存,年輕代由Eden Space和兩塊相同大小的SurvivorSpace(通常又稱S0和S1或From和To)構(gòu)成,可通過(guò)-Xmn參數(shù)來(lái)指定年輕代的大小,也可以通過(guò)-XX:SurvivorRation來(lái)調(diào)整Eden Space及SurvivorSpace的大小。
老年代用于存放經(jīng)過(guò)多次新生代GC仍然存活的對(duì)象,例如緩存對(duì)象,新建的對(duì)象也有可能直接進(jìn)入老年代,主要有兩種情況:1、大對(duì)象,可通過(guò)啟動(dòng)參數(shù)設(shè)置-XX:PretenureSizeThreshold=1024(單位為字節(jié),默認(rèn)為0)來(lái)代表超過(guò)多大時(shí)就不在新生代分配,而是直接在老年代分配。2、大的數(shù)組對(duì)象,且數(shù)組中無(wú)引用外部對(duì)象。老年代所占的內(nèi)存大小為-Xmx對(duì)應(yīng)的值減去-Xmn對(duì)應(yīng)的值。如果在堆中沒有內(nèi)存完成實(shí)例分配,并且堆也無(wú)法再擴(kuò)展時(shí),將會(huì)拋出OutOfMemoryError異常。
-Xss
Java每個(gè)線程的Stack大小。JDK5.0以后每個(gè)線程堆棧大小為1M,以前每個(gè)線程堆棧大小為256K。根據(jù)應(yīng)用的線程所需內(nèi)存大小進(jìn)行調(diào)整。在相同物理內(nèi)存下,減小這個(gè)值能生成更多的線程。但是操作系統(tǒng)對(duì)一個(gè)進(jìn)程內(nèi)的線程數(shù)還是有限制的,不能無(wú)限生成,經(jīng)驗(yàn)值在3000~5000左右。(例如:-Xss1024K)
-XX:PermSize
持久代(方法區(qū))的初始內(nèi)存大小。(例如:-XX:PermSize=64m)
-XX:MaxPermSize
持久代(方法區(qū))的最大內(nèi)存大小。(例如:-XX:MaxPermSize=512m)
-XX:+UseSerialGC
串行(SerialGC)是jvm的默認(rèn)GC方式,一般適用于小型應(yīng)用和單處理器,算法比較簡(jiǎn)單,GC效率也較高,但可能會(huì)給應(yīng)用帶來(lái)停頓。
-XX:+UseParallelGC
并行(ParallelGC)是指多個(gè)線程并行執(zhí)行GC,一般適用于多處理器系統(tǒng)中,可以提高GC的效率,但算法復(fù)雜,系統(tǒng)消耗較大。(配合使用:-XX:ParallelGCThreads=8,并行收集器的線程數(shù),此值最好配置與處理器數(shù)目相等)
-XX:+UseParNewGC
設(shè)置年輕代為并行收集,JKD5.0以上,JVM會(huì)根據(jù)系統(tǒng)配置自行設(shè)置,所以無(wú)需設(shè)置此值。
-XX:+UseParallelOldGC
設(shè)置年老代為并行收集,JKD6.0出現(xiàn)的參數(shù)選項(xiàng)。
-XX:+UseConcMarkSweepGC
并發(fā)(ConcMarkSweepGC)是指GC運(yùn)行時(shí),對(duì)應(yīng)用程序運(yùn)行幾乎沒有影響(也會(huì)造成停頓,不過(guò)很小而已),GC和app兩者的線程在并發(fā)執(zhí)行,這樣可以最大限度不影響app的運(yùn)行。
-XX:+UseCMSCompactAtFullCollection
在Full GC的時(shí)候,對(duì)老年代進(jìn)行壓縮整理。因?yàn)镃MS是不會(huì)移動(dòng)內(nèi)存的,因此非常容易產(chǎn)生內(nèi)存碎片。因此增加這個(gè)參數(shù)就可以在FullGC后對(duì)內(nèi)存進(jìn)行壓縮整理,消除內(nèi)存碎片。當(dāng)然這個(gè)操作也有一定缺點(diǎn),就是會(huì)增加CPU開銷與GC時(shí)間,所以可以通過(guò)-XX:CMSFullGCsBeforeCompaction=3 這個(gè)參數(shù)來(lái)控制多少次Full GC以后進(jìn)行一次碎片整理。
-XX:+CMSInitiatingOccupancyFraction=80
代表老年代使用空間達(dá)到80%后,就進(jìn)行Full GC。CMS收集器在進(jìn)行垃圾收集時(shí),和應(yīng)用程序一起工作,所以,不能等到老年代幾乎完全被填滿了再進(jìn)行收集,這樣會(huì)影響并發(fā)的應(yīng)用線程的空間使用,從而再次觸發(fā)不必要的Full GC。
-XX:+MaxTenuringThreshold=10
垃圾的最大年齡,代表對(duì)象在Survivor區(qū)經(jīng)過(guò)10次復(fù)制以后才進(jìn)入老年代。如果設(shè)置為0,則年輕代對(duì)象不經(jīng)過(guò)Survivor區(qū),直接進(jìn)入老年代。
*************************************優(yōu)雅的分割線 **********************************
分享一波:程序員賺外快-必看的巔峰干貨
如果以上內(nèi)容對(duì)你覺得有用,并想獲取更多的賺錢方式和免費(fèi)的技術(shù)教程
請(qǐng)關(guān)注微信公眾號(hào):HB荷包
一個(gè)能讓你學(xué)習(xí)技術(shù)和賺錢方法的公眾號(hào),持續(xù)更新
總結(jié)
以上是生活随笔為你收集整理的详解:JVM内存调优参数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微软全新Chromium版Edge浏览器
- 下一篇: SonarQube结合IDEA实现代码检