java与c内存管理_Java基础--Java内存管理与垃圾回收
Java自動內存管理
在講解內存管理之前,首先需要了解對象和對象引用的區(qū)別
對象是類的一個實例,以人這個類為例,Person是我們定義的一個類
public class Person{}
public Person person;
person = new Person();
而new Person()是新建了一個對象,person是對這個對象的引用,它可以指向任意一個對象。
1.1?java運行時區(qū)域(什么地方存什么)
程序計數(shù)器:可以理解為線程當前執(zhí)行位置的標記,用途:線程切換。
棧
>虛擬機棧:每一個方法執(zhí)行時創(chuàng)建一個棧幀,方法的執(zhí)行代表著棧幀在在內存區(qū)換入換出。這里面存儲著方法參數(shù)和局部變量,類型為基本數(shù)據(jù)類型、數(shù)組/對 ? ? ? ? ? ? 象的引用。
>本地方法棧:作用和VM stacks類似,只不過服務于native方法。圖片引自參考2.
堆:存放對象實例。垃圾回收主要指針對堆的回收策略。
方法區(qū):類信息,常量,靜態(tài)變量(static 、class),包含常量池
1.2? 垃圾回收機制
垃圾回收(Garbage Collection,GC)自動清空堆中不再使用的對象。
如果一個對象沒有引用,我們稱這個對象不可達,垃圾回收用于釋放不可達的對象所占據(jù)的內存,這是垃圾回收的基本原則。
垃圾回收分為兩個步驟:判斷這個對象是否已死(不可達)和清除這個對象。
1.2.1 ?對象已死嗎
> 引用計數(shù)。給對象添加一個計數(shù)引用器,當為0時,判斷對象不可達。缺點:無法解決相互引用的情況。ObjA.instance
= ObjB;ObjB.instance = ObjA; ? ? ? ? ? ? ? ?ObjA和ObjB已經(jīng)不能訪問,但引用計數(shù)法無法通知垃圾回收機制。
改進:以棧和static數(shù)據(jù)為根(root),從根出發(fā),跟隨所有的引用,就可以找到所有的可到達對象。也就是說,一個可到達對象,一定被根引用,或者被其他可 ? ? ? ? ? ? ? ?到達對象引用。如下圖:引自參考2
1.2.2. 垃圾回收策略
標記-清除(mark-sweep)算法:標記誰不可達,然后刪除.
缺點:a.效率,兩個步驟效率都不高;b,導致產(chǎn)生大量的空間碎片
復制-清除:將內存劃等分為兩塊區(qū)域A和B,掃描A,將可達的對象復制到B中,然后將A清空。缺點:代價太大
改進:由于對象絕大部分生命周期較短,將內存按照一定比例(通常8:1:1)劃分為A,B,C,將A和B可達的對象存儲到C中,將A和B 清空,A和C作為上一步驟 ? ? ? ? 的A和B。
標記-整理,標記過程類似,存活的對象向一端移動。
3,《深入理解Java虛擬機:JVM高級特性與最佳實踐》.pdf
總結
以上是生活随笔為你收集整理的java与c内存管理_Java基础--Java内存管理与垃圾回收的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java的finally执行顺序_Jav
- 下一篇: java数组1 100偶数和_java