jvm基礎:html
http://www.javashuo.com/article/p-xcewdtkf-kr.html算法
調優這方面- -其實除了架構師基本用不到,知道基本原理和簡單的調優就能夠了。。。架構
調優通常是調優jvm
方法區 和 堆線程
方法區: 存放方法的信息(變量,常量,類信息,運行時常量池等)htm
堆(GC發生在這裏): 存放對象實例對象
1.堆blog
1.1 新生代區排序
1.1.1 伊甸區 (西方神話人類起源地-。-)內存
1.1.2 survivor from (倖存者from區)
1.1.3 survivor to (倖存者to區)
1.2 老年代區
內存比例:
新生代:老年代 = 1 : 2
伊甸區:survivor from :survivor to = 8:1:1
GC機制: (survivor from 和 survivor to 直接寫成from 和 to)
1. 一個對象實例A被聲明後進入堆的新生代伊甸區
2. 根據GC策略(好比GC發現沒有指向A的變量了,或者伊甸區滿了等),A進入from區
3. from滿了之後,觸發Miner GC(輕GC),把from區的一部分倖存者數據放到 to區,2區互換(A仍是在from區,只不過是以前的to區),清的to區(以前的老from區,沒被複制到to區的都被清空了= =)。新來的開始進入新from區。
4. 新from區滿了之後,重複以上步驟,15次(jvm默認次數)後, A還活着的話就會進入老年區。
6.當老年代區也滿了之後,會產生full GC, jvm會停掉全部線程(STW: stop the world),開始全面清理垃圾。
若是A的佔用空間很是大,爲了防止過分頻繁的輕GC(倖存者區會很快滿。。。),會直接把A放到老年區。
GC的調優主要就是改變這幾個區域的空間大小比例,還有垃圾回收算法(GC策略),減小full GC
垃圾回收算法:
1. 標記清除算法:
把可回收的部分標記爲清除(邏輯清除),僞裝不存在了,之後須要空間能夠直接覆蓋。
缺點: 倖存者的內存地址不連續,會有不少碎片。可能會致使大對象存不進來直接GC
2. 複製算法:(survivor from 和 to 的經常使用算法就是這個)
只用內存的1/2,1區和2區,每次內存回收的時候,1區把不須要清除的複製到2區,此時對象在2區內存地址連續,沒有碎片,而後清空1區,把2區做爲新的1區。
缺點:少了一半可用空間。
3. 標記整理算法:
先把倖存對象和可回收的對象標記,而後把可回收的清除,從新整理排序。
缺點:開銷大,花費時間長。
4.分代收集算法:(如今大部分都用的這個)
不一樣區域不一樣算法。
新生代中大量對象死去(局部變量這類的),因此用複製算法。
老年代中的對象都是在倖存者區域中通過了15次的GC回收的老不死- -因此高几率長久存活,所以用標記整理或者標記清除算法。