浅谈java内存分析和垃圾收集器
目錄:
1.內(nèi)存分析
2.兩種垃圾回收機(jī)制和原理
3.對(duì)垃圾回收機(jī)制的簡(jiǎn)單理解
1.內(nèi)存分析:
(1)棧區(qū):
(1)(方法執(zhí)行的內(nèi)存模型)也就是說(shuō)每一個(gè)方法執(zhí)行相關(guān)調(diào)用都在棧里邊,每個(gè)方法被調(diào)用都會(huì)創(chuàng)建一個(gè)棧幀(用來(lái)儲(chǔ)存局部變量、操作數(shù)、方法出口等);
(2)jvm(虛擬機(jī))為每個(gè)線程創(chuàng)建一個(gè)棧(每個(gè)程序的執(zhí)行都會(huì)創(chuàng)建很多線程),用于存放該線程執(zhí)行方法的信息(實(shí)際參數(shù)局部變量等);
(3)棧屬于線程私有,不能實(shí)現(xiàn)線程間的共享
(4)棧的存儲(chǔ)特性是先進(jìn)后出,后進(jìn)先出;
(5)棧是由系統(tǒng)自動(dòng)分配,速度快,棧是一個(gè)連續(xù)的內(nèi)存空間
每調(diào)用一個(gè)方法就會(huì)創(chuàng)建一個(gè)棧幀。
是不是異常形象。。
(2)堆區(qū):
1.存放創(chuàng)建好的對(duì)象和數(shù)組(數(shù)組也是對(duì)象);
2.jvm只有一個(gè)堆,被所有線程共享;
3.堆是一個(gè)不連續(xù)的空間,分配靈活,速度慢;
3.方法區(qū)(也在堆區(qū)里邊只是方法特殊)
1 . jvm只有一個(gè)方法區(qū);
2.實(shí)際上也是堆,只是用于存儲(chǔ)類,常量相關(guān)信息;
3.用來(lái)存放程序中不變或者唯一的內(nèi)容(類信息,靜態(tài)變量,字符串常量等)
接下來(lái)是一個(gè)例子來(lái)解釋上述三種內(nèi)存空間:
public class oj1{int id;String name;int age;computer comp;void study(){System.out.println("誰(shuí)他媽買"+comp.brand);//對(duì)應(yīng)下面圖片的我在認(rèn)真學(xué)...}void play(){System.out.println("我在斗地主");//對(duì)應(yīng)下面圖片的我在玩游戲...}oj1()//構(gòu)造方法,用于創(chuàng)建類對(duì)象{}public static void main(String[] args){oj1 c1=new oj1();computer stu=new computer();stu.brand="小米";//對(duì)應(yīng)聯(lián)想p.comp=stu;c1.study();} } class computer{String brand;//電腦品牌 }
上圖可以這么分析,main方法進(jìn)棧,然后當(dāng)我們創(chuàng)建一個(gè)對(duì)象時(shí)就會(huì)調(diào)用對(duì)象的構(gòu)造函數(shù)來(lái)開辟空間,將對(duì)象數(shù)據(jù)存到堆區(qū)中,與此同時(shí)在棧內(nèi)存中生成對(duì)應(yīng)的引用c1引用的是oj1的對(duì)象,stu是oj1這個(gè)類的成員comp的引用,當(dāng)我們?cè)诤罄m(xù)代碼調(diào)用的時(shí)候用的都是棧內(nèi)存的引用。同樣也可以看出來(lái)如果屬性是基本數(shù)據(jù)類型那么會(huì)和對(duì)象一起存放在堆區(qū),如果屬性是對(duì)象的引用那么此時(shí)的對(duì)象只包含引用,所引用的對(duì)象會(huì)在堆區(qū)的另一個(gè)空間
1.兩種垃圾回收機(jī)制和原理:
java不同與c++的是java不用程序員手動(dòng)釋放用完的對(duì)象系統(tǒng)自動(dòng)回收
歸功于下面兩種算法
(1)引用計(jì)數(shù)法:
堆中每個(gè)對(duì)象都有一個(gè)引用計(jì)數(shù),被引用一次計(jì)數(shù)加一,引用變量為null則計(jì)數(shù)減一,直到為0表示無(wú)用對(duì)象,但對(duì)循環(huán)引用的無(wú)用對(duì)象無(wú)法識(shí)別(如下圖)
(2)引用可達(dá)法:
程序把所有==引用關(guān)系看作一張圖==,從第一個(gè)節(jié)點(diǎn)開始,尋找對(duì)應(yīng)的引用節(jié)點(diǎn),當(dāng)所有引用節(jié)點(diǎn)尋找完畢后,剩余節(jié)點(diǎn)被認(rèn)為是沒(méi)有引用的節(jié)點(diǎn),即無(wú)用節(jié)點(diǎn)系統(tǒng)自動(dòng)清除(簡(jiǎn)單來(lái)說(shuō)就是如果一個(gè)對(duì)象沒(méi)有被到達(dá)即沒(méi)有被使用,就會(huì)被認(rèn)為是無(wú)用節(jié)點(diǎn));
對(duì)垃圾回收機(jī)制的簡(jiǎn)單理解
1.對(duì)局部變量的回收
(1)對(duì)局部變量:一般局部變量會(huì)跟著方法的結(jié)束出棧而被回收
(2)對(duì)堆區(qū)的對(duì)象:如果沒(méi)有引用指向那么系統(tǒng)就會(huì)認(rèn)為是垃圾被回收
(3)對(duì)象里邊的屬性:會(huì)隨著對(duì)象的回收而回收
總結(jié)
以上是生活随笔為你收集整理的浅谈java内存分析和垃圾收集器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如果你对java的异常处理头皮发麻,那就
- 下一篇: java的两种运行方式Applet和Ap