當前位置:首頁 » 黃金回收 » 增量垃圾回收
擴展閱讀
類似於金條 2021-03-31 20:26:33
何蘭黃金市廠 2021-03-31 20:26:32
蒲幣對人民幣匯率 2021-03-31 20:26:27

增量垃圾回收

發布時間: 2021-03-15 11:27:24

㈠ java中的垃圾回收是什麼意思

垃圾回收就是gc(gabage collection)。

java比c++的優點就是多了垃圾回收機制,程序員不用去關心垃圾的回收,系統會自動調用去回收內存。

一般我們想回收的時候只需要調用system.gc方法就可以了。系統會自己去調用destroy方法和其他的回收方法釋放內存,節省內存空間。

㈡ 在面試時怎麼回答java垃圾回收機制

Java的垃圾回收機制是Java虛擬機提供的能力,用於在空閑時間以不定時的方式動態內回收無任何引用的對容象占據的內存空間。
需要注意的是:垃圾回收回收的是無任何引用的對象占據的內存空間而不是對象本身,很多人來我公司面試時,我都會問這個問題的,70%以上的人回答的含義是回收對象,實際上這是不正確的。
System.gc()
Runtime.getRuntime().gc()
上面的方法調用時用於顯式通知JVM可以進行一次垃圾回收,但真正垃圾回收機制具體在什麼時間點開始發生動作這同樣是不可預料的,這和搶占式的線程在發生作用時的原理一樣。

㈢ 垃圾回收的幾種方式

此外,一些演算法可以以 增量方式完成它們的工作(不需要一次收集整個堆,使得收集暫停時間更短),一些演算法可以在用戶程序運行時運行(並發收集)。
其他演算法則必須在用戶程序暫停時一次進行整個收集(即所謂的 stop-the-world收集器)。最後,還有混合型的收集器,如1.2 和以後版本的 JDK 使用的分代收集器,它對堆的不同區域使用不同的收集演算法。
不同的垃圾收集實現使用不同的策略來識別和收回不可到達的對象,它們與用戶程序和調度器以不同的方式互動。不同類型的應用程序對於垃圾收集有不同的要求 ―― 實時應用程序會將要求收集暫停的持續時間短並且有限制,而企業應用程序可能允許更長時間和可預測性更低的暫停以獲得更高的吞吐能力。
有幾種垃圾收集的基本策略:引用計數、標記-清除、標記-整理 (mark-compact) 和復制。此外,一些演算法可以以 增量 方式完成它們的工作(不需要一次收集整個堆,使得收集暫停時間更短),一些演算法可以在用戶程序運行時運行( 並發收集)。
其他演算法則必須在用戶程序暫停時一次進行整個收集(即所謂的 stop-the-world收集器)。最後,還有混合型的收集器,如1.2 和以後版本的 JDK 使用的分代收集器,它對堆的不同區域使用不同的收集演算法。
在對垃圾收集演算法進行評價時,我們可能要考慮以下所有標准:*暫停時間
。收集器是否停止所有工作來進行垃圾收集?要停止多長時間?暫停是否有時間限制?*暫停的可預測性
。垃圾收集暫停是否規劃為在用戶程序方便而不是垃圾收集器方便的時間發生?*CPU 佔用
。總的可用 CPU 時間用在垃圾收集上的百分比是多少?*內存大小
。許多垃圾收集演算法需要將堆分割成獨立的內存空間,其中一些空間在某些時刻對用戶程序是不可訪問的。這意味著堆的實際大小可能比用戶程序的最大堆駐留空間要大幾倍。*虛擬內存交互
。在具有有限物理內存的系統上,一個完整的垃圾收集在垃圾收集過程中可能會錯誤地將非常駐頁面放到內存中來進行檢查。因為頁面錯誤的成本很高,所以垃圾收集器正確管理引用的區域性 (locality) 是很必要的。*緩存交互
。即使在整個堆可以放到主內存中的系統上 ―― 實際上幾乎所有 Java 應用程序都可以做到這一點,垃圾收集也常常會有將用戶程序使用的數據沖出緩存的效果,從而影響用戶程序的性能。*對程序區域性的影響
。雖然一些人認為垃圾收集器的工作只是收回不可到達的內存,但是其他人認為垃圾收集器還應該盡量改進用戶程序的引用區域性。整理收集器和復制收集器在收集過程中重新安排對象,這有可能改進區域性。*編譯器和運行時影響
基本演算法引用計數最直觀的垃圾收集策略是引用計數。引用計數很簡單,但是需要編譯器的重要配合,並且增加了賦值 函數 (mutator)的開銷(這個術語是針對用戶程序的,是從垃圾收集器的角度來看的)。每一個對象都有一個關聯的引用計數 ―― 對該對象的活躍引用的數量。如果對象的引用計數是零,那麼它就是垃圾(用戶程序不可到達它),並可以回收。每次修改指針引用時(比如通過賦值語句),或者當引用超出范圍時,編譯器必須生成代碼以更新引用的對象的引用計數。如果對象的引用計數變為零,那麼運行時就可以立即收回這個塊(並且減少被回收的塊所引用的所有塊的引用計數),或者將它放到遲延收集隊列中。
引用計數很簡單,很適用於增量收集,收集過程一般會得到好的引用區域性,但是出於幾個理由,它很少在生產垃圾收集器中使用,如它不能回收不可到達的循環結構(彼此直接或者間接引用的幾個對象,如循環鏈接的列表或者包含指向父節點的反向指針的樹)。
跟蹤收集器JDK 中的標准垃圾收集器都沒有使用引用計數,相反,它們都使用某種形式的跟蹤收集器 (tracing collector)。跟蹤收集器停止所有工作(盡管不需要在收集的整個過程中都這樣)並開始跟蹤對象,從根集開始沿著引用跟蹤,直到檢查了所有可到達的對象。可以在程序注冊表中、每一個線程堆棧中的(基於堆棧的)局部變數中以及靜態變數中找到根。
標記-清除收集器
最早由 Lisp 的發明人 John McCarthy 於 1960 年提出的最基本的跟蹤收集器形式是 標記―清除收集器,它停止所有工作,收集器從根開始訪問每一個活躍的節點,標記它所訪問的每一個節點。走過所有引用後,收集就完成了,然後就對堆進行清除(即對堆中的每一個對象進行檢查),所有沒有標記的對象都作為垃圾回收並返回空閑列表。
標記-清除實現起來很簡單,可以容易地回收循環的結構,並且不像引用計數那樣增加編譯器或者賦值函數的負擔。但是它也有不足 ―― 收集暫停可能會很長,在清除階段整個堆都是可訪問的,這對於可能有頁面交換的堆的虛擬內存系統有非常負面的性能影響。
標記-清除的最大問題是,每一個活躍的(即已分配的)對象,不管是不是可到達的,在清除階段都是可以訪問的。因為很多對象都可能成為垃圾,這意思著收集器花費大量精力去檢查並處理垃圾。標記-清除收集器還容易使堆產生碎片,這會產生區域性問題並可以造成分配失敗,即使看來有足夠的自由內存可用。
復制收集器在另一種形式的跟蹤收集器 ―― 復制收集器中,堆被分成兩個大小相等的半空間,其中一個包含活躍的數據,另一個未使用。當活躍的空間占滿以後,程序就會停止,活躍的對象被從活躍的空間復制到不活躍的空間中。空間的角色就會轉換,原來不活躍的空間成為了新的活躍空間。
堆整理復制收集器有另一個好處,活躍對象集會被整理到堆的底部。這不僅改進了用戶程序的引用區域性並消除了堆碎片,而且極大地減少了對象分配的成本 ―― 對象分配變成了在堆頂部的指針上增加指針。不需要維護自由列表或者後備列表,或者使用性能最佳或者第一合適的演算法 ―― 分配 N 位元組就是在堆頂部指針上加 N 並返回前一個值這么簡單
為非垃圾收集語言實現了復雜內存管理方案的開發人員可能會對復制收集器中廉價的內存分配感到吃驚 ―― 就是指針加法這么簡單。以前的 JVM 實現沒有使用復制收集器 ―― 這可能是對象分配是昂貴的這一想法是如此普遍的原因之一,開發人員仍然下意識地假設分配成本與其他語言(如 C)類似,而事實上在 Java 運行時中可能要廉價得多。不但是分配成本減少了,而且對於在下次收集之前成為垃圾的對象,解除分配的成本為零,因為既不會訪問也不會復制垃圾對象。
標記-整理收集器
復制演算法的性能很優異,但是它有一個缺點是需要兩倍於標記-清除收集器所需要的內存。 標記-整理 演算法結合了標記-清除和復制,避免了這個問題,代價是增加了一些收集復雜性。與標記-清除類似,標記-整理是兩階段過程,在標記階段訪問並標記每個活躍對象。然後,復制標記的對象,使所有活躍對象被整理到堆的底部。如果每一次收集時進行徹底的整理,那麼得到的堆就類似於復制收集器的結果 ―― 在堆的活躍部分與自由部分有明確的界線,這樣分配成本與復制收集器相當。長壽的對象趨向於沉在堆的底部,這樣就不會像在復制收集器中那樣反復復制它們
那麼 JDK 使用了哪種方式進行垃圾收集呢?在某種意義上,使用了所有的方式。早期的 JDK 使用了單線程的標記-清除或者
標記-清除-整理收集器。1.2 及以後的 JDK 使用了混合的方式,稱為 分代收集,其中根據對象的年齡將堆分為幾個部分,不同的代是用不同的收集演算法收集的。分代收集證明是非常高效的,盡管在運行時它需要更多的簿記。

㈣ 垃圾回收的優點和原理

Java語言中一個顯著的特點就是引入了垃圾回收機制,使c++程序員最頭疼的內存管理的問題迎刃而解,它使得Java程序員在編寫程序的時候不再需要考慮內存管理。由於有個垃圾回收機制,Java中的對象不再有"作用域"的概念,只有對象的引用才有"作用域"。垃圾回收可以有效的防止內存泄露,有效的使用可以使用的內存。垃圾回收器通常是作為一個單獨的低級別的線程運行,不可預知的情況下對內存堆中已經死亡的或者長時間沒有使用的對象進行清楚和回收,程序員不能實時的調用垃圾回收器對某個對象或所有對象進行垃圾回收。回收機制有分代復制垃圾回收和標記垃圾回收,增量垃圾回收

㈤ Java垃圾回收的優點和原理是什麼回收機制是怎樣的

Java語言中一個顯著的特點就是引入了垃圾回收機制,使c++程序員最頭疼的內存管理的回問題迎刃而解,答它使得Java程序員在編寫程序的時候不再需要考慮內存管理。由於有個垃圾回收機制,Java中的對象不再有」作用域」的概念,只有對象的引用才有」作用域」。垃圾回收可以有效的防止內存泄露,有效的使用可以使用的內存。垃圾回收器通常是作為一個單獨的低級別的線程運行,不可預知的情況下對內存堆中已經死亡的或者長時間沒有使用的對象進行清楚和回收,程序員不能實時的調用垃圾回收器對某個對象或所有對象進行垃圾回收。回收機制有分代復制垃圾回收和標記垃圾回收,增量垃圾回收。

㈥ 快遞包裝垃圾的增量已佔生活垃圾增量的93%!它的存在有何影響

快遞包裝垃圾的增量已佔生活垃圾增量的93%,我們要想出一種共存的方式去處理這些垃圾。快遞在我們這個新時代已經是特別多的人都在使用了,但是它製造的垃圾到底怎麼樣去解決,這是一個重要的問題,當前的話我們可以想出來一個既讓這個快遞方面不要徹底消失,而且能把這些垃圾快速的處理掉,其實有人提出過,用回收的方式,變廢為寶。綜上所述,要快遞行業和處理快遞產生的垃圾,這兩者是可以共存的,它的影響也可以通過這樣的形式去解決。

㈦ Java垃圾回收怎麼理解

垃圾回收是Java語言的一大特性,方便了編程,是以消耗性能為代價的,Java語言對內存的分配管理是通過JVM內部機制決定的。
Java虛擬機中有個稱之為垃圾回收器的東西,實際上這個東西也許真正不存在,或者是已經集成到JVM中了,但這無關緊要,仍然可以稱為為垃圾回收器。
垃圾回收器的作用是查找和回收(清理)無用的對象。以便讓JVM更有效的使用內存。
垃圾回收器的運行時間是不確定的,由JVM決定,在運行時是間歇執行的。雖然可以通過System.gc()來強制回收垃圾,但是這個命令下達後無法保證JVM會立即響應執行,但經驗表明,下達命令後,會在短期內執行你的請求。JVM通常會感到內存緊缺時候去執行垃圾回收操作。
垃圾回收過於頻繁會導致性能下降,過於稀疏會導致內存緊缺。這個JVM會將其控制到最好,不用程序員擔心。但有些程序在短期會吃掉大量內存,而這些恐怖的對象很快使用結束了,這時候也許有必要強制下達一條垃圾回命令,這是很有必要的,以便有更多可用的物理內存。
垃圾回收器僅僅能做的是盡可能保證可用內存的使用效率,讓可用內存得到高效的管理。程序員可以影響垃圾回收的執行,但不能控制。
總之,在Java語言中,判斷一塊內存空間是否符合垃圾收集器收集標準的標准只有兩個:
1.給對象賦予了空值null,以下再沒有調用過。
2.給對象賦予了新值,既重新分配了內存空間。

㈧ 垃圾回收的簡介

Java語言中一個顯著的特點就是引入了垃圾回收機制,使c++程序員最頭疼的內存管理的問題迎刃而解,它使得Java程序員在編寫程序的時候不再需要考慮內存管理。由於有個垃圾回收機制,Java中的對象不再有「作用域」的概念,只有對象的引用才有「作用域」。垃圾回收可以有效的防止內存泄露,有效的使用可以使用的內存。垃圾回收器通常是作為一個單獨的低級別的線程運行,不可預知的情況下對內存堆中已經死亡的或者長時間沒有使用的對象進行清除和回收,程序員不能實時的調用垃圾回收器對某個對象或所有對象進行垃圾回收。回收機制有分代復制垃圾回收和標記垃圾回收,增量垃圾回收。
Java 程序員不用擔心內存管理,因為垃圾收集器會自動進行管理。要請求垃圾收集,可以調用下面的方法之一:
System.gc()
Runtime.getRuntime().gc()