亚欧洲精品在线观看,窝窝影院午夜看片,久久国产成人午夜av影院宅,午夜91,免费国产人成网站,ts在线视频,欧美激情在线一区

java語言

Java 語言與C語言中垃圾回收的不同方式

時(shí)間:2025-03-12 05:20:15 java語言 我要投稿
  • 相關(guān)推薦

Java 語言與C語言中垃圾回收的不同方式

  導(dǎo)語:垃圾回收是一種動(dòng)態(tài)存儲(chǔ)管理技術(shù),它自動(dòng)地釋放不再被程序引用的對(duì)象,按照特定的垃圾回收算法來實(shí)現(xiàn)資源自動(dòng)回收。下面就由小編為大家介紹一下Java 語言與C語言中垃圾回收的不同方式,歡迎大家閱讀!

Java 語言與C語言中垃圾回收的不同方式

  1 Java語言中的垃圾回收機(jī)制

  時(shí)下最流行的編程語言Java擁有自己的垃圾回收機(jī)制。實(shí)際上,Java語言來自于C++語言。但Java語言避免了C++語言中復(fù)雜的結(jié)構(gòu),成功克服了多重繼承機(jī)制存在的二義性問題;Java的垃圾回收機(jī)制顯著地提高了程序的效率,降低了復(fù)雜度。由于有垃圾回收機(jī)制,使Java中的對(duì)象不再有“作用域”的概念,而只有對(duì)象的引用才有“作用域”。垃圾回收器是一種動(dòng)態(tài)存儲(chǔ)分配器,它自動(dòng)釋放程序不再需要的已分配堆塊,并且能夠壓縮進(jìn)程堆塊所需要的內(nèi)存空間。垃圾收集是指自動(dòng)回收不被程序占用的分配堆塊的過程。在一個(gè)支持垃圾收集的系統(tǒng)中,應(yīng)用顯式分配堆塊,但是從不顯式釋放堆塊。垃圾回收器一般是作為一個(gè)低級(jí)別的獨(dú)立線程運(yùn)行,不可預(yù)知的情況下對(duì)內(nèi)存堆中已經(jīng)廢除的或者長時(shí)間沒有使用的對(duì)象進(jìn)行清除和回收,而程序員不能實(shí)時(shí)的調(diào)用垃圾回收器對(duì)某個(gè)對(duì)象或所有對(duì)象進(jìn)行垃圾回收。

  Java編程人員不用擔(dān)心內(nèi)存管理,垃圾收集器會(huì)自動(dòng)進(jìn)行管理。但是垃圾回收機(jī)制通常只在滿足兩個(gè)條件時(shí)才運(yùn)行:即有對(duì)象要求回收并且系統(tǒng)需要回收。那么,Java的垃圾回收機(jī)制是如何操作的呢?下面我們來了解一下Java垃圾回收機(jī)制的算法。

  1.1 引用計(jì)數(shù)法

  引用計(jì)數(shù)法,是最原始也是被很多語言所廣泛應(yīng)用的垃圾回收算法。其主旨是給堆中每一個(gè)對(duì)象都設(shè)置一個(gè)引用計(jì)數(shù),當(dāng)其被賦值給對(duì)象的引用時(shí),其引用計(jì)數(shù)加1,當(dāng)其對(duì)象的引用超出生命周期或者被新值賦值時(shí),引用減1,當(dāng)其引用計(jì)數(shù)為0時(shí),即可被系統(tǒng)回收。

  1.2 跟蹤算法

  引用計(jì)數(shù)法一種重要的問題在于當(dāng)對(duì)象間出現(xiàn)循環(huán)引用的時(shí)候,其計(jì)數(shù)永遠(yuǎn)不會(huì)為0,既永遠(yuǎn)不會(huì)被回收。跟蹤算法解決了這一問題,跟蹤算法是采用從根集開始掃描來識(shí)別對(duì)象是否可達(dá)。標(biāo)記可達(dá)的對(duì)象,將不可達(dá)的對(duì)象也就是未標(biāo)記的對(duì)象清除,又稱標(biāo)記和清除算法。

  1.3 壓縮算法

  跟蹤算法的一個(gè)問題就是清除對(duì)象后的內(nèi)存空間變成了堆碎片,不便于再次利用。為了解決這個(gè)問題,引入了壓縮算法。所謂壓縮算法就是在清除的過程中,將所有對(duì)象移動(dòng)到堆的一端,而本來的那端就變成了一段空閑內(nèi)存區(qū),收集器要對(duì)移動(dòng)對(duì)象的所有引用進(jìn)行更新。

  1.4 復(fù)制算法

  壓縮算法的問題在于每次對(duì)對(duì)象引用更新的時(shí)候都產(chǎn)生了冗余的句柄和句柄表。為此,又引入了復(fù)制算法,復(fù)制算法的主旨是在一開始就把堆分成一個(gè)對(duì)象面和多個(gè)空閑面,將對(duì)象面的內(nèi)存空間分配給程序,當(dāng)空間滿了的時(shí)候,利用追蹤算法的機(jī)理掃描活動(dòng)對(duì)象,但并不清除,而是將每個(gè)活動(dòng)對(duì)象復(fù)制到空閑面,這樣空閑面和對(duì)象面就互換了。

  1.5 分代算法

  復(fù)制算法又稱停止和復(fù)制算法,在其對(duì)象面和空閑面切換的過程中程序要暫停執(zhí)行,這樣大大降低了程序執(zhí)行的效率。分代算法正好可以解決這個(gè)問題。分代算法基于程序中大多數(shù)對(duì)象生命周期較短,少數(shù)較長的特點(diǎn),將堆分成多個(gè),每個(gè)子堆作為對(duì)象的一代。垃圾收集器從最新創(chuàng)建的對(duì)象中,將活躍的對(duì)象移到最高代的子堆中,這樣老一代的子堆不會(huì)被經(jīng);厥眨眠@種分代式的方法,節(jié)約了時(shí)間。

  1.6 自適應(yīng)算法

  自適應(yīng)法,就是指根據(jù)特殊情況,采取特殊算法,通過監(jiān)控當(dāng)前堆的使用情況選擇適當(dāng)?shù)乃惴ㄟM(jìn)行垃圾回收。

  垃圾回收要占用時(shí)間,因此,Java運(yùn)行時(shí),系統(tǒng)只在需要的時(shí)候才使用它,而編程者本身無法知道回收發(fā)生的準(zhǔn)確時(shí)間。但如果需要垃圾回收,編程者也可以隨時(shí)調(diào)用下面的方法之一:

  System.gc();

  Runtime.getRuntime().gc();

  2 C語言中的垃圾回收

  C語言憑借其簡潔緊湊、數(shù)據(jù)類型豐富、程序執(zhí)行效率高等特點(diǎn),擁有著大量的編程愛好者,而眾多IT界牛人也說,精通C語言,就等于精通編程。然而C語言實(shí)際上是沒有垃圾回收機(jī)制的,那么被如此廣泛應(yīng)用的編程語言如何來處理其垃圾回收問題呢?

  答案就是使用保守垃圾收集器并調(diào)用free()函數(shù)。像Java語言中,垃圾收集器對(duì)于指針的創(chuàng)建和使用有著嚴(yán)格的控制,所以其能回收所有的垃圾內(nèi)存,而諸如C這樣的語言,垃圾收集器不能被嚴(yán)格控制,則稱之為保守垃圾收集器。

  那么在C語言中的垃圾收集器是如何工作的呢?

  C語言支持垃圾回收系統(tǒng),如前文所說,在支持垃圾收集的系統(tǒng)中,應(yīng)用顯示分配堆塊,但不顯式地釋放。而在C語言程序中,應(yīng)用程序調(diào)用malloc()函數(shù)但是從不調(diào)用free()函數(shù),取而代之的是使用垃圾收集器周期性識(shí)別垃圾堆塊,并需要編程人員調(diào)用free()函數(shù),將這些垃圾堆塊放回到空閑鏈表中。因此,只依靠垃圾收集器是無法做到垃圾內(nèi)存的全部釋放。

  下面我們用有向圖的概念理解存儲(chǔ)器,當(dāng)存在一條從任意根節(jié)點(diǎn)出發(fā)并到達(dá)Q點(diǎn)的有向路徑時(shí),我們說節(jié)點(diǎn)Q是可達(dá)的。Java語言中的垃圾回收器,能夠準(zhǔn)確的標(biāo)記每個(gè)節(jié)點(diǎn)是否可達(dá),并將不可達(dá)的節(jié)點(diǎn)回收,放入空鏈表中。而C語言的垃圾回收器,就是我們所說的保守垃圾回收器,能夠正確地標(biāo)記可達(dá)的節(jié)點(diǎn),但一些不可達(dá)的節(jié)點(diǎn)卻有可能被錯(cuò)誤地標(biāo)記為可達(dá)。從而,被錯(cuò)誤標(biāo)記的節(jié)點(diǎn),將永遠(yuǎn)不會(huì)被回收。可想而知,當(dāng)系統(tǒng)中的內(nèi)存被錯(cuò)誤標(biāo)記所占滿時(shí),系統(tǒng)將無法再運(yùn)行。

  下面我們來看,垃圾收集器如何為C程序?qū)⒁粋(gè)保守的收集器加入到已存在的malloc()函數(shù)中,如圖1所示。

  垃圾收集器作為一個(gè)應(yīng)用并行的獨(dú)立線程,不斷地更新有向圖和回收垃圾。無論應(yīng)用程序何時(shí)需要內(nèi)存空間,系統(tǒng)都會(huì)調(diào)用malloc()函數(shù),如果malloc()函數(shù)找不到可用的內(nèi)存分配快,那么它就調(diào)用垃圾收集器,垃圾收集器識(shí)別出垃圾塊,并通過調(diào)用free()函數(shù)將它們返回給堆塊。這里的關(guān)鍵在于,垃圾收集器代替了應(yīng)用程序去調(diào)用free()函數(shù),當(dāng)對(duì)垃圾收集的調(diào)用返回時(shí),malloc()函數(shù)想要發(fā)現(xiàn)一個(gè)可用的空閑塊。如果還是不成功,它就向操作系統(tǒng)請(qǐng)求額外的存儲(chǔ)器。最后,如果成功,malloc()函數(shù)返回一個(gè)指向請(qǐng)求塊的指針,如果不成功就返回一個(gè)空指針。

  3 小結(jié)

  綜上所述,不同語言對(duì)于垃圾回收的方式不同,但是不管是什么語言,垃圾回收都有著重要的作用。所以,在編程學(xué)習(xí)中,尤其是編程入門階段應(yīng)該養(yǎng)成調(diào)用內(nèi)存釋放函數(shù)的好習(xí)慣,在每次占用內(nèi)存結(jié)束后,應(yīng)主動(dòng)釋放內(nèi)存,這樣即節(jié)省內(nèi)存空間,又提高系統(tǒng)效率。

【Java 語言與C語言中垃圾回收的不同方式】相關(guān)文章:

在C語言中函數(shù)調(diào)用方式的區(qū)別09-01

C語言中函數(shù)之間地址傳遞方式10-23

C語言中的整數(shù)06-16

C語言中的字符07-18

java垃圾回收機(jī)制06-28

java垃圾回收算法講解08-27

JAVA語言中的參數(shù)傳遞11-03

C語言中volatile的含義08-14

c語言中怎么畫圖11-06