激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

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

服務(wù)器之家 - 編程語言 - Java教程 - 詳解Java內(nèi)存管理中的JVM垃圾回收

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

2021-05-28 11:55且聆聽風(fēng) Java教程

這篇文章給大家分享了關(guān)于Java內(nèi)存管理中的JVM垃圾回收的相關(guān)知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)參考下。

一.概述

相比起c和c++的自己回收內(nèi)存,java要方便得多,因?yàn)閖vm會(huì)為我們自動(dòng)分配內(nèi)存以及回收內(nèi)存。

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

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

二.java堆垃圾回收

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

而java堆中的垃圾回收可以分為兩個(gè)區(qū)域,一個(gè)是新生代,一個(gè)是老年代。其中新生代又分為一塊比較大的eden空間和兩塊較小的survivor空間。因?yàn)樾律屠夏甏鎯?chǔ)的對象群體是不一樣的,為了在效率和空間碎片問題中取得平衡,新生代和老年代所使用的垃圾回收算法是不一樣。

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

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

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

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

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

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

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

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

首先要明白老年代存放的都是會(huì)存活得比較久的對象,所以如果老年代也使用復(fù)制算法的話,那么復(fù)制對象的開銷時(shí)比較大的,因?yàn)槔夏甏膶ο蠡旧隙紩?huì)存活。

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

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

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

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

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

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

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

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

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

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 久久综合九色 | 久久不雅视频 | xxxx69hd一hd72 | 欧美国产日韩在线观看成人 | 蜜桃传免费看片www 日本一区二区三区视频在线 | 亚洲情av | 亚洲网站免费观看 | 中文字幕亚洲情99在线 | 日韩精品一区二区亚洲 | 欧美一级美国一级 | 性盈盈盈影院 | 国产在线精品一区二区三区不卡 | 免费看日产一区二区三区 | 欧美黄色一区 | 最新中文字幕第一页视频 | 国产精品自拍av | 欧美精品网址 | 在线观看国产免费视频 | 欧美爱爱视频网站 | 在线播放的av网站 | 九九热九九热 | chinese-xvideos| 国产精品一区在线免费观看 | 国产精品久久久久久久久久东京 | 国产午夜精品在线 | 九九热视频在线免费观看 | 色阁五月 | 曰韩黄色片| 日韩精品羞羞答答 | 99精品电影 | 国产精品久久久久久久久久久久午夜 | 女人裸体让男人桶全过程 | 国产一级αv片免费观看 | 免费永久看羞羞片网站入口 | 欧美成人亚洲 | 国产一区二区在线观看视频 | 日本中文字幕久久 | 日本精品一区二区 | 国产色妞影院wwwxxx | 国产精品久久久久久久久久久久午夜 | 看毛片电影|