1. 程式人生 > >jvm記憶體調優處理機制

jvm記憶體調優處理機制

1.棧和堆 棧是執行時的單位,解決程式如何執行,代表處理邏輯 堆是儲存單位,解決資料儲存問題,代表資料 2. 分配記憶體按照8的整數倍 物件的引用: 強引用(宣告物件時虛擬機器生成的引用,不會被回收), 軟引用(快取,剩餘記憶體不足時被回收) 弱引用(一定被回收) 4.垃圾回收演算法 (1)引用計數:此物件有一個引用增加一個計數,刪除一個引用減少一個計數。gc引用數是0的,迴圈引用問題無法處理 (2)標記-清楚MarkSweep:1.從引用根節點(棧)開始標記被引用的物件 形成一顆以java棧中引用所對應的物件為根節點的一顆物件樹,棧中有多個引用會形成多個物件數   2.遍歷堆,清楚未標記的物件 要暫停整個應用,會產生記憶體碎片 (3)複製:記憶體被劃分為2個相等的區域,每次用其中的1個 遍歷當前正在用的區域,把裡面使用中的複製到另一塊,然後清理這一塊 不會有碎片但是要2倍記憶體 (4)標記-整理MarkCompac

t:1.從根節點標記被引用物件 2.遍歷堆,清楚未標記,把存活物件壓縮到一起 避免了碎片,也不需要2倍空間  

5.

增量收集:實時垃圾回收,應用進行的同時進行垃圾回收

  分代收集:基於物件的生命週期,物件分為年輕代,年老代tenured space,持久代,不同生命週期的物件使用不同的演算法,提高回收效率             生命週期比較長的:session物件,執行緒   生命週期短的:程式執行過程中的臨時變數 不區分時每次回收都是回收整個堆記憶體,花費時間長,每次回收回收遍歷所有,生命週期長的實際上這種遍歷是無效果的 年輕代young: 伊甸園Eden*1 倖存區Survivor*2(2+) scavenge gc:新物件生成在伊甸園申請空間失敗時觸發

。  伊甸園區gc會比較頻繁,需要速度快,效率高的演算法 年老代tenured: 物件在年輕代經歷N次GC後任然存活,會被放到年老代,一般存放生命週期比較長的物件 持久代perm: 存放靜態檔案,對垃圾回收無顯著影響 full gc:清理整個堆   年老代/持久代被寫滿/system.gc()被呼叫 6.收集器 (1)序列收集器Serial Collector 單執行緒  適合單處理器機器  適合小資料量情況  效率高     -xx:+useSerialGC (2)並行收集器Paraller collector     多執行緒處理垃圾回收工作,速度快,效率高 對年輕代進行並行垃圾回收,減少垃圾回收需要的時間 -xx:+useParallelGC -xx:parallelGCThreads=<N>設定並行垃圾回收的執行緒數 -xx:macGCPauseMills=<N>垃圾回收最長暫停時間 -xx:gcTimeRatio=<N>  1/n+1  吞吐量  垃圾回收時間和費垃圾回收時間的比值 也可以對年老代進行並行收集 (1)(2)要暫停整個執行環境,只有垃圾回收程式執行,系統在垃圾回收時會有明顯的暫停,堆越大停的時間越長 垃圾回收過程中應用響應時間可能加長 適合多Cpu對應用響應無要求的大中型應用 (3)併發收集器 應用不停止,垃圾回收只暫停很少的時間。   適合響應時間要求高的中大規模應用 CMS(併發標記清理收集器,Concurrent Mark Sweep) 主要用在老年代,在應用不停止的情況下使用獨立的垃圾回收執行緒,短暫的停頓 -xx:+useConMarkSweepGc 浮動垃圾:應用運行同時回收垃圾,垃圾回收進行完成時會產生垃圾,在下個垃圾回收週期才可以回收。 併發模式失敗concurrent mode failure:併發模式在應用執行時進行垃圾的回收,要保證堆在垃圾回收這段時間有足夠的時間供程式使用 垃圾回收還沒完成,堆就滿了,會發生併發模式失敗,整個應用會暫停。

        -xx:cmsInitiatingOccupancyFraction=<N>指定還有多少剩餘堆時開始執行併發收集

7.堆大小設定    限制因素:作業系統32/64   系統可用虛擬記憶體    系統可用實體記憶體    java -xmx3550m  jvm最大可用記憶體3550m            -xms3550m  jvm初始記憶體,避免每次gc後jvm重新分配記憶體    -xmn2g      年輕代大小  2g   持久代固定64m  增大年輕代會減少年老代 sun推薦為整堆得3/8    -xss128k   每個執行緒的堆疊大小  jdk5以後是1m    -xx:newRation=4  年輕代和老年代比例為1:4    -xx:survivorRation=4 兩個倖存區和伊甸園的比例2:4    -xx:maxRermSize=16 持久代大小為16M    -xx:maxTenuringThreshold=0 從年輕代進入老年代的門檻,設定為0,年輕代的物件不經過倖存區直接進到老年區 設定為一個較大的值就是要在倖存區進行多次複製,增加物件在年輕代的存活時間增加年輕代被回收的概率

8.jdk5以後會根據當前系統配置判斷使用哪種收集器,以前是序列想用其他的要加入配置

並行: