gc演算法
標記整理演算法:顧名思義會涉及兩個過程:標記過程:將被回收的對象進行標記;回收過程:gc找到標記的對象執行垃圾回收,簡單的理解為需要遍歷到單個對象...
復制演算法:相當於事先把內存劃分為兩塊,執行gc時把存活的對象復制到另一塊內存區域,剩下的全部清除,簡單的理解為批量處理.
復制演算法:實現簡單,運行效率高,但每次只能使用一半內存,因此內存的利用率不高;標記整理演算法,涉及兩個過程,運行效率慢,且整理之後會產生不連續的內存空間
⑵ gc用的引用可達性分析演算法中,哪些對象可作為gc roots對象
在VisualBasic的程序設計中,面向對象是非常重要的編程概念。設計VisualBasic應用程序的過程,實際上是處理對象的過程。在編程過程中,可以使用由VisualBasic提供的對象,如窗體、控制項和數據訪問對象,也可以在應用程序中控制其它應用程序對象,甚至可以創建自己的對象,並且為它們定義附加的屬性或方法。
對象是可以作為單元處理的代碼和數據的組合。對象可以是應用程序的片段,如控制項或窗體,也可以是整個應用程序。
VisualBasic中的每個對象都是由一個類來定義的。類相當於模子,它決定了每個鑄件的特徵,例如大小和形狀。利用同一個模子,可以鑄造出許多鑄件。而對象就是鑄件。
雖然在實際編程的過程中,經常忽略類和對象的區別,但還是應該注意以下的兩個概念:
工具箱上的控制項代表的是類,控制項是要等到它們在窗體上繪制出來之後才存在的。在建立一個控制項的時候,實際上是建立的控制項類的一個實例,這個實例才是在應用程序中要控制的對象。
在設計時,處理的窗體實際上是一個類。在運行時,VisualBasic才產生窗體的對象。
對象具有自己的屬性、方法和事件。屬性窗口中列出了當前應用程序中的對象的類和屬性。
對象的屬性是對象自己所封裝的一些數據,用於定義對象自身的外觀和相應的一些性質。對象的方法實際上是對象已經封裝好的一段程序,它能夠完成一定的功能,例如完成對對象自身的一些修改和調整等。對象的事件實際上也是一種數據類型,它通過接受系統傳遞一個應用程序的消息,從而根據用戶的操作或者應用程序的運行做出相應的反應。處理對象的過程,就是對對象的屬性賦值,使用對象的方法和利用對象的事件,控制對象的外觀和行為和對用戶的操作做出反應的過程。
對象提供了用戶不必自己去編寫的程序代碼,例如:用戶可以創建自己的對話框,但實際上並不需要這樣做,而是利用VisualBasic提供的常用對話框控制項。
希望我能幫助你解疑釋惑。
⑶ JVM針對年輕代和老年代的GC演算法有什麼區別
年輕代大多數都是用完就刪的,所以年輕代用的是標記復制,把不刪的標記出來,然後復制,最後清空。而老年代的是已經經過一次gc存活下來的,大多都是要長時間用的,要刪除的少,所以採用的是,標記刪除,把要刪除的標記出來,統一刪除
⑷ GC是什麼意思
常用的GC演算法: 1)標記非活動對象 --何為非活動對象,通俗的講,就是無引用的對象。追蹤root對象演算法: 深度追蹤root對象,將heap中所有被引用到的root做標志,所有未被標志的對象視為非活動對象,所佔用的空間視為非活動內存。2)清理非活動對象 Copy演算法: 方法:將內存分為兩個區域(from space和to space)。所有的對象分配內存都分配到from space。在清理非活動對象階段,把所有標志為活動的對象,到to space,之後清楚from space空間。然後互換from sapce和to space的身份。既原先的from space變成to sapce,原先的to space變成from space。每次清理,重復上述過程。優點:演算法不理會非活動對象,數量僅僅取決為活動對象的數量。並且在的同時,整理了heap空間,即,to space的空間使用始終是連續的,內存使用效率得到提高。缺點:劃分from space和to space,內存的使用率是1/2。Compaction演算法: 方法:在清理非活動對象階段,刪除非活動對象佔用內存,並且把活動對象向heap的底部移動,直到所有的活動對象被移到heap的一側。優點:無須劃分from sapce和to space,提高內存的使用率。並且compaction後的內存空間也是連續分配的。缺點:該演算法相對比較復雜。sun jdk gc介紹: 在減少gc之前,先來看看來自IBM的一組統計數據: 98%的java對象,在創建之後不久就變成了非活動對象;只有2%的對象,會在長時間一直處於活動狀態。如果能對這兩種對象區分對象,那麼會提交GC的效率。在sun jdk gc中(具體的說,是在jdk1.4之後的版本),提出了不同生命周期的GC策略。young generation: 生命周期很短的對象,歸為young generation。由於生命周期很短,這部分對象在gc的時候,很大部分的對象已經成為非活動對象。因此針對young generation的對象,採用演算法,只需要將少量的存活下來的對象到to space。存活的對象數量越少,那麼演算法的效率越高。young generation的gc稱為minor gc。經過數次minor gc,依舊存活的對象,將被移出young generation,移到tenured generation(下面將會介紹) young generation分為: eden:每當對象創建的時候,總是被分配在這個區域 survivor1:演算法中的from space survivor2:演算法中的to sapce (備註:其中survivor1和survivor2的身份在每次minor gc後被互換) minor gc的時候,會把eden survivor1(2)的對象到survivor2(1)去。tenured generation: 生命周期較常的對象,歸入到tenured generation。一般是經過多次minor gc,還 依舊存活的對象,將移入到tenured generation。(當然,在minor gc中如果存活的對象的超過survivor的容量,放不下的對象會直接移入到tenured generation) tenured generation的gc稱為major gc,就是通常說的full gc。採用compactiion演算法。由於tenured generaion區域比較大,而且通常對象生命周期都比較常,compaction需要一定時間。所以這部分的gc時間比較長。minor gc可能引發full gc。當eden+from space的空間大於tenured generation區的剩餘空間時,會引發full gc。這是悲觀演算法,要確保eden+from space的對象如果都存活,必須有足夠的tenured generation空間存放這些對象。Permanet Generation: 該區域比較穩定,主要用於存放classloader信息,比如類信息和method信息。對於spring hibernate這些需要動態類型支持的框架,這個區域需要足夠的空間。這部分內容相對比較理論,可以結合jstat,jmap等命令(當然也可以使用jconsole,jprofile,gciewer等工具),觀察jdk gc的情
⑸ jdk8中,GC用到的的演算法有哪些
主要應用Mark-sweepalgorithm(標記消除演算法)即從根object(程序直接訪問的)開始標記可到達的object演算法基於有向圖,採用深度優先搜索最後推薦你一本書,《java程序設計語言》([美]KenArnold,JamesGosling,DavidHolmes)上面有對
⑹ 如何設置java gc回收演算法
在java和c#語言中,使用的是託管代碼,不像c++語言那樣由程序員進行內存的手動分配和回收,java語言則由JVM即Java虛擬機 全權負責堆內存的管理,這樣子大大減少了程序員的負擔,同時一定程度上提高了開發效率和系統穩定性,而常用的GC垃圾回收演算法有哪些呢?
Java的堆是一個運行時數據區,類的實例(對象)從中分配空間。Java虛擬機(JVM)的堆中儲存著正在運行的應用程序所建立的所有對象,這些對象通過new、newarray、anewarray和multianewarray等指令建立,但是它們不需要程序代碼來顯式地釋放。一般來說,堆的是由垃圾回收 來負責的,盡管JVM規范並不要求特殊的垃圾回收技術,甚至根本就不需要垃圾回收,但是由於內存的有限性,JVM在實現的時候都有一個由垃圾回收所管理的堆。垃圾回收是一種動態存儲管理技術,它自動地釋放不再被程序引用的對象,按照特定的垃圾收集演算法來實現資源自動回收的功能。
⑺ 誰能簡單概括下cms和舊的gc演算法的區別
中間調整過幾次,先搞了幾台機器做了驗證,後來逐步推廣的。1、調大heap區,由原來的4g,調整到5g,young區的大小不變,還是2g,這時候old區就由2g變為3g了(這樣保證old區有足夠的空間);2、設置-XX:UseCMSInitiatingOccupancyOnly,其實這個不關這個問題,只是發現半夜CMS進行的有點頻繁,就禁止掉了悲觀策略;3、設置CMS區回收的比例,從80%調整到75%,讓old區盡早的進行,有足夠的空間剩餘;為什麼要有GC(垃圾回收)?JVM通過GC來回收堆和方法區中的內存,GC的基本原理就是找到程序中不再被使用的對象,然後回收掉這些對象佔用的內存。主要的收集器有哪些?引用計數器和跟蹤計數器兩種。引用計數器記錄對象是否被引用,當計數器為零時,說明對象已經不再被使用,可以進行回收。java中的對象有復雜的引用關系,不是很適合引用計數器,所以sunjdk中並沒有實現這種GC方式。跟蹤收集器,全局記錄數據的引用狀態,基於一定的條件觸發。執行的時候,從根集合開始掃描對象的引用關系,主要有復制(ing)、標記-清除(Mark-Sweep)、標記-壓縮(Mark-Compact)那種演算法。
⑻ GC是如何是如何啟動及GC中的演算法等
首先,我們先看看GC處理的內存區域在hotSpot(jdk1.8用的這個虛擬機)中是如何劃分的.
虛擬機將內存劃分為兩大區域,新生代與老年代.
而在新生代中
虛擬機又將區域劃分為Eden和兩塊survivor,新創建的對象將會在佔有較大區域的Eden和一塊survivor,當GC處理垃圾是首先進行標記,會將剩餘的存活對象復制之後放在另外survivor中,然後進行清除,清除之會.
那麼這里就有一個問題,如果存活對象過多 survivor放不下怎麼辦?
這里就會使用擔保:將溢出的對象放入老年代之中.
如果是老年代那,因為老年代的對象的存活能力很強,且無法有空間為老年代進行擔保,所以老年代使用的事 標記-整理
演算法進行垃圾回收的,當GC標記清除了可回收的對象,會將剩餘對象向一端移動.
那麼GC是如何一步步的進行垃圾回收的那?
首先GC要啟動可達性演算法,那麼GC是如何快速的找出所有的GCROOTS節點的那?
1. hotSpot是使用OopMap這樣一組數據結構進行記錄的,類載入完成之後
會記錄對象內什麼偏移量是什麼類型(書上的話),編譯器也會記錄棧和寄存機中的位置.,而這個數據會在特點的位置進行記錄,這些位置就叫做安全點(safepoint).
還有 GC的啟動需要暫時掛起所有的線程,那麼GC是在什麼時間進行垃圾回收的那?
1.當線程運行到safepoint的時候才會進行GC,那麼GC開始之後需要掛起所有線程,這是GC會選擇使用主動式的搶斷,也就是說GC會設置一個和安全點重合的輪詢點,讓所有線程都去訪問這個輪詢點,如果線程訪問結果為真,那麼就代表線程到了輪詢點,便會記性線程中斷了.
⑼ gc演算法有哪些 gc收集器有哪些
主要應用Mark-sweep algorithm(標記消除演算法)
即從根object(程序直接訪問的)開始標記可到達的object
演算法基於有向圖,採用深度優先搜索
最後你一本書, 《java程序設計語言》([美] Ken Arnold, James Gosling, David Holmes) 上面有對於GC的介紹(P305)。