最近感覺自己的腳步跟不上自己的思想,可能自己有些浮了。所以想靜下來鞏固自己學(xué)習(xí)的一些基礎(chǔ)知識。
JVM的基礎(chǔ)架構(gòu)圖(初次畫圖):

我們今天主要就是說明內(nèi)存區(qū)域區(qū)域是如何對應(yīng)我們代碼。簡單的一個例子,
public static void main(String[] args) {
Student stu=new Student();
}
首先代碼會被加載到方法區(qū)(main方法),然后new Student()則會被分配到堆內(nèi)存中,再然后stu引用Student這個對象則會分配到棧中。計算器的功能則是負(fù)責(zé)代碼是如何一步步運(yùn)行的(個人理解)。
重點(diǎn)來了解一下JVM中的堆內(nèi)存的結(jié)構(gòu)??截惗垐D


從上面的圖中我們可以很清晰的看出堆內(nèi)存劃分的規(guī)則,Young Gen我們稱之的年輕代,被劃分三塊,Eden、S0、S1。Old Memory我們稱之老年代,加上我們稱之永久代的區(qū)域Perm(jdk1.8之后就不存在,只有元空間,使用堆外內(nèi)存)。
我們new的對象是如何在這個區(qū)域執(zhí)行流轉(zhuǎn)?我們大概的流程說明一下,Object--->Eden隨著Eden的對象越來越多,就會將Eden的一直常駐對象轉(zhuǎn)移到S0區(qū)域(minor GC),隨之S0區(qū)域中也慢慢裝下的時候,也會將一些不用的對象清除并轉(zhuǎn)移剩下的對象到S1區(qū)域。在這個過程中,有些對象可能就一直在Young區(qū)域中我們就會將其轉(zhuǎn)移到Old區(qū)域中。隨著old區(qū)域也慢慢的裝不下的時候,就會發(fā)生major GC。
(僅作為自己的學(xué)習(xí)總結(jié),如果有不對的地方也歡迎大家的指正。)