最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺析Java中的GC垃圾回收器的意義及與GC的交互

 更新時間:2015年12月27日 17:07:12   作者:爪哇小博  
這篇文章主要介紹了Java中的GC垃圾回收器的意義及與其的交互,GC是Java虛擬機JVM的一項重要特性,需要的朋友可以參考下

對象是使用new創(chuàng)建的,但是并沒有與之相對應(yīng)的delete操作來回收對象占用的內(nèi)存。當(dāng)我們完成對某個對象的使用時,只需停止對該對象的引用:將我們的引用改變?yōu)橹赶蚱渌麑ο蠡蛑赶騨ull;或者從方法中返回,使得該方法的局部變量不復(fù)存在,從而使得對這些局部變量的引用變?yōu)椴恢赶蛉魏螌ο?。不再被引用的對象被稱為垃圾(garbage),查找并回收這些對象的過程叫做垃圾回收(garbage collection) o

  Java虛擬機利用垃圾回收來保證被引用的對象將會在內(nèi)存中保留,同時會釋放在執(zhí)行代碼中通過任何引用都不可達的對象所占用的存儲空間。這是一種強保證—如果順著從根引用(即在執(zhí)行代碼中可以直接訪問的引用)開始的引用鏈可以到達某個對象,那么該對象就不會被回收。

  簡言之,當(dāng)我們從任何可執(zhí)行代碼都無法到達某個對象時,它所占用的空間就可以被回收。注意,我們用的是“可以”這個詞,因為內(nèi)存空間是否回收是由垃圾回收器來決定的,通常情況下,只有需要更多的內(nèi)存空間或者為了避免發(fā)生內(nèi)存溢出時,垃圾回收器才會運行。但是程序可能在沒有發(fā)生內(nèi)存溢出,甚至在沒有接近內(nèi)存溢出的時候就退出了,所以可能根本就不需要執(zhí)行垃圾回收。在當(dāng)前執(zhí)行的所有方法中,如果所有變量都不包含指向某個對象的引用,并且從這些變量出發(fā),順著引用鏈在所有域或數(shù)組元素中也找不到對這個對象的引用,那么我們就說這個對象是“不可達的”。

  垃圾回收意味著我們永遠不必擔(dān)心出現(xiàn)虛懸引用(dangling reference)。在那些可以由程序員直接控制何時刪除對象的系統(tǒng)中,程序員可以刪除某個其他對象還在引用的對象,如果程序員刪除了這樣的對象,那么還在引用被刪除對象的引用就會變?yōu)樘搼业?,因為它們引用的是?/p>

  作系統(tǒng)認為是可分配的內(nèi)存空間(但實際上該空間已經(jīng)被釋放)。系統(tǒng)可以將這個可分配空間分配給新的對象,這樣那些原來指向該空間的引用實際上得到的對象與它們所預(yù)期的就完全不同了。在這種情況下,當(dāng)程序使用存儲于這個空間中的值并將其當(dāng)作它們并不屬于的對象來操作時,就可能會引起不可預(yù)知的災(zāi)難。垃圾回收為我們解決了虛懸引用問題,因為所有仍然被引用的對象都不會被當(dāng)作垃圾回收,所以它們所占用的空間也不可能被釋放。垃圾回收同時還解決了意外地多次刪除同一個對象的問題—這種問題也會引發(fā)災(zāi)難。 垃圾對象的回收并不需要我們的介入,但是回收垃圾會占用一定的系統(tǒng)資源。大量對象的創(chuàng)建和回收對時間關(guān)鍵的應(yīng)用會產(chǎn)生干擾,因此我們在設(shè)計這種系統(tǒng)時,要審慎地處理創(chuàng)建的對象數(shù)量,以便減少要回收的垃圾數(shù)量。

  垃圾回收并不能保證內(nèi)存總是會有空間來創(chuàng)建新對象。例如,如果我們不停地創(chuàng)建對象,并把這些對象置于某個列表中,那么當(dāng)沒有足夠的空間來創(chuàng)建新對象,同時也沒有任何未被引用的對象時,就無法再創(chuàng)建新對象了。如果我們讓上述列表保持對不再需要的對象的引用,那么就會造成內(nèi)存泄漏。垃圾回收解決了很多(但并非全部)的內(nèi)存分配問題。


與垃圾回收器交互
盡管Java語言本身沒有任何顯式地處置空閑對象的方法,我們還是可以通過直接調(diào)用垃圾回收器來尋找不再使用的對象。Runtime類以及system類中的一些便捷方法使得我們可以調(diào)用垃圾回收器,請求運行所有待運行的終結(jié)器,或者查看當(dāng)前的內(nèi)存狀態(tài):

  .public void gc Q:該方法請求Java虛擬機花費精力去回收不再使用的對象,以便能夠重用這些對象所占據(jù)的內(nèi)存。

  .public void runFinalization():該方法請求Java虛擬機花費精力去運行如下的終結(jié)器:那些已經(jīng)被發(fā)現(xiàn)是不可達的,但是其終結(jié)器還未執(zhí)行的對象。

  “public long freememory():返回系統(tǒng)內(nèi)存可用字節(jié)的估測數(shù)。

  ·public long total Memory ():返回系統(tǒng)內(nèi)存的總字節(jié)數(shù)。

  .public long maxmemoryo:返回Java虛擬機可用的系統(tǒng)內(nèi)存的最大字節(jié)數(shù)。如果操作系統(tǒng)對Java虛擬機沒有內(nèi)存使用上的限制,將返回Long . MAX-VALUE. Java中沒有任何用來設(shè)置系統(tǒng)最大內(nèi)存的方法,通常,Java虛擬機是通過命令行或者其他配置選項來設(shè)置這個值的。

  要調(diào)用上述方法,我們需要通過靜態(tài)方法Runtime.getRuntime來獲取對當(dāng)前Runtime對象的引用。而system類支持靜態(tài)的gc和runFinalization方法,它們將調(diào)用當(dāng)前Runt-ime對象上的相應(yīng)方法;換句話說,System.gc()與Runtime.getRuntime().gc()方法是等價的。

  在調(diào)用Runtime.gc()方法時,垃圾回收器可能并不能釋放出任何額外的內(nèi)存,因為可能并沒有垃圾可以回收,而且并非所有的垃圾回收器都可以按需發(fā)現(xiàn)可回收對象。因此調(diào)用垃圾回收器可能不會產(chǎn)生任何效果。然而,在創(chuàng)建大量的對象之前,特別是在垃圾回收的開銷可能會對其造成影響的時間關(guān)鍵的應(yīng)用中,調(diào)用Runtime.gc()方法還是可取的。執(zhí)行它有兩點潛在的好處:第一點是我們在運行應(yīng)用程序之前可以得到盡可能多的內(nèi)存,第二點是我們可以降低執(zhí)行任務(wù)期間垃圾回收器運行的可能性。下面的方法在運行時刻積極地釋放了可以釋放的所有空間:

  public static vo記ful1GC(){

  Runtime rt=Runtime.getRuntime();

  long isFree=rt.freeMemory ();

  long wasFree;

  do{

  wasFree=isFree;

  rt.runFinalization ();

  rt.gc();

  isFree二rt.freeMemory();

  }while (isFree>wasFree);

  }

  該方法在不斷地循環(huán),通過連續(xù)調(diào)用runFinalization和gc方法,freememory的值不斷地增大。當(dāng)空閑內(nèi)存的數(shù)量不再增大時,該方法的循環(huán)也就結(jié)束了。

  我們通常不需要調(diào)用runFinalization方法,因為finalize方法是由垃圾回收器異步調(diào)用的。在某些情況下,例如某項可以由finalize方法回收的資源被耗盡時,通過調(diào)用run-Finalization來強制執(zhí)行盡可能多的終結(jié)才會顯得有用。但是請記住,我們并不能保證任何等待被終結(jié)的對象都在使用這項資源,因此runFinalization可能不會有任何作用。

  fullGc方法對于大多數(shù)應(yīng)用程序來說都顯得過于激進。在需要強制進行垃圾回收的特殊情況下,對system.gc方法的單次調(diào)用所收集到的垃圾即便不是全部的可利用垃圾,也是其中的絕大部分,因此重復(fù)調(diào)用會降低垃圾回收的產(chǎn)出率,而且在許多系統(tǒng)中,這些重復(fù)調(diào)用是毫無產(chǎn)出的。

相關(guān)文章

  • java獲取反射機制的3種方法總結(jié)

    java獲取反射機制的3種方法總結(jié)

    這篇文章主要給大家介紹了關(guān)于java獲取反射機制的3種方法,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • Java數(shù)據(jù)結(jié)構(gòu)之插入排序與希爾排序

    Java數(shù)據(jù)結(jié)構(gòu)之插入排序與希爾排序

    在本篇文章,我們將為小伙伴們進行排序概念的基本講解并具體講解其中的兩種基礎(chǔ)排序:插入排序和希爾排序,希望小伙伴們能夠從中有所收獲
    2023-04-04
  • 關(guān)于SpringSecurity認證邏輯源碼分析

    關(guān)于SpringSecurity認證邏輯源碼分析

    這篇文章主要介紹了關(guān)于SpringSecurity認證邏輯源碼分析,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • SpringBoot配置文件properties和yml的實現(xiàn)

    SpringBoot配置文件properties和yml的實現(xiàn)

    本文主要介紹了SpringBoot配置文件properties和yml的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • 通過實例學(xué)習(xí)Java集合框架HashSet

    通過實例學(xué)習(xí)Java集合框架HashSet

    這篇文章主要介紹了通過實例學(xué)習(xí)Java集合框架HashSet,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • IDEA啟動Springboot報錯:無效的目標發(fā)行版:17 的解決辦法

    IDEA啟動Springboot報錯:無效的目標發(fā)行版:17 的解決辦法

    這篇文章主要給大家介紹了IDEA啟動Springboot報錯:無效的目標發(fā)行版:17 的解決辦法,文中通過代碼示例和圖文講解的非常詳細,對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-02-02
  • Java中ArrayList的removeAll方法詳解

    Java中ArrayList的removeAll方法詳解

    這篇文章主要給大家介紹了關(guān)于Java中ArrayList的removeAll方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面跟著小編一起來看看吧。
    2017-07-07
  • java開啟遠程debug竟有兩種參數(shù)(最新推薦)

    java開啟遠程debug竟有兩種參數(shù)(最新推薦)

    這篇文章主要介紹了java開啟遠程debug竟有兩種參數(shù),本文結(jié)合實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • Springboot詳解如何整合使用Thymeleaf

    Springboot詳解如何整合使用Thymeleaf

    這篇文章主要分享了Spring Boot整合使用Thymeleaf,Thymeleaf是新一代的Java模板引擎,類似于Velocity、FreeMarker等傳統(tǒng)引擎,關(guān)于其更多相關(guān)內(nèi)容,需要的小伙伴可以參考一下
    2022-06-06
  • JAVA設(shè)計模式之備忘錄模式原理與用法詳解

    JAVA設(shè)計模式之備忘錄模式原理與用法詳解

    這篇文章主要介紹了JAVA設(shè)計模式之備忘錄模式,簡單說明了備忘錄模式的概念、原理并結(jié)合實例形式分析了java備忘錄模式的具體定義及使用方法,需要的朋友可以參考下
    2017-08-08

最新評論

贞丰县| 承德市| 四子王旗| 应用必备| 红桥区| 孝感市| 隆昌县| 长武县| 乌什县| 长武县| 田阳县| 罗山县| 娱乐| 乌鲁木齐县| 保德县| 临夏县| 临夏县| 藁城市| 崇礼县| 句容市| 宁蒗| 宜阳县| 吉林市| 平远县| 景宁| 伊春市| 平江县| 灵武市| 寻甸| 沿河| 项城市| 东山县| 民县| 大田县| 隆安县| 独山县| 镇安县| 黑山县| 曲周县| 教育| 镇沅|