JVM參數配置 java內存區域


 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方法服務。

  堆中存的是對象。棧中存的是基本數據類型和堆中對象的引用

類的生命周期
        1.加載,查找並加載類的二進制數據,在Java堆中也創建一個java.lang.Class類的對象
        2.連接,連接又包含三塊內容:驗證、准備、解析。1)驗證,文件格式、元數據、字節碼、符號引用驗證;2)准備,為類的靜態變量分配內存,並將其初始化為默認值;3)解析,把類中的符號引用轉換為直接引用
        3.初始化,為類的靜態變量賦予正確的初始值
        4.使用,new出對象程序中使用
        5.卸載,執行垃圾回收


引用類型
  對象引用類型分為強引用、軟引用、弱引用和虛引用
  強引用:就是我們一般聲明對象是時虛擬機生成的引用,強引用環境下,垃圾回收時需要嚴格判斷當前對象是否被強引用,如果被強引用,則不會被垃圾回收
  軟引用:軟引用一般被做為緩存來使用。與強引用的區別是,軟引用在垃圾回收時,虛擬機會根據當前系統的剩余內存來決定是否對軟引用進行回收。如果剩余內存比較緊張,則虛擬機會回收軟引用所引用的空間;如果剩余內存相對富裕,則不會進行回收。換句話說,虛擬機在發生OutOfMemory時,肯定是沒有軟引用存在的。

  弱引用:弱引用與軟引用類似,都是作為緩存來使用。但與軟引用不同,弱引用在進行垃圾回收時,是一定會被回收掉的,因此其生命周期只存在於一個垃圾回收周期內。
  強引用不用說,我們系統一般在使用時都是用的強引用。而“軟引用”和“弱引用”比較少見。他們一般被作為緩存使用,而且一般是在內存大小比較受限的情況下做為緩存。因為如果內存足夠大的話,可以直接使用強引用作為緩存即可,同時可控性更高。因而,他們常見的是被使用在桌面應用系統的緩存。

 

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的收集器組合。

 

 

******************************************************************************************************************************************************************************************************************************************************************************************************

常見配置匯總 http://www.importnew.com/19264.html

堆設置

  -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. 花在年輕代和年老代回收上的時間比例

  減少年輕代和年老代花費的時間,一般會提高應用的效率

  吞吐量優先的應用

  一般吞吐量優先的應用都有一個很大的年輕代和一個較小的年老代。原因是,這樣可以盡可能回收掉大部分短期對象,減少中期的對象,而年老代盡存放長期存活對象。

 

tomcat設置JVM參數

在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的收集器組合。

 

轉載請注明出處;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM