亚洲精品中文字幕无乱码_久久亚洲精品无码AV大片_最新国产免费Av网址_国产精品3级片

java語言

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

時間:2024-10-06 03:40:50 java語言 我要投稿
  • 相關推薦

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

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

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

  1 Java語言中的垃圾回收機制

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

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

  1.1 引用計數(shù)法

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

  1.2 跟蹤算法

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

  1.3 壓縮算法

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

  1.4 復制算法

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

  1.5 分代算法

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

  1.6 自適應算法

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

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

  System.gc();

  Runtime.getRuntime().gc();

  2 C語言中的垃圾回收

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

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

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

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

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

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

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

  3 小結

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

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

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

java垃圾回收機制06-28

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

C 語言中宏的使用08-02

C語言中assert的用法06-02

C語言中的運算規(guī)則10-14

C語言中的字符(char)09-24

C語言中sizeof的用法09-09

C語言中函數(shù)的區(qū)分08-30

c語言中什么是變量08-22