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

詳解Java內(nèi)存管理中的JVM垃圾回收

 更新時間:2018年08月27日 09:06:21   作者:且聆聽風(fēng)  
這篇文章給大家分享了關(guān)于Java內(nèi)存管理中的JVM垃圾回收的相關(guān)知識點內(nèi)容,有興趣的朋友們可以學(xué)習(xí)參考下。

一.概述

相比起C和C++的自己回收內(nèi)存,JAVA要方便得多,因為JVM會為我們自動分配內(nèi)存以及回收內(nèi)存。

在之前的JVM 之內(nèi)存管理 中,我們介紹了JVM內(nèi)存管理的幾個區(qū)域,其中程序計數(shù)器以及虛擬機(jī)棧是線程私有的,隨線程而滅,故而它是不用考慮垃圾回收的,因為線程結(jié)束其內(nèi)存空間即釋放。

而JAVA堆和方法區(qū)則不一樣,JAVA堆和方法區(qū)時存放的是對象的實例信息以及對象的其他信息,這部分是垃圾回收的主要地點。

二.JAVA堆垃圾回收

垃圾回收主要考慮的問題有兩個:一個是效率問題,一個是空間碎片問題。

而Java堆中的垃圾回收可以分為兩個區(qū)域,一個是新生代,一個是老年代。其中新生代又分為一塊比較大的Eden空間和兩塊較小的Survivor空間。因為新生代和老年代所存儲的對象群體是不一樣的,為了在效率和空間碎片問題中取得平衡,新生代和老年代所使用的垃圾回收算法是不一樣。

新生代 -復(fù)制算法

從名字上就知道,新生代主要存放的是比較新的對象,回收多次之后仍然存活的對象,就會被送到老年代中區(qū)。由此可知新生代的垃圾回收是比較頻繁的,所以為解決效率問題,新生代使用了復(fù)制算法。復(fù)制算法可以將內(nèi)存分為大小相等的兩塊,每次分配時使用其中一塊,當(dāng)這一塊用完時,就將還存活的對象復(fù)制到另一塊內(nèi)存上面區(qū)。此時已使用過的這一塊內(nèi)存就可以一次清理掉,這樣也不用擔(dān)心內(nèi)存碎片的問題。當(dāng)然這種算法的一個缺點就是內(nèi)存使用率比較低,只有一半(每次只能一半用來分配出去)。

而IBM公司的研究表明,新生代中的對象98%都是”照生夕死“,所以不需要按照1:1劃分,故而會將內(nèi)存分為一塊較大的Eden空間和兩塊小的Survivor空間。

那么為什么會有兩塊Survivor呢,復(fù)制算法不是只需要一塊Eden和一塊Survivor就夠了嗎?

其實這主要還是為了解決碎片化的問題。假設(shè)只有一個Survivor區(qū),當(dāng)Eden區(qū)滿的時候,進(jìn)行Gc,存活對象被分配到了Survivor區(qū),清空Eden區(qū)。當(dāng)再一次Gc完成后,存活的對象繼續(xù)放在Survivor區(qū),這樣不是很美好嗎,不會有內(nèi)存碎片?。〉莿e忘了,第一次存到Survivor區(qū)的對象很可能在第二次Gc的時候就失活了,清理掉Survivor失活對象不就會產(chǎn)生內(nèi)存碎片了嗎?

所以Java堆使用了兩個Survivor區(qū),一個from Survivro和一個toSurvivor,第一次Eden滿的時候,復(fù)制算法將存活對象放到from Survivor區(qū),清空Eden。第二次,Eden滿時,將Eden和from Survivor區(qū)存活的對象放到to Survivor區(qū),清空Eden和from Survivor,然后重要的一步,將from Survivor和to Survivor角色互換!這樣就解決了內(nèi)存碎片化的問題。

老年代 -標(biāo)記/整理算法

首先要明白老年代存放的都是會存活得比較久的對象,所以如果老年代也使用復(fù)制算法的話,那么復(fù)制對象的開銷時比較大的,因為老年代的對象基本上都會存活。

標(biāo)記/整理算法很好理解,主要也就是”標(biāo)記“,”整理“兩個步驟,先將要回收的對象標(biāo)記,然后讓存活對象向著一端移動,最后將邊界以外的內(nèi)存,然后Gc完成。

三.方法區(qū)垃圾回收

在某些地方的解釋中,方法區(qū)也會被叫做“永久代”,與JAVA堆不同,這里存放的是類的信息以及一些常量信息,故而這個區(qū)域中被分配的內(nèi)存一般比較難以被回收,所以才有有”永久代“之名。

雖然方法區(qū)中垃圾回收效率較低,但被分配的內(nèi)存卻也并非真的就永不被回收,其主要回收的有兩部分內(nèi)容:廢棄常量和無用的類。廢棄常量的回收與JAVA堆中類實例回收類似,當(dāng)常量池中一個常量沒有被引用時,就有可能被回收。比如常量池中有一個字符串常量“abc”,當(dāng)沒有任何一個String對象值為"abc"時,那么下一次垃圾回收"abc"常量就有可能會被回收。

而對于無用的類的回收,首先需要判斷什么樣的類才是”無用的類“:

  • 該類所有的實例都已被回收,即JAVA堆中沒有該類的實例。
  • 加載類的ClassLoader已經(jīng)被回收。
  • 該類對應(yīng)的java.lang.Class對象沒有在任何地方被引用,無法在任何地方通過反射訪問該類的方法。

虛擬機(jī)可能會堆滿足這三個條件的”無用的類“進(jìn)行回收,僅僅是可能,并非必然。

相關(guān)文章

  • IDEA提示內(nèi)存不足 low memory的完美解決方法(親測好用)

    IDEA提示內(nèi)存不足 low memory的完美解決方法(親測好用)

    這篇文章主要介紹了IDEA提示內(nèi)存不足 low memory的完美解決方法(親測好用),這里以IDEA2022版本為例,在IDE中 幫助(help)–>change memory setting(改變內(nèi)存設(shè)置),具體設(shè)置辦法文中給大家詳細(xì)講解,需要的朋友可以參考下
    2023-01-01
  • Java中equals方法使用及重寫練習(xí)

    Java中equals方法使用及重寫練習(xí)

    equals是在object類中的方法,在object中equals是用來看看兩個參數(shù)是否引用的是同一個對象,下面這篇文章主要給大家介紹了關(guān)于Java中equals方法使用及重寫練習(xí)的相關(guān)資料,需要的朋友可以參考下
    2023-05-05
  • springboot使用@data注解減少不必要代碼

    springboot使用@data注解減少不必要代碼

    這篇文章主要介紹了springboot使用@data注解減少不必要代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • SpringBoot如何注冊Servlet、Filter、Listener的幾種方式

    SpringBoot如何注冊Servlet、Filter、Listener的幾種方式

    在Servlet 3.0之前都是使用web.xml文件進(jìn)行配置,這篇文章主要介紹了SpringBoot如何注冊Servlet、Filter、Listener的幾種方式,在Servlet 3.0之前都是使用web.xml文件進(jìn)行配置,
    2018-10-10
  • Java通過BCrypt加密過程詳解

    Java通過BCrypt加密過程詳解

    這篇文章主要介紹了Java通過BCrypt加密過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-07-07
  • 解決Spring Boot項目端口8080被占用的問題

    解決Spring Boot項目端口8080被占用的問題

    這篇文章主要介紹了解決Spring Boot項目端口8080被占用的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • java面試LruCache?和?LinkedHashMap及算法實現(xiàn)

    java面試LruCache?和?LinkedHashMap及算法實現(xiàn)

    這篇文章主要為大家介紹了java面試LruCache?和?LinkedHashMap及算法實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Struts2+uploadify多文件上傳實例

    Struts2+uploadify多文件上傳實例

    這篇文章主要為大家詳細(xì)介紹了Struts2+uploadify多文件上傳實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • 淺談java對象的比較

    淺談java對象的比較

    這篇文章主要給大家分享java對象的比較,主要有元素的比較、類的比較及比較的方法,想具體了解的小伙伴和小編一起進(jìn)入下面文章內(nèi)容吧
    2021-10-10
  • Java?toString方法使用超全講解

    Java?toString方法使用超全講解

    在Java中所有的類都有一個共同的父類Object(默認(rèn)繼承,不用加extends關(guān)鍵字),toString方法就是Object類的一個方法,用來返回該對象的字符串表示形式,下面這篇文章主要給大家介紹了關(guān)于Java?toString方法使用的相關(guān)資料,需要的朋友可以參考下
    2023-05-05

最新評論

龙山县| 大姚县| 边坝县| 民权县| 阿克陶县| 齐河县| 都兰县| 登封市| 施甸县| 长海县| 连云港市| 思茅市| 黄龙县| 隆子县| 铜川市| 黔西县| 株洲县| 宁乡县| 丰原市| 云安县| 四会市| 兴国县| 永和县| 鄂温| 张北县| 盐池县| 湘阴县| 五常市| 花莲市| 桃源县| 集贤县| 如东县| 定西市| 浏阳市| 扬州市| 奎屯市| 美姑县| 罗源县| 苏尼特右旗| 彭州市| 太仆寺旗|