一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - Java教程 - 詳解Java內存管理中的JVM垃圾回收

詳解Java內存管理中的JVM垃圾回收

2021-05-28 11:55且聆聽風 Java教程

這篇文章給大家分享了關于Java內存管理中的JVM垃圾回收的相關知識點內容,有興趣的朋友們可以學習參考下。

一.概述

相比起c和c++的自己回收內存,java要方便得多,因為jvm會為我們自動分配內存以及回收內存。

在之前的jvm 之內存管理 中,我們介紹了jvm內存管理的幾個區域,其中程序計數器以及虛擬機棧是線程私有的,隨線程而滅,故而它是不用考慮垃圾回收的,因為線程結束其內存空間即釋放。

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

二.java堆垃圾回收

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

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

新生代 -復制算法

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

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

那么為什么會有兩塊survivor呢,復制算法不是只需要一塊eden和一塊survivor就夠了嗎?

其實這主要還是為了解決碎片化的問題。假設只有一個survivor區,當eden區滿的時候,進行gc,存活對象被分配到了survivor區,清空eden區。當再一次gc完成后,存活的對象繼續放在survivor區,這樣不是很美好嗎,不會有內存碎片啊!但是別忘了,第一次存到survivor區的對象很可能在第二次gc的時候就失活了,清理掉survivor失活對象不就會產生內存碎片了嗎?

所以java堆使用了兩個survivor區,一個from survivro和一個tosurvivor,第一次eden滿的時候,復制算法將存活對象放到from survivor區,清空eden。第二次,eden滿時,將eden和from survivor區存活的對象放到to survivor區,清空eden和from survivor,然后重要的一步,將from survivor和to survivor角色互換!這樣就解決了內存碎片化的問題。

詳解Java內存管理中的JVM垃圾回收

老年代 -標記/整理算法

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

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

詳解Java內存管理中的JVM垃圾回收

三.方法區垃圾回收

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

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

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

  • 該類所有的實例都已被回收,即java堆中沒有該類的實例。
  • 加載類的classloader已經被回收。
  • 該類對應的java.lang.class對象沒有在任何地方被引用,無法在任何地方通過反射訪問該類的方法。

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

原文鏈接:https://www.cnblogs.com/listenfwind/p/9540167.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 精品视频入口 | 国产片在线看 | 国产精品视频第一区二区 | 91尤物在线视频 | 糖心vlog麻豆精东影业传媒 | 欧美日韩国产最新一区二区 | 国产成人精品一区二三区在线观看 | 天天排行网 | 九九九九九九精品免费 | 美女奶口隐私免费视频网站 | 小泽玛丽av无码观看 | 91麻豆网址 | 日本视频在线观看 | 日本高清在线观看天码888 | 肉文高h文 | 精品免费久久久久久成人影院 | 亚洲青草 | 俺去啦最新官网 | 日韩精品中文字幕视频一区 | 欧洲vodafone精品性 | 国产精品一区久久精品 | 亚洲免费视频在线观看 | 亚洲精品成人a | 日本高清在线观看天码888 | 国产 国语对白 露脸正在播放 | 亚洲香蕉伊在人在线观婷婷 | 日本一区二区不卡久久入口 | 99久久精品免费看国产一区二区 | 亚洲国产综合久久精品 | 国产91短视频| 亚洲狠狠婷婷综合久久久久网站 | 午夜精品在线视频 | 青青草精品在线观看 | 久久精品亚洲热综合一本 | 国产成人影院一区二区 | 九草在线视频 | 亚洲经典激情春色另类 | 16男男gaygays| 国产精品女主播自在线拍 | 青青草原在线免费 | 亚洲 日本 天堂 国产 在线 |