jdk8用G1回收器嗎
① java從入門到精通用JDK8.0的可以嗎
不建議用8,jdk不是版本越新就越好,還是從基礎的來,現在項目中大部分都是1.6,1.7的。
以下摘自網路知道:
如果你是個人興趣研究,那麼jdk7比較適合。如果是想找工作之類的就先選jdk6,然後jdk7。
jdk7相比jdk6增加了一些功能、優化了性能以及簡化了語法,比如:
1.更簡單的異常處理語句
2.字元串支持switch
3.二進制值定義
4.泛型類型推斷
5.多線程中增加了並行分解框架(fork/join),以前看的時候這個還在測試
6.jvm優化、支持非java語言、正式支持G1垃圾收集器
http://..com/question/527542608.html?fr=iks&word=%B0%E6%B1%BE+jdk%CA%C7+%D0%C2%CA%D6&ie=gbk
② java虛擬機常見的幾種垃圾收集演算法
1、垃圾收集器概述
垃圾收集器是垃圾回收演算法(標記-清除演算法、復制演算法、標記-整理演算法、火車演算法)的具體實現,不同商家、不同版本的JVM所提供的垃圾收集器可能會有很在差別,本文主要介紹HotSpot虛擬機中的垃圾收集器。
1-1、垃圾收集器組合
JDK7/8後,HotSpot虛擬機所有收集器及組合(連線),如下圖:
(A)、圖中展示了7種不同分代的收集器:
Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS、G1;
(B)、而它們所處區域,則表明其是屬於新生代收集器還是老年代收集器:
新生代收集器:Serial、ParNew、Parallel Scavenge;
老年代收集器:Serial Old、Parallel Old、CMS;
整堆收集器:G1;
(C)、兩個收集器間有連線,表明它們可以搭配使用:
Serial/Serial Old、Serial/CMS、ParNew/Serial Old、ParNew/CMS、Parallel Scavenge/Serial Old、Parallel Scavenge/Parallel Old、G1;
(D)、其中Serial Old作為CMS出現"Concurrent Mode Failure"失敗的後備預案(後面介紹);
1-2、並發垃圾收集和並行垃圾收集的區別
(A)、並行(Parallel)
指多條垃圾收集線程並行工作,但此時用戶線程仍然處於等待狀態;
如ParNew、Parallel Scavenge、Parallel Old;
(B)、並發(Concurrent)
指用戶線程與垃圾收集線程同時執行(但不一定是並行的,可能會交替執行);
用戶程序在繼續運行,而垃圾收集程序線程運行於另一個CPU上;
如CMS、G1(也有並行);
1-3、Minor GC和Full GC的區別
(A)、Minor GC
又稱新生代GC,指發生在新生代的垃圾收集動作;
因為Java對象大多是朝生夕滅,所以Minor GC非常頻繁,一般回收速度也比較快;
(B)、Full GC
又稱Major GC或老年代GC,指發生在老年代的GC;
出現Full GC經常會伴隨至少一次的Minor GC(不是絕對,Parallel Sacvenge收集器就可以選擇設置Major GC策略);
Major GC速度一般比Minor GC慢10倍以上;
③ java垃圾是怎麼回收的,回收演算法
Java ,C#語言與C/C++語言一個很大的區別是java與C#具有自動垃圾回收機制。C++程序員經常需要絞盡腦汁的分析哪裡出現了內存泄漏。而在java,C#中,雖然有時也會出現內存泄漏,但大部分情況下程序員不需要考慮對象或者數據何時需要被銷毀。因此程序員不會因為錯誤的釋放內存而導致程序崩潰。垃圾回收的缺點是加大了程序的負擔,有可能影響程序的性能。
1.垃圾收集器的主要功能有
(1) 定期發現那些對象不再被引用,並把這些對象占據的堆空間釋放出來。
(2) 類似於操作系統的內存管理,垃圾收集器還需要處理由於對象動態生成與銷毀產生的堆碎塊,以便更有效的利用虛擬機內存。
2.區分活動對象與垃圾的演算法
(1)引用計數法
堆中每一個對象都有一個引用計數。當新創建一個對象,或者有變數被賦值為這個對象的引用,則這個對象的引用計數加1;當一個對象的引用超過生存期或者被設置一個新的值時,這個對象的引用計數減1。當對象的引用計數變為0時,就可以被當作垃圾收集。
這種方法的好處是垃圾收集較快,適用於實時環境。缺點是這種方法無法監測出循環引用。例如對象A引用對象B,對象B也引用對象A,則這兩個對象可能無法被垃圾收集器收集。因此這種方法是垃圾收集的早期策略,現在很少使用。
(2)跟蹤法
這種方法把每個對象看作圖中一個節點,對象之間的引用關系為圖中各節點的鄰接關系。垃圾收集器從一個或數個根結點遍歷對象圖,如果有些對象節點永遠無法到達,則這個對象可以被當作垃圾回收。
容易發現,這種方法可以檢測出循環引用,避免了引用計數法的缺點,較為常用。
3.常用垃圾回收機制
(1)標記-清除收集器
這種收集器首先遍歷對象圖並標記可到達的對象,然後掃描堆棧以尋找未標記對象並釋放它們的內存。這種收集器一般使用單線程工作並停止其他操作。
(2)標記-壓縮收集器
有時也叫標記-清除-壓縮收集器,與標記-清除收集器有相同的標記階段。在第二階段,則把標記對象復制到堆棧的新域中以便壓縮堆棧。這種收集器也停止其他操作。
(3)復制收集器
這種收集器將堆棧分為兩個域,常稱為半空間。每次僅使用一半的空間,虛擬機生成的新對象則放在另一半空間中。垃圾回收器運行時,它把可到達對象復制到另一半空間,沒有被復制的的對象都是不可達對象,可以被回收。這種方法適用於短生存期的對象,持續復制長生存期的對象由於多次拷貝,導致效率降低。缺點是只有一半的虛擬機空間得到使用。
(4)增量收集器
增量收集器把堆棧分為多個域,每次僅從一個域收集垃圾。這會造成較小的應用程序中斷。
(5)分代收集器
這種收集器把堆棧分為兩個或多個域,用以存放不同壽命的對象。虛擬機生成的新對象一般放在其中的某個域中。過一段時間,繼續存在的對象將獲得使用期並轉入更長壽命的域中。分代收集器對不同的域使用不同的演算法以優化性能。這樣可以減少復制對象的時間。
(6)並發收集器
並發收集器與應用程序同時運行。這些收集器在某點上(比如壓縮時)一般都不得不停止其他操作以完成特定的任務,但是因為其他應用程序可進行其他的後台操作,所以中斷其他處理的實際時間大大降低。
(7)並行收集器
並行收集器使用某種傳統的演算法並使用多線程並行的執行它們的工作。在多CPU機器上使用多線程技術可以顯著的提高java應用程序的可擴展性。
(8)自適應收集器
根據程序運行狀況以及堆的使用狀況,自動選一種合適的垃圾回收演算法。這樣可以不局限與一種垃圾回收演算法。
4. 火車演算法
垃圾收集演算法一個很大的缺點就是難以控制垃圾回收所佔用的CPU時間,以及何時需要進行垃圾回收。火車演算法是分代收集器所用的演算法,目的是在成熟對象空間中提供限定時間的漸進收集。目前應用於SUN公司的Hotspot虛擬機上。
在火車演算法中,內存被分為塊,多個塊組成一個集合。為了形象化,一節車廂代表一個塊,一列火車代表一個集合,見圖一
注意每個車廂大小相等,但每個火車包含的車廂數不一定相等。垃圾收集以車廂為單位,收集順序依次為1.1,1.2,1.3,1.4,2.1,2.2,2.3,3.1,3.2,3.3。這個順序也是塊被創建的先後順序。
垃圾收集器先從塊1.1開始掃描直到1.4,如果火車1四個塊中的所有對象沒有被火車2和火車3的對象引用,而只有火車1內部的對象相互引用,則整個火車1都是垃圾,可以被回收。
如圖二,車廂1.1中有對象A和對象B,1.3中有對象C,1.4中有對象D,車廂2.2中有對象E,車廂3.3中有對象F。在火車1中,對象C引用對象A,對象B引用對象D,可見,火車2和火車3沒有引用火車1的對象,則整個火車1都是垃圾。
如果火車1中有對象被其它火車引用,見圖三,掃描車廂1.1時發現對象A被火車2中的E引用,則將對象A從車廂1.1轉移到車廂2.2,然後掃描A引用的對象D,把D也轉移到車廂2.2,然後掃描D,看D是否引用其它對象,如果引用了其它對象則也要轉移,依次類推。掃描完火車1的所有對象後,剩下的沒有轉移的對象都是垃圾,可以把整個火車1都作為垃圾回收。注意如果在轉移時,如果車廂2.2空間滿了,則要在火車2末尾開辟新的車廂2.4,將新轉移的對象都放到2.4,即火車的尾部)
補充說明:垃圾回收器一次只掃描一個車廂。圖三中的對象B與C並不是立即被回收,而是先會被轉移到火車1的尾部車廂。即掃描完1.1後,B被轉移到火車1尾部,掃描完1.3後,C被轉移到車尾。等垃圾收集器掃描到火車1尾部時,如果仍然沒有外部對象引用它們,則B和C會被收集。
火車演算法最大的好處是它可以保證大的循環結構可以被完全收集,因為成為垃圾的循環結構中的對象,無論多大,都會被移入同一列火車,最終一起被收集。還有一個好處是這種演算法在大多數情況下可以保證一次垃圾收集所耗時間在一定限度之內,因為一次垃圾回收只收集一個車廂,而車廂的大小是有限度的。
④ jdk1.6默認使用哪一種垃圾回收演算法和策略
using parallel threads in the new generation.
using thread-local object allocation.
Concurrent Mark-Sweep GC
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
...
根據這里提到的Conc Mark&Sweep,再查表,可以知道新生代使用的是ParNew GC,老生代使用的是ConcurrentMarkSweep GC。
事實上從表中可以得知新生代和老生代的組合其實是固定的那麼幾種,而且是雙射的,所以只要知道其中一種就能查表得出另外一種。
⑤ 生產中 java 垃圾回收為什麼不用g1
垃圾回收是Java語言的一大特性,方便了編程,是以消耗性能為代價的,Java語言對內存的分配管理是通過JVM內部機制決定的。
Java虛擬機中有個稱之為垃圾回收器的東西,實際上這個東西也許真正不存在,或者是已經集成到JVM中了,但這無關緊要,仍然可以稱為為垃圾回收器。
垃圾回收器的作用是查找和回收(清理)無用的對象。以便讓JVM更有效的使用內存。
垃圾回收器的運行時間是不確定的,由JVM決定,在運行時是間歇執行的。雖然可以通過System.gc()來強制回收垃圾,但是這個命令下達後無法保證JVM會立即響應執行,但經驗表明,下達命令後,會在短期內執行你的請求。JVM通常會感到內存緊缺時候去執行垃圾回收操作。
垃圾回收過於頻繁會導致性能下降,過於稀疏會導致內存緊缺。這個JVM會將其控制到最好,不用程序員擔心。但有些程序在短期會吃掉大量內存,而這些恐怖的對象很快使用結束了,這時候也許有必要強制下達一條垃圾回命令,這是很有必要的,以便有更多可用的物理內存。
垃圾回收器僅僅能做的是盡可能保證可用內存的使用效率,讓可用內存得到高效的管理。程序員可以影響垃圾回收的執行,但不能控制。
總之,在Java語言中,判斷一塊內存空間是否符合垃圾收集器收集標準的標准只有兩個:
1.給對象賦予了空值null,以下再沒有調用過。
2.給對象賦予了新值,既重新分配了內存空間。
⑥ JAVA垃圾回收器如何工作
java回收器有gc
以下是工作原理:
強引用(StrongReference)
這個就不多說,我們寫代碼天天在用的就是強引用。如果一個對象被被人擁有強引用,那麼垃圾回收器絕不會回收它。當內存空間不足,Java 虛擬機寧願拋出 OutOfMemoryError 錯誤,使程序異常終止,也不會靠隨意回收具有強引用的對象來解決內存不足問題。
Java 的對象是位於 heap 中的,heap 中對象有強可及對象、軟可及對象、弱可及對象、虛可及對象和不可到達對象。應用的強弱順序是強、軟、弱、和虛。對於對象是屬於哪種可及的對象,由他的最強的引用決定。如下
代碼:
String abc=newString("abc");//1
SoftReference<String> softRef=newSoftReference<String>(abc);//2
WeakReference<String> weakRef =newWeakReference<String>(abc);//3
abc=null;//4
softRef.clear();//5
第一行在 heap 堆中創建內容為「abc」的對象,並建立 abc 到該對象的強引用,該對象是強可及的。
第二行和第三行分別建立對 heap 中對象的軟引用和弱引用,此時 heap 中的 abc 對象已經有 3 個引用,顯然此時 abc 對象仍是強可及的。
第四行之後 heap 中對象不再是強可及的,變成軟可及的。
第五行執行之後變成弱可及的。
軟引用(SoftReference)
如果一個對象只具有軟引用,那麼如果內存空間足夠,垃圾回收器就不會回收它,如果內存空間不足了,就會回收這些對象的內存。只要垃圾回收器沒有回收它,該對象就可以被程序使用。軟引用可用來實現內存敏感的高速緩存。
軟引用可以和一個引用隊列(ReferenceQueue)聯合使用,如果軟引用所引用的對象被垃圾回收,Java 虛擬機就會把這個軟引用加入到與之關聯的引用隊列中。
軟引用是主要用於內存敏感的高速緩存。在 jvm 報告內存不足之前會清除所有的軟引用,這樣以來 gc 就有可能收集軟可及的對象,可能解決內存吃緊問題,避免內存溢出。什麼時候會被收集取決於 gc 的演算法和 gc 運行時可用內存的大小。當 gc 決定要收集軟引用時執行以下過程,以上面的 softRef 為例:
1 首先將 softRef 的 referent(abc)設置為 null,不再引用 heap 中的 new String("abc")對象。
2 將 heap 中的 new String("abc")對象設置為可結束的(finalizable)。
3 當 heap 中的 new String("abc")對象的 finalize()方法被運行而且該對象佔用的內存被釋放, softRef
被添加到它的 ReferenceQueue(如果有的話)中。
注意:對 ReferenceQueue 軟引用和弱引用可以有可無,但是虛引用必須有。
被 Soft Reference 指到的對象,即使沒有任何 Direct Reference,也不會被清除。一直要到 JVM 內存
不足且沒有 Direct Reference 時才會清除,SoftReference 是用來設計 object-cache 之用的。如此一來
SoftReference 不但可以把對象 cache 起來,也不會造成內存不足的錯誤 (OutOfMemoryError)。
弱引用(WeakReference)
如果一個對象只具有弱引用, 那該類就是可有可無的對象, 因為只要該對象被 gc 掃描到了隨時都會把它幹掉。弱引用與軟引用的區別在於:只具有弱引用的對象擁有更短暫的生命周期。在垃圾回收器線程掃描它所管轄的內存區域的過程中,一旦發現了只具有弱引用的對象,不管當前內存空間足夠與否,都會回收它的內存。不過,由於垃圾回收器是一個優先順序很低的線程, 因此不一定會很快發現那些只具有弱引用的對象。弱引用可以和一個引用隊列(ReferenceQueue)聯合使用,如果弱引用所引用的對象被垃圾回收,Java 虛擬機就會把這個弱引用加入到與之關聯的引用隊列中。
虛引用(PhantomReference)
"虛引用"顧名思義,就是形同虛設,與其他幾種引用都不同,虛引用並不會決定對象的生命周期。如果一個
對象僅持有虛引用,那麼它就和沒有任何引用一樣,在任何時候都可能被垃圾回收。虛引用主要用來跟蹤對象被
垃圾回收的活動。
虛引用與軟引用和弱引用的一個區別在於:虛引用必須和引用隊列(ReferenceQueue)聯合使用。當垃圾回收器准備回收一個對象時,如果發現它還有虛引用,就會在回收對象的內存之前,把這個虛引用加入到與之關聯的引用隊列中。程序可以通過判斷引用隊列中是否已經加入了虛引用,來了解被引用的對象是否將要被垃圾回收。程序如果發現某個虛引用已經被加入到引用隊列,那麼就可以在所引用的對象的內存被回收之前採取必要的行動。
建立虛引用之後通過 get 方法返回結果始終為 null,通過源代碼你會發現,虛引用通向會把引用的對象寫進
referent,只是 get 方法返回結果為 null。先看一下和 gc 交互的過程再說一下他的作用。
1 不把 referent 設置為 null, 直接把 heap 中的 new String("abc")對象設置為可結束的(finalizable)。
2 與軟引用和弱引用不同, 先把 PhantomRefrence 對象添加到它的 ReferenceQueue 中.然後在釋放虛可及的對象。
⑦ java垃圾回收器什麼時候開始回收,等到內存滿了,把沒用的對象回收呢,還是自動回收呢
垃圾回收機制相當於守護進程。
⑧ jdk8中,GC用到的的演算法有哪些
其實垃圾回收演算法就是分代回收,復制演算法和標記整理和標記清除,java8一樣
⑨ Oracle JDK從8以後將會實行收費,那麼你還知道哪些JDK的產品可以作為替代產品
1、jdk有很多版本的,例如還有Microsoft的jdk,還有radhat的jdk ,直接搜索就可以找到對應鏈接。
⑩ 如何查看jvm當前使用的是什麼垃圾回收器
windows: java -XX:+PrintFlagsFinal -version |FINDSTR /i ":"
Linux:java -XX:+PrintFlagsFinal -version | grep :