⑴ java中的垃圾回收是什麼意思
垃圾回收就是gc(gabage collection)。
java比c++的優點就是多了垃圾回收機制,程序員不用去關心垃圾的回收,系統會自動調用去回收內存。
一般我們想回收的時候只需要調用system.gc方法就可以了。系統會自己去調用destroy方法和其他的回收方法釋放內存,節省內存空間。
⑵ jvm垃圾回收演算法有哪些
1.標記–清除演算法
執行步驟:
標記:遍歷內存區域,對需要回收的對象打上標記。
清除:再次遍歷內存,對已經標記過的內存進行回收。
2.復制演算法
將內存劃分為等大的兩塊,每次只使用其中的一塊。當一塊用完了,觸發GC時,將該塊中存活的對象復制到另一塊區域,然後一次性清理掉這塊沒有用的內存。下次觸發GC時將那塊中存活的的又復制到這塊,然後抹掉那塊,循環往復。
3. 標記–整理演算法
因為前面的復制演算法當對象的存活率比較高時,這樣一直復制過來,復制過去,沒啥意義,且浪費時間。所以針對老年代提出了「標記整理」演算法。
執行步驟:
標記:對需要回收的進行標記
整理:讓存活的對象,向內存的一端移動,然後直接清理掉沒有用的內存。
4. 分代收集演算法
當前大多商用虛擬機都採用這種分代收集演算法,這個演算法並沒有新的內容,只是根據對象的存活的時間的長短,將內存分為了新生代和老年代,這樣就可以針對不同的區域,採取對應的演算法。如:
新生代,每次都有大量對象死亡,有老年代作為內存擔保,採取復制演算法。
老年代,對象存活時間長,採用標記整理,或者標記清理演算法都可。
⑶ jvm的理解
JVM主要就是為java程序提供一個運行環境,包括類的載入,內存的分配,垃圾的回收,JVM將內存劃分為堆,虛擬機棧,線程計數器,本地方法棧,方法區五個內存區域。
為了滿足java程序運行時的垃圾回收,jvm提供了一些垃圾回收器用於堆內存的回收,常用的垃圾收集器包括ParNew新生代垃圾收集器,cms老年代垃圾收集器,G1垃圾收集器,這些垃圾收集器根據年齡代對象的特點使用不同的垃圾回收演算法,為了解決垃圾收集時GC停頓對於Java程序的影響,使用一些參數的配置盡量減少垃圾回收時的停頓。
比如ParNew新生代垃圾收集器採用復制收集演算法,使用多線程收集,提高垃圾回收的效率,CMS採用分段收集,對於比較耗時的階段允許用戶線程並行,但隨之而來的也會導致一些缺陷,比如浮動垃圾,cpu資源緊張,內存碎片的問題,對於這些問題,可以通過JVM調優去盡量避免,比如浮動垃圾則可以減小CMS垃圾回收的老年代內存閾值。
G1垃圾收集器則採用可控的GC停頓時間來進行垃圾回收,將內存劃分為一個個小的region,邏輯上劃分出年輕代和老年代,所以G1垃圾收集器的調優主要就是對於GC停頓時間的調優,太大可能會導致每次GC停頓時間太長,太小可能導致GC發生的太頻繁。
對於JVM調優這個話題,我們主要要保證減少YGC的次數,和盡量避免Full GC,因為對老年代的回收由於存活的對象比較多,回收是比較耗時的,那麼對於這目標的實現,我們主要圍繞一個思想來做,就是盡量保證每次回收後存活的對象可以存放在s區,這些都需要對程序有一個預測和平時的JVM觀測
⑷ 什麼是Java的垃圾回收機制內部實現原理是什麼
Java中的對象沒有作用域的概念,只有對象的引用才有作用域。在用new創建出一個對象之後,垃圾回收器就會自動監控該對象,並且會辨別是否需要釋放內存,不需要開發者手動釋放,所以可以很好的防止內存泄漏。
JVM的垃圾回收器採用的是一種分代(generational )回收策略,共分為三個代:
1.Young(年輕代)
年 輕代分三個區。一個Eden區,兩個Survivor區。大部分對象在Eden區中生成。當Eden區滿時,還存活的對象將被復制到Survivor區 (兩個中的一個),當這個Survivor區滿時,此區的存活對象將被復制到另外一個Survivor區,當這個Survivor去也滿了的時候,從第一 個Survivor區復制過來的並且此時還存活的對象,將被復制「年老區(Tenured)」。需要注意,Survivor的兩個區是對稱的,沒先後關 系,所以同一個區中可能同時存在從Eden復制過來 對象,和從前一個Survivor復制過來的對象,而復制到年老區的只有從第一個Survivor去過來的對象。而且,Survivor區總有一個是空的。
2.Tenured(年老代)
年老代存放從年輕代存活的對象。一般來說年老代存放的都是生命期較長的對象。
3.Perm(持久代)
用 於存放靜態文件,如Java類、方法等。持久代對垃圾回收沒有顯著影響,但是有些應用可能動態生成或者調用一些class,例如Hibernate等, 在這種時候需要設置一個比較大的持久代空間來存放這些運行過程中新增的類。持久代大小通過-XX:MaxPermSize=進行設置。
⑸ java中的垃圾回收機制的作用是什麼
java中垃圾回收機制的作用是對程序中無任何引用的對象占據的內存空間進行釋放的一種釋放內存的方式。
java中垃圾回收機制有幾個明顯的特點。1.垃圾回收是由虛擬機即JVM執行;2.系統空閑時執行;3.釋放的一定是不再被引用的對象;4.回收方法gc()方法,雖然可以主動調用,但是不確定會立即執行。
⑹ jvm的垃圾回收機制詳解
1.JVM的gc概述
gc即垃圾收集機制是指jvm用於釋放那些不再使用的對象所佔用的內存。java語言並不要求jvm有gc,也沒有規定gc如何工作。不過常用的jvm都有gc,而且大多數gc都使用類似的演算法管理內存和執行收集操作。
在充分理解了垃圾收集演算法和執行過程後,才能有效的優化它的性能。有些垃圾收集專用於特殊的應用程序。比如,實時應用程序主要是為了避免垃圾收集中斷,而大多數OLTP應用程序則注重整體效率。理解了應用程序的工作負荷和jvm支持的垃圾收集演算法,便可以進行優化配置垃圾收集器。
垃圾收集的目的在於清除不再使用的對象。gc通過確定對象是否被活動對象引用來確定是否收集該對象。gc首先要判斷該對象是否是時候可以收集。兩種常用的方法是引用計數和對象引用遍歷。
1.1.引用計數
引用計數存儲對特定對象的所有引用數,也就是說,當應用程序創建引用以及引用超出范圍時,jvm必須適當增減引用數。當某對象的引用數為0時,便可以進行垃圾收集。
1.2.對象引用遍歷
早期的jvm使用引用計數,現在大多數jvm採用對象引用遍歷。對象引用遍歷從一組對象開始,沿著整個對象圖上的每條鏈接,遞歸確定可到達(reachable)的對象。如果某對象不能從這些根對象的一個(至少一個)到達,則將它作為垃圾收集。在對象遍歷階段,gc必須記住哪些對象可以到達,以便刪除不可到達的對象,這稱為標記(marking)對象。
下一步,gc要刪除不可到達的對象。刪除時,有些gc只是簡單的掃描堆棧,刪除未標記的未標記的對象,並釋放它們的內存以生成新的對象,這叫做清除(sweeping)。這種方法的問題在於內存會分成好多小段,而它們不足以用於新的對象,但是組合起來卻很大。因此,許多gc可以重新組織內存中的對象,並進行壓縮(compact),形成可利用的空間。
為此,gc需要停止其他的活動活動。這種方法意味著所有與應用程序相關的工作停止,只有gc運行。結果,在響應期間增減了許多混雜請求。另外,更復雜的 gc不斷增加或同時運行以減少或者清除應用程序的中斷。有的gc使用單線程完成這項工作,有的則採用多線程以增加效率。
2.幾種垃圾回收機制
2.1.標記-清除收集器
這種收集器首先遍歷對象圖並標記可到達的對象,然後掃描堆棧以尋找未標記對象並釋放它們的內存。這種收集器一般使用單線程工作並停止其他操作。
2.2.標記-壓縮收集器
有時也叫標記-清除-壓縮收集器,與標記-清除收集器有相同的標記階段。在第二階段,則把標記對象復制到堆棧的新域中以便壓縮堆棧。這種收集器也停止其他操作。
2.3.復制收集器
這種收集器將堆棧分為兩個域,常稱為半空間。每次僅使用一半的空間,jvm生成的新對象則放在另一半空間中。gc運行時,它把可到達對象復制到另一半空間,從而壓縮了堆棧。這種方法適用於短生存期的對象,持續復制長生存期的對象則導致效率降低。
2.4.增量收集器
增量收集器把堆棧分為多個域,每次僅從一個域收集垃圾。這會造成較小的應用程序中斷。
2.5.分代收集器
這種收集器把堆棧分為兩個或多個域,用以存放不同壽命的對象。jvm生成的新對象一般放在其中的某個域中。過一段時間,繼續存在的對象將獲得使用期並轉入更長壽命的域中。分代收集器對不同的域使用不同的演算法以優化性能。
2.6.並發收集器
並發收集器與應用程序同時運行。這些收集器在某點上(比如壓縮時)一般都不得不停止其他操作以完成特定的任務,但是因為其他應用程序可進行其他的後台操作,所以中斷其他處理的實際時間大大降低。
2.7.並行收集器
並行收集器使用某種傳統的演算法並使用多線程並行的執行它們的工作。在多cpu機器上使用多線程技術可以顯著的提高java應用程序的可擴展性。
⑺ java中的垃圾回收機制是怎麼回事
Java的堆是一個運行時數據區,類的實例(對象)從中分配空間。Java虛擬機(JVM)的堆中儲存著正在運行的應用程序所建立的所有對象,這些對象通過new、newarray、anewarray和multianewarray等指令建立,但是它們不需要程序代碼來顯式地釋放。一般來說,堆的是由垃圾回收來負責的,盡管JVM規范並不要求特殊的垃圾回收技術,甚至根本就不需要垃圾回收,但是由於內存的有限性,JVM在實現的時候都有一個由垃圾回收所管理的堆。垃圾回收是一種動態存儲管理技術,它自動地釋放不再被程序引用的對象,按照特定的垃圾收集演算法來實現資源自動回收的功能。
垃圾收集的意義
在C++中,對象所佔的內存在程序結束運行之前一直被佔用,在明確釋放之前不能分配給其它對象;而在Java中,當沒有對象引用指向原先分配給某個對象的內存時,該內存便成為垃圾。JVM的一個系統級線程會自動釋放該內存塊。垃圾收集意味著程序不再需要的對象是"無用信息",這些信息將被丟棄。當一個對象不再被引用的時候,內存回收它佔領的空間,以便空間被後來的新對象使用。事實上,除了釋放沒用的對象,垃圾收集也可以清除內存記錄碎片。由於創建對象和垃圾收集器釋放丟棄對象所佔的內存空間,內存會出現碎片。碎片是分配給對象的內存塊之間的空閑內存洞。碎片整理將所佔用的堆內存移到堆的一端,JVM將整理出的內存分配給新的對象。
垃圾收集能自動釋放內存空間,減輕編程的負擔。這使Java 虛擬機具有一些優點。首先,它能使編程效率提高。在沒有垃圾收集機制的時候,可能要花許多時間來解決一個難懂的存儲器問題。在用Java語言編程的時候,靠垃圾收集機制可大大縮短時間。其次是它保護程序的完整性, 垃圾收集是Java語言安全性策略的一個重要部份。
垃圾收集的一個潛在的缺點是它的開銷影響程序性能。Java虛擬機必須追蹤運行程序中有用的對象, 而且最終釋放沒用的對象。這一個過程需要花費處理器的時間。其次垃圾收集演算法的不完備性,早先採用的某些垃圾收集演算法就不能保證100%收集到所有的廢棄內存。當然隨著垃圾收集演算法的不斷改進以及軟硬體運行效率的不斷提升,這些問題都可以迎刃而解。 (課課家教育java入門到精通)
⑻ java語言中垃圾回收機制的優點,並考慮2種回收機制。求幫忙。
java語言中一個顯著的特點就是引入了垃圾回收機制,使C++程序員最頭痛的內存管理問題迎刃而解,他使得java程序員在編寫承學的哦時候不用再考慮內潤管理問題了,由於有了垃圾回收機制,java中的對象不再有「作用域」的概念,只是在對象引用的時候才有「作用域」,垃圾回收可以有效的防止內存泄漏,有效的使用可以使用的內存。
垃圾回收器通常作為一個單獨的低級別的線程運行,不可預知的情況下對內存堆中已經死亡的或者長時間沒有使用的對象進行清楚的哦回收,承諾過許願程序員不能實時的調用來幾回收器對某個對象或所有對象進行垃圾回收,回收機制有分帶復制來幾回收和標記垃圾回收,增量垃圾回收。
希望能幫到你,謝謝!
⑼ Java 垃圾回收機制的作用范圍
java中垃圾回收機制的作用是對程序中無任何引用的對象占據的內存空間進行釋放的一種釋放內存的方式。
java中垃圾回收機制有幾個明顯的特點。
垃圾回收是由虛擬機即JVM執行;
2.系統空閑時執行;
3.釋放的一定是不再被引用的對象;
4.回收方法gc()方法,雖然可以主動調用,但是不確定會立即執行。