jvm記憶體調優處理機制
1.棧和堆 棧是執行時的單位,解決程式如何執行,代表處理邏輯 堆是儲存單位,解決資料儲存問題,代表資料 2. 分配記憶體按照8的整數倍 物件的引用: 強引用(宣告物件時虛擬機器生成的引用,不會被回收), 軟引用(快取,剩餘記憶體不足時被回收) 弱引用(一定被回收) 4.垃圾回收演算法 (1)引用計數:此物件有一個引用增加一個計數,刪除一個引用減少一個計數。gc引用數是0的,迴圈引用問題無法處理 (2)標記-清楚MarkSweep:1.從引用根節點(棧)開始標記被引用的物件 形成一顆以java棧中引用所對應的物件為根節點的一顆物件樹,棧中有多個引用會形成多個物件數 2.遍歷堆,清楚未標記的物件 要暫停整個應用,會產生記憶體碎片 (3)複製:記憶體被劃分為2個相等的區域,每次用其中的1個 遍歷當前正在用的區域,把裡面使用中的複製到另一塊,然後清理這一塊 不會有碎片但是要2倍記憶體 (4)標記-整理MarkCompac
5.
增量收集:實時垃圾回收,應用進行的同時進行垃圾回收
分代收集:基於物件的生命週期,物件分為年輕代,年老代tenured space,持久代,不同生命週期的物件使用不同的演算法,提高回收效率 生命週期比較長的:session物件,執行緒 生命週期短的:程式執行過程中的臨時變數 不區分時每次回收都是回收整個堆記憶體,花費時間長,每次回收回收遍歷所有,生命週期長的實際上這種遍歷是無效果的 年輕代young: 伊甸園Eden*1 倖存區Survivor*2(2+) scavenge gc:新物件生成在伊甸園申請空間失敗時觸發
-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以後會根據當前系統配置判斷使用哪種收集器,以前是序列想用其他的要加入配置
並行: