1. 堆中存儲數(shù)據(jù):對象、數(shù)組;
???? 方法區(qū):類信息、常量、靜態(tài)成員、即時編譯代碼;
???? 棧中存儲引用和基礎類型、局部變量。

2. 堆代表的是數(shù)據(jù),棧代表的是處理邏輯,分而治之。棧的大小通過-Xss來設置
3. 對象存儲數(shù)據(jù)所占空間:
??? 空對象:8byte
??? public class Demo{
??????? int num;
??????? object obj;
??????? boolean res;
??? }
所占空間:空對象:8byte + int整型:4byte + 引用對象:4byte + boolean布爾型:1byte= 17 byte,java分配空間為8byte的整數(shù)倍,因此分配內(nèi)存大小為:24byte。
基礎類型的包裝類型,為對象,因此基礎類型的包裝類型最少為:空對象:8byte + 引用對象:4byte = 12byte,在內(nèi)存分配中最低為:16byte。
4. 引用:
強引用:就是我們一般聲明對象是時虛擬機生成的引用,強引用環(huán)境下,垃圾回收時需要嚴格判斷當前對象是否被強引用,如果被強引用,則不會被垃圾回收
軟引用:軟引用一般被做為緩存來使用。與強引用的區(qū)別是,軟引用在垃圾回收時,虛擬機會根據(jù)當前系統(tǒng)的剩余內(nèi)存來決定是否對軟引用進行回收。如果剩余內(nèi)存比較緊張,則虛擬機會回收軟引用所引用的空間;如果剩余內(nèi)存相對富裕,則不會進行回收。虛擬機在發(fā)生OutOfMemory時,肯定是沒有軟引用存在的。
弱引用:弱引用與軟引用類似,都是作為緩存來使用。但與軟引用不同,弱引用在進行垃圾回收時,是一定會被回收掉的,因此其生命周期只存在于一個垃圾回收周期內(nèi)。
強引用不用說,我們系統(tǒng)一般在使用時都是用的強引用。而“軟引用”和“弱引用”比較少見。他們一般被作為緩存使用,而且一般是在內(nèi)存大小比較受限的情況下做為緩存。因為如果內(nèi)存足夠大的話,可以直接使用強引用作為緩存即可,同時可控性更高。因而,他們常見的是被使用在桌面應用系統(tǒng)的緩存。
5. GC回收機制:
引用計數(shù):此對象有一個引用,即增加一個計數(shù),刪除一個引用則減少一個計數(shù)。垃圾回收時,只用收集計數(shù)為0的對象。此算法最致命的是無法處理循環(huán)引用的問題。
標記-清除:第一階段從引用根節(jié)點開始標記所有被引用的對象,第二階段遍歷整個堆,把未標記的對象清除。此算法需要暫停整個應用,同時,會產(chǎn)生內(nèi)存碎片。
復制:把內(nèi)存空間劃為兩個相等的區(qū)域,每次只使用其中一個區(qū)域。垃圾回收時,遍歷當前使用區(qū)域,把正在使用中的對象復制到另外一個區(qū)域中。次算法每次只處理正在使用中的對象,因此復制成本比較小,同時復制過去以后還能進行相應的內(nèi)存整理,不會出現(xiàn)“碎片”問題。當然,此算法的缺點也是很明顯的,就是需要兩倍內(nèi)存空間。
標記-整理:第一階段從根節(jié)點開始標記所有被引用對象,第二階段遍歷整個堆,清除未標記對象并且把存活對象“壓縮”到堆的其中一塊,按順序排放。此算法避免了“標記-清除”的碎片問題,同時也避免了“復制”算法的空間問題。
增量收集(Incremental Collecting):實時垃圾回收算法,即:在應用進行的同時進行垃圾回收。
分代收集(Generational Collecting):基于對對象生命周期分析后得出的垃圾回收算法。把對象分為年青代、年老代、持久代,對不同生命周期的對象使用不同的算法(上述方式中的一個)進行回收。
6. 分代:
年輕代:
所有新生成的對象首先都是放在年輕代的。年輕代的目標就是盡可能快速的收集掉那些生命周期短的對象。年輕代分三個區(qū)。一個Eden區(qū),兩個Survivor區(qū)(一般而言)。大部分對象在Eden區(qū)中生成。當Eden區(qū)滿時,還存活的對象將被復制到Survivor區(qū)(兩個中的一個),當這個Survivor區(qū)滿時,此區(qū)的存活對象將被復制到另外一個Survivor區(qū),當這個Survivor去也滿了的時候,從第一個Survivor區(qū)復制過來的并且此時還存活的對象,將被復制“年老區(qū)(Tenured)”。需要注意,Survivor的兩個區(qū)是對稱的,沒先后關系,所以同一個區(qū)中可能同時存在從Eden復制過來
對象,和從前一個Survivor復制過來的對象,而復制到年老區(qū)的只有從第一個Survivor去過來的對象。而且,Survivor區(qū)總有一個是空的。同時,根據(jù)程序需要,Survivor區(qū)是可以配置為多個的(多于兩個),這樣可以增加對象在年輕代中的存在時間,減少被放到年老代的可能。
年老代:
在年輕代中經(jīng)歷了N次垃圾回收后仍然存活的對象,就會被放到年老代中。因此,可以認為年老代中存放的都是一些生命周期較長的對象。
持久代:
用于存放靜態(tài)文件,如今Java類、方法等。持久代對垃圾回收沒有顯著影響,但是有些應用可能動態(tài)生成或者調(diào)用一些class,例如Hibernate等,在這種時候需要設置一個比較大的持久代空間來存放這些運行過程中新增的類。持久代大小通過-XX:MaxPermSize=進行設置。
7. JVM調(diào)優(yōu)工具:
Jconsole,jProfile,VisualVM
Jconsole : jdk自帶,功能簡單,但是可以在系統(tǒng)有一定負荷的情況下使用。對垃圾回收算法有很詳細的跟蹤。
JProfiler:商業(yè)軟件,需要付費。功能強大。
VisualVM:JDK自帶,功能強大,與JProfiler類似。推薦。