日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

快速了解JAVA垃圾回收機制

瀏覽:19日期:2022-08-31 17:48:27

說到垃圾回收(Garbage Collection,GC),很多人就會自然而然地把它和Java聯系起來。在Java中,程序員不需要去關心內存動態分配和垃圾回收的問題,這一切都交給了JVM來處理。顧名思義,垃圾回收就是釋放垃圾占用的空間,那么在Java中,什么樣的對象會被認定為“垃圾”?那么當一些對象被確定為垃圾之后,采用什么樣的策略來進行回收(釋放空間)?在目前的商業虛擬機中,有哪些典型的垃圾收集器?下面我們就來逐一探討這些問題。以下是本文的目錄大綱:

如果有不正之處,希望諒解和批評指正,不勝感激。 

一.如何確定某個對象是“垃圾”?

在這一小節我們先了解一個最基本的問題:如果確定某個對象是“垃圾”?既然垃圾收集器的任務是回收垃圾對象所占的空間供新的對象使用,那么垃圾收集器如何確定某個對象是“垃圾”?—即通過什么方法判斷一個對象可以被回收了。

在java中是通過引用來和對象進行關聯的,也就是說如果要操作對象,必須通過引用來進行。那么很顯然一個簡單的辦法就是通過引用計數來判斷一個對象是否可以被回收。不失一般性,如果一個對象沒有任何引用與之關聯,則說明該對象基本不太可能在其他地方被使用到,那么這個對象就成為可被回收的對象了。這種方式成為引用計數法。

這種方式的特點是實現簡單,而且效率較高,但是它無法解決循環引用的問題,因此在Java中并沒有采用這種方式(Python采用的是引用計數法)。看下面這段代碼:

public class Main { public static void main(String[] args) { MyObject object1 = new MyObject(); MyObject object2 = new MyObject(); object1.object = object2; object2.object = object1; object1 = null; object2 = null; }}class MyObject{ public Object object = null;}

最后面兩句將object1和object2賦值為null,也就是說object1和object2指向的對象已經不可能再被訪問,但是由于它們互相引用對方,導致它們的引用計數都不為0,那么垃圾收集器就永遠不會回收它們。

為了解決這個問題,在Java中采取了 可達性分析法。該方法的基本思想是通過一系列的“GC Roots”對象作為起點進行搜索,如果在“GC Roots”和一個對象之間沒有可達路徑,則稱該對象是不可達的,不過要注意的是被判定為不可達的對象不一定就會成為可回收對象。被判定為不可達的對象要成為可回收對象必須至少經歷兩次標記過程,如果在這兩次標記過程中仍然沒有逃脫成為可回收對象的可能性,則基本上就真的成為可回收對象了。

至于可達性分析法具體是如何操作的我暫時也沒有看得很明白,如果有哪位朋友比較清楚的話請不吝指教。

下面來看個例子:

Object aobj = new Object ( ) ;Object bobj = new Object ( ) ;Object cobj = new Object ( ) ;aobj = bobj;aobj = cobj;cobj = null;aobj = null;

第幾行有可能會使得某個對象成為可回收對象?第7行的代碼會導致有對象會成為可回收對象。至于為什么留給讀者自己思考。

再看一個例子:

String str = new String('hello');SoftReference<String> sr = new SoftReference<String>(new String('java'));WeakReference<String> wr = new WeakReference<String>(new String('world'));

這三句哪句會使得String對象成為可回收對象?第2句和第3句,第2句在內存不足的情況下會將String對象判定為可回收對象,第3句無論什么情況下String對象都會被判定為可回收對象。

最后總結一下平常遇到的比較常見的將對象判定為可回收對象的情況:

(1) 顯示地將某個引用賦值為null或者將已經指向某個對象的引用指向新的對象,比如下面的代碼:

Object obj = new Object();obj = null;Object obj1 = new Object();Object obj2 = new Object();obj1 = obj2;

(2) 局部引用所指向的對象,比如下面這段代碼:

void fun() {..... for(int i=0;i<10;i++) { Object obj = new Object(); System.out.println(obj.getClass()); } }

(3) 只有弱引用與其關聯的對象,比如:

WeakReference<String> wr = new WeakReference<String>(new String('world'));二.典型的垃圾收集算法

在確定了哪些垃圾可以被回收后,垃圾收集器要做的事情就是開始進行垃圾回收,但是這里面涉及到一個問題是:如何高效地進行垃圾回收。由于Java虛擬機規范并沒有對如何實現垃圾收集器做出明確的規定,因此各個廠商的虛擬機可以采用不同的方式來實現垃圾收集器,所以在此只討論幾種常見的垃圾收集算法的核心思想。

1.Mark-Sweep(標記-清除)算法

這是最基礎的垃圾回收算法,之所以說它是最基礎的是因為它最容易實現,思想也是最簡單的。標記-清除算法分為兩個階段:標記階段和清除階段。標記階段的任務是標記出所有需要被回收的對象,清除階段就是回收被標記的對象所占用的空間。具體過程如下圖所示:

快速了解JAVA垃圾回收機制

從圖中可以很容易看出標記-清除算法實現起來比較容易,但是有一個比較嚴重的問題就是容易產生內存碎片,碎片太多可能會導致后續過程中需要為大對象分配空間時無法找到足夠的空間而提前觸發新的一次垃圾收集動作。

2.Copying(復制)算法

為了解決Mark-Sweep算法的缺陷,Copying算法就被提了出來。它將可用內存按容量劃分為大小相等的兩塊,每次只使用其中的一塊。當這一塊的內存用完了,就將還存活著的對象復制到另外一塊上面,然后再把已使用的內存空間一次清理掉,這樣一來就不容易出現內存碎片的問題。具體過程如下圖所示:

快速了解JAVA垃圾回收機制

這種算法雖然實現簡單,運行高效且不容易產生內存碎片,但是卻對內存空間的使用做出了高昂的代價,因為能夠使用的內存縮減到原來的一半。

很顯然,Copying算法的效率跟存活對象的數目多少有很大的關系,如果存活對象很多,那么Copying算法的效率將會大大降低。

3.Mark-Compact(標記-整理)算法

為了解決Copying算法的缺陷,充分利用內存空間,提出了Mark-Compact算法。該算法標記階段和Mark-Sweep一樣,但是在完成標記之后,它不是直接清理可回收對象,而是將存活對象都向一端移動,然后清理掉端邊界以外的內存。具體過程如下圖所示:

快速了解JAVA垃圾回收機制

4.Generational Collection(分代收集)算法

分代收集算法是目前大部分JVM的垃圾收集器采用的算法。它的核心思想是根據對象存活的生命周期將內存劃分為若干個不同的區域。一般情況下將堆區劃分為老年代(Tenured Generation)和新生代(Young Generation),老年代的特點是每次垃圾收集時只有少量對象需要被回收,而新生代的特點是每次垃圾回收時都有大量的對象需要被回收,那么就可以根據不同代的特點采取最適合的收集算法。

目前大部分垃圾收集器對于新生代都采取Copying算法,因為新生代中每次垃圾回收都要回收大部分對象,也就是說需要復制的操作次數較少,但是實際中并不是按照1:1的比例來劃分新生代的空間的,一般來說是將新生代劃分為一塊較大的Eden空間和兩塊較小的Survivor空間,每次使用Eden空間和其中的一塊Survivor空間,當進行回收時,將Eden和Survivor中還存活的對象復制到另一塊Survivor空間中,然后清理掉Eden和剛才使用過的Survivor空間。

而由于老年代的特點是每次回收都只回收少量對象,一般使用的是Mark-Compact算法。

注意,在堆區之外還有一個代就是永久代(Permanet Generation),它用來存儲class類、常量、方法描述等。對永久代的回收主要回收兩部分內容:廢棄常量和無用的類。

三.典型的垃圾收集器

垃圾收集算法是 內存回收的理論基礎,而垃圾收集器就是內存回收的具體實現。下面介紹一下HotSpot(JDK 7)虛擬機提供的幾種垃圾收集器,用戶可以根據自己的需求組合出各個年代使用的收集器。

1.Serial/Serial Old

Serial/Serial Old收集器是最基本最古老的收集器,它是一個單線程收集器,并且在它進行垃圾收集時,必須暫停所有用戶線程。Serial收集器是針對新生代的收集器,采用的是Copying算法,Serial Old收集器是針對老年代的收集器,采用的是Mark-Compact算法。它的優點是實現簡單高效,但是缺點是會給用戶帶來停頓。

2.ParNew

ParNew收集器是Serial收集器的多線程版本,使用多個線程進行垃圾收集。

3.Parallel Scavenge

Parallel Scavenge收集器是一個新生代的多線程收集器(并行收集器),它在回收期間不需要暫停其他用戶線程,其采用的是Copying算法,該收集器與前兩個收集器有所不同,它主要是為了達到一個可控的吞吐量。

4.Parallel Old

Parallel Old是Parallel Scavenge收集器的老年代版本(并行收集器),使用多線程和Mark-Compact算法。

5.CMS

CMS(Current Mark Sweep)收集器是一種以獲取最短回收停頓時間為目標的收集器,它是一種并發收集器,采用的是Mark-Sweep算法。

6.G1

G1收集器是當今收集器技術發展最前沿的成果,它是一款面向服務端應用的收集器,它能充分利用多CPU、多核環境。因此它是一款并行與并發收集器,并且它能建立可預測的停頓時間模型。

下面補充一下關于內存分配方面的東西:

快速了解JAVA垃圾回收機制

對象的內存分配,往大方向上講就是在堆上分配,對象主要分配在新生代的Eden Space和From Space,少數情況下會直接分配在老年代。如果新生代的Eden Space和From Space的空間不足,則會發起一次GC,如果進行了GC之后,Eden Space和From Space能夠容納該對象就放在Eden Space和From Space。在GC的過程中,會將Eden Space和From Space中的存活對象移動到To Space,然后將Eden Space和From Space進行清理。如果在清理的過程中,To Space無法足夠來存儲某個對象,就會將該對象移動到老年代中。在進行了GC之后,使用的便是Eden space和To Space了,下次GC時會將存活對象復制到From Space,如此反復循環。當對象在Survivor區躲過一次GC的話,其對象年齡便會加1,默認情況下,如果對象年齡達到15歲,就會移動到老年代中。

一般來說,大對象會被直接分配到老年代,所謂的大對象是指需要大量連續存儲空間的對象,最常見的一種大對象就是大數組,比如:byte[] data = new byte[410241024]

這種一般會直接在老年代分配存儲空間。

當然分配的規則并不是百分之百固定的,這要取決于當前使用的是哪種垃圾收集器組合和JVM的相關參數。

以上就是快速了解JAVA垃圾回收機制的詳細內容,更多關于Java垃圾回收機制的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
蜜臀久久99精品久久久久宅男| 亚洲精品成人| 一区二区三区午夜视频| 久久亚洲专区| 尤物tv在线精品| 99久精品视频在线观看视频| 久久男人天堂| 日韩成人亚洲| 精品三级久久| 精品国产午夜肉伦伦影院| 亚洲精品乱码久久久久久蜜桃麻豆| 日韩视频精品在线观看| 国产亚洲高清视频| 婷婷综合福利| 久久99精品久久久野外观看| 欧美a级一区二区| 日韩一区电影| 午夜一级久久| 日韩精品一区二区三区免费视频 | 精品一区不卡| 欧美精选视频一区二区| 亚洲成人不卡| 99国产精品| 夜夜精品视频| 国产乱人伦丫前精品视频| 精品国产亚洲一区二区三区大结局| 理论片午夜视频在线观看| 免费精品国产的网站免费观看| 爽好久久久欧美精品| 久久99久久久精品欧美| 国产精品久久久久av电视剧| 视频在线观看国产精品| 国产精品久久久网站| 99久精品视频在线观看视频| 日韩在线一区二区| 久久97久久97精品免视看秋霞| 人人草在线视频| 日韩午夜视频在线| 国产午夜久久av| 国产视频一区三区| 精品国产精品久久一区免费式| 婷婷综合社区| av高清不卡| 国产精品综合色区在线观看| 欧美日韩国产高清电影| 亚洲午夜黄色| 婷婷成人在线| 久久不卡国产精品一区二区| 色在线视频观看| 国产高清一区| 伊人久久大香伊蕉在人线观看热v| 欧美日韩在线精品一区二区三区激情综合| 精品一区视频| 欧美一区影院| 91一区二区三区四区| 国产欧美激情| 日韩欧美激情| 欧美一级专区| 欧洲毛片在线视频免费观看| 免费看久久久| 亚洲一区欧美| 国产精品大片| av中文资源在线资源免费观看| 99久久久久久中文字幕一区| 国产精品久久久久久久久久久久久久久| 日韩精品欧美激情一区二区| 国产精品黄网站| 亚洲精品麻豆| 日韩国产欧美| 一区二区三区国产盗摄| 美女视频黄 久久| 日本一区二区三区中文字幕| 亚洲播播91| 国产日产精品_国产精品毛片| 欧美视频一区| 欧美一区激情| 日韩精品一级二级 | 精品中国亚洲| 快she精品国产999| 97国产精品| 综合国产在线| 国产亚洲在线| 亚洲欧洲另类| 亚洲欧美日韩高清在线| 99久久婷婷这里只有精品| 亚洲www啪成人一区二区| 成人亚洲精品| 精品国产亚洲一区二区在线观看| 欧美片网站免费| 国产乱码精品一区二区亚洲| 中文字幕亚洲影视| 在线亚洲观看| 视频在线观看一区二区三区| 久久99伊人| 日本欧洲一区二区| 亚洲精品91| 宅男噜噜噜66国产日韩在线观看| 亚洲a成人v| 国产精品日韩精品中文字幕| 国产欧美69| 久久久久久夜| 国产综合婷婷| 亚洲免费精品| 日韩福利视频网| 美女视频黄免费的久久| 精品精品久久| 偷拍欧美精品| 欧美一区不卡| 亚洲少妇在线| 91成人在线| 麻豆精品在线视频| 亚洲成人精品| 婷婷亚洲精品| 精品一区二区三区在线观看视频 | 蜜臀av性久久久久蜜臀aⅴ四虎| 免费精品视频| 久久精品国产精品亚洲毛片| 91精品一区二区三区综合| 亚洲一区国产| 国产一区不卡| 亚洲三级毛片| 日本综合精品一区| 蜜臀av国产精品久久久久 | av最新在线| 综合一区av| 精品视频一区二区三区在线观看 | 亚洲中字黄色| 精品高清久久| 日韩亚洲国产欧美| 国产精品亚洲片在线播放| 亚洲天堂久久| 荡女精品导航| 亚洲精品伊人| 蜜臀av免费一区二区三区| 九九精品调教| 欧美午夜精彩| caoporn视频在线| 欧美午夜三级| 日韩高清在线不卡| 亚洲神马久久| 99久精品视频在线观看视频| 精品欧美日韩精品| 国产精品一站二站| 亚洲伊人精品酒店| 亚洲欧美伊人| 成人久久久久| 自拍日韩欧美| 婷婷综合社区| 久久精品导航| 久久精品高清| 亚洲91视频| 一区在线免费观看| 亚洲一区欧美二区| 制服诱惑一区二区| 亚洲一区中文| 国产精品丝袜xxxxxxx| 久久国产视频网| 国产亚洲精品美女久久久久久久久久| 婷婷激情久久| 在线国产一区二区| 欧美一级专区| 日韩和欧美一区二区| 日韩有码av| 久久精品国产免费| 91日韩欧美| 欧美福利在线| 中文不卡在线| 国产成人精品三级高清久久91| 福利一区二区三区视频在线观看| 福利精品一区| 亚洲欧洲一区| 国产伦理久久久久久妇女| 中文在线а√天堂| 久久天堂av| 亚洲一区日韩在线| 日韩一区二区三区精品| 国产麻豆一区二区三区| 欧美在线资源| 国产精品一区二区av交换| 成人欧美一区二区三区的电影| 婷婷激情图片久久| 欧美精品国产一区| 久久人人精品| 久久国产婷婷国产香蕉| 日韩不卡免费高清视频| 五月激激激综合网色播| 色婷婷综合网| 91亚洲无吗| 91精品婷婷色在线观看| 日本中文字幕一区二区视频 | 亚洲免费影视| 欧美激情aⅴ一区二区三区| 极品日韩av| 国产一区二区三区久久| 中文精品视频| 日韩精品一区二区三区免费观影| 日本不卡视频一二三区| 亚洲调教视频在线观看| 久久av导航| 国产激情久久|