java內存區域html
一些基本概念java
http://www.importnew.com/18694.html程序員
https://www.cnblogs.com/wangyayun/p/6557851.html算法
1.方法區和堆是全部線程共享的內存區域;而java棧、本地方法棧和程序員計數器是運行時線程私有的內存區域。
2.Java堆(Heap),是Java虛擬機所管理的內存中最大的一塊。Java堆是被全部線程共享的一塊內存區域,在虛擬機啓動時建立。此內存區域的惟一目的就是存放對象實例,幾乎全部的對象實例都在這裏分配內存。
3.方法區(Method Area),方法區(Method Area)與Java堆同樣,是各個線程共享的內存區域,它用於存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據。
4.程序計數器(Program Counter Register),程序計數器(Program Counter Register)是一塊較小的內存空間,它的做用能夠看作是當前線程所執行的字節碼的行號指示器。
5.JVM棧(JVM Stacks),與程序計數器同樣,Java虛擬機棧(Java Virtual Machine Stacks)也是線程私有的,它的生命週期與線程相同。虛擬機棧描述的是Java方法執行的內存模型:每一個方法被執行的時候都會同時建立一個棧幀(Stack Frame)用於存儲局部變量表、操做棧、動態連接、方法出口等信息。每個方法被調用直至執行完成的過程,就對應着一個棧幀在虛擬機棧中從入棧到出棧的過程。
6.本地方法棧(Native Method Stacks),本地方法棧(Native Method Stacks)與虛擬機棧所發揮的做用是很是類似的,其區別不過是虛擬機棧爲虛擬機執行Java方法(也就是字節碼)服務,而本地方法棧則是爲虛擬機使用到的Native方法服務。緩存
堆中存的是對象。棧中存的是基本數據類型和堆中對象的引用tomcat
類的生命週期
1.加載,查找並加載類的二進制數據,在Java堆中也建立一個java.lang.Class類的對象
2.鏈接,鏈接又包含三塊內容:驗證、準備、解析。1)驗證,文件格式、元數據、字節碼、符號引用驗證;2)準備,爲類的靜態變量分配內存,並將其初始化爲默認值;3)解析,把類中的符號引用轉換爲直接引用
3.初始化,爲類的靜態變量賦予正確的初始值
4.使用,new出對象程序中使用
5.卸載,執行垃圾回收多線程
引用類型
對象引用類型分爲強引用、軟引用、弱引用和虛引用
強引用:就是咱們通常聲明對象是時虛擬機生成的引用,強引用環境下,垃圾回收時須要嚴格判斷當前對象是否被強引用,若是被強引用,則不會被垃圾回收
軟引用:軟引用通常被作爲緩存來使用。與強引用的區別是,軟引用在垃圾回收時,虛擬機會根據當前系統的剩餘內存來決定是否對軟引用進行回收。若是剩餘內存比較緊張,則虛擬機會回收軟引用所引用的空間;若是剩餘內存相對富裕,則不會進行回收。換句話說,虛擬機在發生OutOfMemory時,確定是沒有軟引用存在的。併發
弱引用:弱引用與軟引用相似,都是做爲緩存來使用。但與軟引用不一樣,弱引用在進行垃圾回收時,是必定會被回收掉的,所以其生命週期只存在於一個垃圾回收週期內。
強引用不用說,咱們系統通常在使用時都是用的強引用。而「軟引用」和「弱引用」比較少見。他們通常被做爲緩存使用,並且通常是在內存大小比較受限的狀況下作爲緩存。由於若是內存足夠大的話,能夠直接使用強引用做爲緩存便可,同時可控性更高。於是,他們常見的是被使用在桌面應用系統的緩存。
jvm
JVM參數配置性能
JVM啓動模式
Client模式:啓動速度較快,但運行時性能和內存管理效率不高
Server模式:啓動比Client模式慢10%,但運行時性能和內存管理效率較高
在JVM啓動的時候指定:-Client或者-Server來判斷啓動模式
分代收集算法 把對象分爲新生代、老年代、持久代,對不一樣生命週期的對象使用不一樣的算法 http://www.importnew.com/19255.html
試想,在不進行對象存活時間區分的狀況下,每次垃圾回收都是對整個堆空間進行回收,花費時間相對會長,同時,由於每次回收都須要遍歷全部存活對象,但實際上,對於生命週期長的對象而言,這種遍歷是沒有效果的,由於可能進行了不少次遍歷,可是他們依舊存在。所以,分代垃圾回收採用分治的思想,進行代的劃分,把不一樣生命週期的對象放在不一樣代上,不一樣代上採用最適合它的垃圾回收方式進行回收。
新生代
全部新生成的對象首先都是放在年輕代的。年輕代的目標就是儘量快速的收集掉那些生命週期短的對象。年輕代分三個區。一個Eden區,兩個Survivor區(默認,可改),大部分對象在Eden區中生成。當Eden區滿時,還存活的對象將被複制到Survivor區(兩個中的一個),當這個Survivor區滿時,此區的存活對象將被複制到另一個Survivor區,當這個Survivor去也滿了的時候,從第一個Survivor區複製過來的而且此時還存活的對象,將被複制「年老區(Tenured)」。須要注意,Survivor的兩個區是對稱的,沒前後關係,因此同一個區中可能同時存在從Eden複製過來 對象,和從前一個Survivor複製過來的對象,而複製到年老區的只有從第一個Survivor去過來的對象。並且,Survivor區總有一個是空的。同時,根據程序須要,Survivor區是能夠配置爲多個的(多於兩個),這樣能夠增長對象在年輕代中的存在時間,減小被放到年老代的可能
老年代
在年輕代中經歷了N次垃圾回收後仍然存活的對象,就會被放到年老代中。所以,能夠認爲年老代中存放的都是一些生命週期較長的對象。
持久代
用於存放靜態文件,現在Java類、方法等。持久代對垃圾回收沒有顯著影響
垃圾回收算法 http://www.importnew.com/18740.html
引用計數(Reference Counting):
比較古老的回收算法。原理是此對象有一個引用,即增長一個計數,刪除一個引用則減小一個計數。垃圾回收時,只用收集計數爲0的對象。此算法最致命的是沒法處理循環引用的問題。
標記-清除(Mark-Sweep):
此算法執行分兩階段。第一階段從引用根節點開始標記全部被引用的對象,第二階段遍歷整個堆,把未標記的對象清除。此算法須要暫停整個應用,同時,會產生內存碎片。 碎片太多可能引起另外一次GC
複製(Copying):
此算法把內存空間劃爲兩個相等的區域,每次只使用其中一個區域。垃圾回收時,遍歷當前使用區域,把正在使用中的對象複製到另一個區域中。次此法每次只處理正在使用中的對象,所以複製成本比較小,同時複製過去之後還能進行相應的內存整理,不會出現「碎片」問題。固然,此算法的缺點也是很明顯的,就是須要兩倍內存空間。
標記-整理(Mark-Compact):
此算法結合了「標記-清除」和「複製」兩個算法的優勢。也是分兩階段,第一階段從根節點開始標記全部被引用對象,第二階段遍歷整個堆,把清除未標記對象而且把存活對象「壓縮」到堆的其中一塊,按順序排放。此算法避免了「標記-清除」的碎片問題,同時也避免了「複製」算法的空間問題。
串行GC
Serial收集器
1)特色:
–僅僅使用單線程進行內存回收;
–它是獨佔式的內存回收 ;
–進行內存回收時, 暫停全部的工做線程(「Stop-The-World」) ;
–使用複製算法;
–適合CPU等硬件通常的場合;
–到JDK1.7爲止,是JVM Client模式下默認的新生代收集器;
2)設置參數:
-XX:+UseSerialGC 指定使用新生代Serial和老年代SerialOld
SerialOld收集器
1)特色:
–同新生代Serial收集器同樣,單線程、獨佔式的垃圾收集器;
–使用「標記-整理」算法;
–一般老年代內存回收比新生代內存回收要更長時間,因此可能會使應用程序停頓較長時間;
2)設置參數:
-XX:+UseSerialGC 新生代、老年代都使用串行GC;
-XX:+UseParNewGC 新生代使用ParNew,老年代使用SerialOld;
-XX:+UseParallelGC 新生代使用Parallel,老年代使用SerialOld;
並行GC(吞吐量優先)
ParNew收集器
1)特色:
–Serial的多線程版本;
–使用複製算法 ;
–垃圾回收時,應用程序仍會暫停,只不過因爲是多線程回收,在多核CPU上,回收效率會高於串行GC。反之在單核CPU,效率會不如串行GC;
2)設置參數:
-XX:+UseParNewGC 新生代使用ParNew,老年代使用SerialOld;
-XX:+UseConcMarkSweepGC 新生代使用ParNew,老年代使用CMS;
-XX:ParallelGCThreads=n 指定ParNew收集器工做時的收集線程數,當CPU核數小於8時,默認開啓的線程數等於CPU數量,當高於8時,可以使用公式:3+((5*CPU_count)/8) 。
ParNew收集器其實就是Serial收集器的多線程版本,除了多條線程收集以外,其他行爲包括Serial收集器可用的設置參數、收集算法、Safepoint、對象分配規則、回收策略等都與Serial收集器徹底同樣,並無太多特別之處。但它倒是運行在JVM Service模式下首選的新生代收集器,其中一個很重要的緣由是:除了Serial收集器外,目前只有它能於CMS收集器(併發GC)配合工做。
ParNew收集器在單CPU環境中絕對不會有比Serial收集器更好的效果,甚至因爲存在線程切換的開銷,ParNew收集器在兩個CPU環境中都不能100%保證優於Serial收集器。隨着可使用的CPU數量的增長,它對於GC時系統資源的有效利用仍是有利的。
Parallel收集器
1)特色:
–同ParNew回收器同樣, 不一樣的地方在於,它很是關注系統的吞吐量(經過參數控制) ;
–使用複製算法;
–支持自適應的GC調節策略;
2)設置參數:
-XX:+UseParallelGC 新生代使用Parallel,老年代使用SerialOld;
-XX:+UseParallelOldGC 新生代使用Parallel,老年代使用ParallelOld;
-XX:MaxGCPauseMillis=n 設置內存回收的最大停頓時間,單位ms ;
-XX:GCTimeRatio=n 設置吞吐量的大小,假設值爲n(在0-100之間),那麼系統將花費不超過1/(n+1)的時間用於內存回收。默認值爲99,就是容許最大1%的垃圾收集時間;
-XX:+UseAdaptiveSizePolicy 自適應GC策略的開關參數。
吞吐量(Throughput) = 運行用戶代碼時間 /(運行用戶代碼時間 + 垃圾收集時間)。
Parallel收集器支持「GC自適應的調節策略(GC-Ergonomics)」,這也是Parallel收集器與ParNew收集器的一個重要區別。
設置參數-XX:+UseAdaptiveSizePolicy,這是一個開關參數,當這個參數打開後,不須要手工指定新生代的大小(-Xmn)、Eden與Survivor區比例(-XX:SurvivorRatio)、晉升老年代對象年齡(-XX:PretenureSizeThreshold)等細節參數,虛擬機會根據當前系統的運行狀況收集性能監控信息,動態調整這些參數以提供最適合的停頓時間或者最大的吞吐量,這種調節方式稱爲「GC自適應的調節策略」。
你也能夠在使用Parallel收集器自適應調節策略時,把基本的內存數據設置好(如-Xmx 最大堆),而後使用MaxGCPauseMillis參數(更關注最大停頓時間)或GCTimeRatio(更關注吞吐量)參數給虛擬機設立一個優化目標,具體細節參數的調節任務就交由虛擬機去完成。
ParallelOld收集器
1)特色:
–關注吞吐量的老年代併發收集器;
–使用「標記-整理」算法;
2)設置參數:
-XX:+UseParallelOldGC 新生代使用Parallel,老年代使用ParallelOld。
這個收集器是在JDK1.6中才開始提供,在此以前,若是新生代選擇了Parallel收集器,老年代除了SerialOld收集器外別無選擇。在注重吞吐量以及CPU資源敏感的場合,均可以優先考慮Parallel加ParallelOld收集器。
併發GC
CMS收集器
1)特色:
–非獨佔式的老年代併發收集器,大部分時候應用程序不會中止運行;
–使用「標記-清除」算法,所以回收後會有內存碎片,可設置參數進行內存碎片的壓縮整理 ;
–與Parallel和ParallelOld不一樣,CMS主要關注系統停頓時間;
2) 缺點:
對CPU資源敏感;
沒法處理浮動垃圾(Floating Garbage);
內存碎片問題
其中初始標記、從新標記這兩個步驟仍需「Stop-The-World」,這兩個階段是獨佔的,不能與用戶線程一塊兒執行,而其它階段則能夠與用戶線程一塊兒執行。
初始標記僅僅只是標記一下GC Roots能直接關聯到的對象,速度很快;
併發標記階段就是進行GC Roots Tracing的過程;
從新標記階段則是爲了修正併發標記期間因用戶程序繼續運做而致使標記產生變更的那一部分對象的標記記錄,這個階段的停頓時間通常會比初始標記階段稍長一些,但遠比並發標記的時間短。
因爲整個過程當中耗時最長的併發標記和併發清除過程,收集線程均可以與用戶線程一塊兒工做,因此,從整體上來講,CMS收集器的內存回收過程是與用戶線程一塊兒併發執行的。
浮動垃圾: 併發清理階段用戶線程還在運行着,伴隨程序運行天然就還會有新的垃圾不斷產生
2)設置參數:
-XX:-CMSPrecleaningEnabled 關閉預清理,默認在併發標記後會有一個預清理的操做;
-XX:+UseConcMarkSweepGC 老年代使用CMS,新生代使用ParNew;
-XX:ConcGCThreads=n 設置併發線程數;
-XX:ParallelCMSThreads=n 同上,設置併發線程數;
-XX:CMSInitiatingOccupancyFraction=n 指定老年代回收閥值,默認值爲68;
-XX:+UseCMSCompactAtFullCollection 開啓內存碎片整理;
-XX:CMSFullGCsBeforeCompation=n 指定進行多少次CMS垃圾回收後再進行一次內存壓縮;
-XX:+CMSParallelRemarkEnabled 在使用UseParNewGC參數的狀況下,儘可能減小 mark(標記)的時間;
-XX:+UseCMSInitiatingOccupancyOnly 表示只有達到閥值時才進行CMS垃圾回收
對象什麼時候進入老年代
長期存活的對象將進入老年代
-XX:MaxTenuringThreshold=n 假設值爲n,則新生代的對象最多經歷n次GC,就能晉升老年代,但這個必不是晉升的必要條件
-XX:TargetSurvivorRatio=n 用於設置Survivor區的目標使用率,即當Survivor區GC後使用率超過這個值,就可能會使用較小的年齡做爲晉升年齡。默認爲50
虛擬機採用分代收集的思想管理內存,那內存回收時就必須能識別那些對象該放到新生代,那些該到老年代中。爲了作到這點,虛擬機爲每一個對象定義了一個對象年齡(Age,由GC的次數決定)。每通過一次新生代GC後仍然存活,將對象的Age增長1歲,當年齡到必定程度(默認爲15)時,將會被晉升到老年代中。
若是將 -XX:MaxTenuringThreshold 參數設置爲0的話,則新生代對象不通過Survivor區,直接進入老年代,對於須要大量常駐內存的應用,這樣作能夠提升效率;若是將此值設置爲一個較大值,則新生代對象會在Survivor區進行屢次複製,這樣作能夠增長對象在新生代的存活時間,增長對象在新生代被垃圾回收的機率,減小Full GC的頻率,能夠在某種程度上提升服務穩定性。
適齡對象也可能進入老年代
爲了能更好地適應不一樣程序的內存情況,虛擬機並非永遠地要求對象年齡必須達到 MaxTenuringThreshold 才能晉升老年代,若是在 Survivor 空間中相同年齡全部對象大小的總和大於 Survivor 空間的一半,年齡大於或等於該年齡的對象就能夠直接進入老年代,無須等到 MaxTenuringThreshold 中要求的年齡。
大對象直接進入老年代
-XX:PretenureSizeThreshold 即對象的大小大於此值,就會繞過新生代,直接在老年代分配(即所謂「大對象直接進入老年代」)。
除年齡外,對象體積也會影響對象的晉升的。若對象體積太大,新生代沒法容納這個對象,則這個對象可能就會直接晉升至老年代。特別是,若是程序中常常出現「短命的大對象」,容易發生內存還有很多空間卻不得不提早觸發Full GC以獲取足夠的連續空間,致使GC效率低下。可經過如下參數使用對象直接晉升至老年代的閾值,單位是byte
PretenureSizeThreshold 參數的意義在於,若趕上述狀況時,能避免在 Eden 及兩個 Survivor 之間發生大量的內存複製。此參數只對串行GC以及ParNew有效,而Parallel並不認識這個參數。Parallel收集器通常並不須要特別設置。若是遇到必須使用此參數的場合,也能夠考慮 ParNew加CMS的收集器組合。
******************************************************************************************************************************************************************************************************************************************************************************************************
堆設置
-Xms:初始堆大小
-Xmx:最大堆大小
-XX:NewSize=n:設置年輕代大小
-XX:NewRatio=n:設置年輕代和年老代的比值。如:爲3,表示年輕代與年老代比值爲1:3,年輕代佔整個年輕代年老代和的1/4
-XX:SurvivorRatio=n:年輕代中Eden區與兩個Survivor區的比值。注意Survivor區有兩個。如:3,表示Eden:Survivor=3:2,一個Survivor區佔整個年輕代的1/5
-XX:MaxPermSize=n:設置持久代大小
收集器設置
-XX:+UseSerialGC:設置串行收集器 新生代Serial和老年代SerialOld
-XX:+UseParallelGC:設置並行收集器 新生代使用Parallel,老年代使用SerialOld
-XX:+UseParNewGC:設置並行收集器 新生代使用ParNew,老年代使用SerialOld;
-XX:+UseParalledlOldGC:設置並行年老代收集器 新生代使用Parallel,老年代使用ParallelOld;
-XX:+UseConcMarkSweepGC:設置併發收集器 新生代使用ParNew,老年代使用CMS;
垃圾回收統計信息
-XX:+PrintGC 簡單GC日誌模式
-XX:+PrintGCDetails 就開啓了詳細GC日誌模式。在這種模式下,日誌格式和所使用的GC算法有關
-XX:+PrintGCTimeStamps 能夠將時間和日期也加到GC日誌中。表示自JVM啓動至今的時間戳會被添加到每一行中
-Xloggc:filename
並行收集器設置
-XX:ParallelGCThreads=n:設置並行收集器收集時使用的CPU數。並行收集線程數。
-XX:MaxGCPauseMillis=n:設置並行收集最大暫停時間
-XX:GCTimeRatio=n:設置垃圾回收時間佔程序運行時間的百分比。公式爲1/(1+n)
併發收集器設置
-XX:+CMSIncrementalMode:設置爲增量模式。適用於單CPU狀況。
-XX:ParallelGCThreads=n:設置併發收集器年輕代收集方式爲並行收集時,使用的CPU數。並行收集線程數。
******************************************************************************************************************************************************************************************************************************************************************************************************
java -Xmx3550m -Xms3550m -Xmn2g –Xss128k
-Xmx3550m:設置JVM最大可用內存爲3550M。
-Xms3550m:設置JVM促使內存爲3550m。此值能夠設置與-Xmx相同,以免每次垃圾回收完成後JVM從新分配內存。
-Xmn2g:設置年輕代大小爲2G。整個堆大小=年輕代大小 + 年老代大小 + 持久代大小。持久代通常固定大小爲64m,因此增大年輕代後,將會減少年老代大小。此值對系統性能影響較大,Sun官方推薦配置爲整個堆的3/8。
-Xss128k:設置每一個線程的堆棧大小。JDK5.0之後每一個線程堆棧大小爲1M,之前每一個線程堆棧大小爲256K。更具應用的線程所需內存大小進行調整。在相同物理內存下,減少這個值能生成更多的線程。可是操做系統對一個進程內的線程數仍是有限制的,不能無限生成,經驗值在3000~5000左右。
java -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0
-XX:NewRatio=4:設置年輕代(包括Eden和兩個Survivor區)與年老代的比值(除去持久代)。設置爲4,則年輕代與年老代所佔比值爲1:4,年輕代佔整個堆棧的1/5
-XX:SurvivorRatio=4:設置年輕代中Eden區與Survivor區的大小比值。設置爲4,則兩個Survivor區與一個Eden區的比值爲2:4,一個Survivor區佔整個年輕代的1/6
-XX:MaxPermSize=16m:設置持久代大小爲16m。
-XX:MaxTenuringThreshold=0:設置垃圾最大年齡。若是設置爲0的話,則年輕代對象不通過Survivor區,直接進入年老代。對於年老代比較多的應用,能夠提升效率。若是將此值設置爲一個較大值,則年輕代對象會在Survivor區進行屢次複製,這樣能夠增長對象再年輕代的存活時間,增長在年輕代即被回收的概論。
******************************************************************************************************************************************************************************************************************************************************************************************************
年輕代大小選擇
響應時間優先的應用:儘量設大,直到接近系統的最低響應時間限制(根據實際狀況選擇)。在此種狀況下,年輕代收集發生的頻率也是最小的。同時,減小到達年老代的對象。
吞吐量優先的應用:儘量的設置大,可能到達Gbit的程度。由於對響應時間沒有要求,垃圾收集能夠並行進行,通常適合8CPU以上的應用。
年老代大小選擇
響應時間優先的應用:年老代使用併發收集器,因此其大小須要當心設置,通常要考慮併發會話率和會話持續時間等一些參數。若是堆設置小了,能夠會形成內存碎片、高回收頻率以及應用暫停而使用傳統的標記清除方式;若是堆大了,則須要較長的收集時間。最優化的方案,通常須要參考如下數據得到:
1. 併發垃圾收集信息
2. 持久代併發收集次數
3. 傳統GC信息
4. 花在年輕代和年老代回收上的時間比例
減小年輕代和年老代花費的時間,通常會提升應用的效率
吞吐量優先的應用
通常吞吐量優先的應用都有一個很大的年輕代和一個較小的年老代。緣由是,這樣能夠儘量回收掉大部分短時間對象,減小中期的對象,而年老代盡存放長期存活對象。
在Windows下,在$TOMCAT_HOME/bin/catalina.bat,Linux下,在$TOMCAT_HOME/bin/catalina.sh的前面,增長以下設置:
JAVA_OPTS=」-Xms [min heap size]-Xmx[max heap size]」
例如:
JAVA_OPTS="-Xms1024m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=256m"
對象什麼時候進入老年代
長期存活的對象將進入老年代
-XX:MaxTenuringThreshold=n 假設值爲n,則新生代的對象最多經歷n次GC,就能晉升老年代,但這個必不是晉升的必要條件
-XX:TargetSurvivorRatio=n 用於設置Survivor區的目標使用率,即當Survivor區GC後使用率超過這個值,就可能會使用較小的年齡做爲晉升年齡。默認爲50
虛擬機採用分代收集的思想管理內存,那內存回收時就必須能識別那些對象該放到新生代,那些該到老年代中。爲了作到這點,虛擬機爲每一個對象定義了一個對象年齡(Age,由GC的次數決定)。每通過一次新生代GC後仍然存活,將對象的Age增長1歲,當年齡到必定程度(默認爲15)時,將會被晉升到老年代中。
若是將 -XX:MaxTenuringThreshold 參數設置爲0的話,則新生代對象不通過Survivor區,直接進入老年代,對於須要大量常駐內存的應用,這樣作能夠提升效率;若是將此值設置爲一個較大值,則新生代對象會在Survivor區進行屢次複製,這樣作能夠增長對象在新生代的存活時間,增長對象在新生代被垃圾回收的機率,減小Full GC的頻率,能夠在某種程度上提升服務穩定性。
適齡對象也可能進入老年代
爲了能更好地適應不一樣程序的內存情況,虛擬機並非永遠地要求對象年齡必須達到 MaxTenuringThreshold 才能晉升老年代,若是在 Survivor 空間中相同年齡全部對象大小的總和大於 Survivor 空間的一半,年齡大於或等於該年齡的對象就能夠直接進入老年代,無須等到 MaxTenuringThreshold 中要求的年齡。
大對象直接進入老年代
-XX:PretenureSizeThreshold 即對象的大小大於此值,就會繞過新生代,直接在老年代分配(即所謂「大對象直接進入老年代」)。
除年齡外,對象體積也會影響對象的晉升的。若對象體積太大,新生代沒法容納這個對象,則這個對象可能就會直接晉升至老年代。特別是,若是程序中常常出現「短命的大對象」,容易發生內存還有很多空間卻不得不提早觸發Full GC以獲取足夠的連續空間,致使GC效率低下。可經過如下參數使用對象直接晉升至老年代的閾值,單位是byte
PretenureSizeThreshold 參數的意義在於,若趕上述狀況時,能避免在 Eden 及兩個 Survivor 之間發生大量的內存複製。此參數只對串行GC以及ParNew有效,而Parallel並不認識這個參數。Parallel收集器通常並不須要特別設置。若是遇到必須使用此參數的場合,也能夠考慮 ParNew加CMS的收集器組合。
轉載請註明出處;