免费在线a视频-免费在线观看a视频-免费在线观看大片影视大全-免费在线观看的视频-色播丁香-色播基地

面試官問我:談?wù)剬?Java GC 的了解?回答完讓我回家等消息....

:2019年10月25日 程序員知識碼頭
分享到:

作者 | 程序員知識碼頭責(zé)編 | 劉靜出品 | CSDN博客JVM的運(yùn)行數(shù)據(jù)區(qū)首先我簡單來畫一張 JVM的結(jié)構(gòu)原理圖,如下。我們重點(diǎn)關(guān)注 JVM在運(yùn)行時(shí)的數(shù)據(jù)區(qū),你可以看到在程序運(yùn)行時(shí),大致有5個(gè)部分。1.方法...

作者 | 程序員知識碼頭

責(zé)編 | 劉靜

出品 | CSDN博客

JVM的運(yùn)行數(shù)據(jù)區(qū)

首先我簡單來畫一張 JVM的結(jié)構(gòu)原理圖,如下。

我們重點(diǎn)關(guān)注 JVM在運(yùn)行時(shí)的數(shù)據(jù)區(qū),你可以看到在程序運(yùn)行時(shí),大致有5個(gè)部分。

1.方法區(qū)

不止是存“方法”,而是存儲整個(gè) class文件的信息,JVM運(yùn)行時(shí),類加載器子系統(tǒng)將會提取 class文件里面的類信息,并將其存放在方法區(qū)中。例如類的名稱、類的類型(枚舉、類、接口)、字段、方法等等。

2.堆( Heap)

熟習(xí) c/c++編程的同學(xué)們應(yīng)該相當(dāng)熟習(xí) Heap了,而對于Java而言,每個(gè)應(yīng)用都唯一對應(yīng)一個(gè)JVM實(shí)例,而每一個(gè)JVM實(shí)例唯一對應(yīng)一個(gè)堆。堆主要包括關(guān)鍵字 new的對象實(shí)例、 this指針,或者者數(shù)組都放在堆中,并由應(yīng)用所有的線程共享。堆由JVM的自動(dòng)內(nèi)存管理機(jī)制所管理,名為垃圾回收—— GC(garbage collection)。

3.棧( Stack)

操作系統(tǒng)內(nèi)核為某個(gè)進(jìn)程或者者線程建立的存儲區(qū)域,它保存著一個(gè)線程中的方法的調(diào)用狀態(tài),它具備先進(jìn)后出的特性。在棧中的數(shù)據(jù)大小與生命周期嚴(yán)格來說都是確定的,例如在一個(gè)函數(shù)中公告的int變量便是存儲在 stack中,它的大小是固定的,在函數(shù)退出后它的生命周期也從此結(jié)束。在棧中,每一個(gè)方法對應(yīng)一個(gè)棧幀,JVM會對Java棧執(zhí)行兩種操作:壓棧和出棧。這兩種操作在執(zhí)行時(shí)都是以棧幀為單位的。還有少量即時(shí)編譯器編譯后的代碼等數(shù)據(jù)。

4.PC寄存器

pc寄存器用于存放一條指令的地址,每一個(gè)線程都有一個(gè)PC寄存器。

5.本地方法棧

用來調(diào)用其余語言的本地方法,例如 C/C++寫的本地代碼, 這些方法在本地方法棧中執(zhí)行,而不會在Java棧中執(zhí)行。

初識GC

自動(dòng)垃圾回收機(jī)制,簡單來說就是尋覓 Java堆中的無用對象。打個(gè)比如:你的房間是JVM的內(nèi)存,你在房間里生活會制造垃圾和臟亂,而你媽就是 GC(聽起來有點(diǎn)像罵人)。你媽每時(shí)每刻都覺得你房間很臟亂,不時(shí)要把你趕出門打掃房間,假如你媽一直在房間打掃,那么這個(gè)過程你無法繼續(xù)在房間打游戲吃泡面。但假如你一直在房間,你的房間早晚要變成一個(gè)無法居住的豬窩。

那么,怎樣樣回收垃圾比較好呢?我們大致可以想出下面的思路。

Marking

首先,所有堆中的對象都會被掃描一遍:我們總得知道哪些是垃圾,哪些是有用的物品吧。由于垃圾實(shí)在太多了,所以,你媽會把所有的要扔掉的東西都找出來并打上一個(gè)標(biāo)簽,到了時(shí)機(jī)成熟時(shí)回頭來一起解決,這樣她就能解決你不需要的廢物、舊家具,而不是把你喜歡的衣服或者者身份證之類的東西扔掉。

Normal Deletion

垃圾收集器將清理掉標(biāo)記的對象:你媽已經(jīng)整理了一部分雜物(或者者已一律整理完),而后會將他們直接拎出去倒掉。你很開心房間又可以繼續(xù)接受蹂躪了。

Deletion with Compacting

壓縮清理的方法:我們知道,內(nèi)存有空閑,并不代表著我們就能使用它,例如我們要分配數(shù)組這種一段連續(xù)空間,如果內(nèi)存中碎片較多,一定是行不通的。正如房間可能需要再放一個(gè)新的床,但是扔掉舊衣柜后,原來的位置并不能放得下新床,所以需要進(jìn)行空間壓縮,把剩下的家具和物檔次置并到一起,這樣就能騰出更多的空間啦。

有趣的是,JVM并不是使用相似于 objective-c的 ARC(AutomaticReferenceCounting)的方式來引用計(jì)數(shù)對象,而是使用了叫根搜索算法( GC Root)的方法,基本思想就是選定少量對象作為 GC Roots,并組成根對象集合,而后從這些作為 GC Roots的對象作為起始點(diǎn),搜索所走過的引用鏈( ReferenceChain)。假如目標(biāo)對象到 GC Roots是連接著的,我們則稱該目標(biāo)對象是可達(dá)的,假如目標(biāo)對象不可達(dá),則說明目標(biāo)對象是可以被回收的對象。

GC Root使用的算法是相當(dāng)復(fù)雜的,你不必記住里面的所有細(xì)節(jié)。但是你要知道的一點(diǎn)就是,可以作為 GC Root的對象可以主要分為四種。

  • JVM棧中引用的對象;

  • 方法區(qū)中,靜態(tài)屬性引用的對象;

  • 方法區(qū)中,常量引用的對象;

  • 本地方法棧中,JNI(即Native方法)引用的對象。

在 JDK1.2之后,Java將引用分為強(qiáng)引用、軟引用、弱引用、虛引用4種,這4種引用強(qiáng)度依次減弱。

分代與GC機(jī)制

嗯,聽起來這樣即可以了?但是實(shí)際情況下,很不幸,在JVM中絕大部分對象都是英年早逝的,在編碼時(shí)大部分堆中的內(nèi)存都是短暫臨時(shí)分配的,所以無論是效率還是開銷方面,按上面那樣進(jìn)行 GC往往是無法滿足我們需求的。而且,實(shí)際上隨著分配的對象增多, GC的時(shí)間與開銷將會放大。所以,JVM的內(nèi)存被分為了三個(gè)主要部分:新生代,老年代和永久代。

新生代

所有新產(chǎn)生的對象一律都在新生代中, Eden區(qū)保存最新的對象,有兩個(gè) SurvivorSpace—— S1和 S0,三個(gè)區(qū)域的比例大致為 8:1:1。當(dāng)新生代的 Eden區(qū)滿了,將觸發(fā)一次 GC,我們把新生代中的 GC稱為 minor garbage collections。minor garbage collections是一種 Stopthe world事件,比方你媽在打掃時(shí),會把你趕出去,而不是你一邊扔垃圾她一邊打掃。

我們來看下對象在堆中的分配過程,首先有新的對象進(jìn)入時(shí),默認(rèn)放入新生代的 Eden區(qū), S區(qū)都是默認(rèn)為空的。下面對象的數(shù)字代表經(jīng)歷了多少次 GC,也就是對象的年齡。

當(dāng) eden區(qū)滿了,觸發(fā) minor garbage collections,這時(shí)還有被引用的對象,就會被分配到 S0區(qū)域,剩下沒有被引用的對象就都會被清理。

再一次 GC時(shí), S0區(qū)的部分對象很可能會出現(xiàn)沒有引用的,被引用的對象以及 S0中的存活對象,會被一起移動(dòng)到 S1中。eden和 S0中的未引用對象會被一律清理。

接下來就是無限循環(huán)上面的步驟了,當(dāng)新生代中存活的對象超過了肯定的【年齡】,會被分配至老年代的 Tenured區(qū)中。這個(gè)年齡可以通過參數(shù) MaxTenuringThreshold設(shè)定,默認(rèn)值為 15,圖中的例子為 8次。

新生代管理內(nèi)存采用的算法為 GC復(fù)制算法( CopyingGC),也叫標(biāo)記-復(fù)制法,原理是把內(nèi)存分為兩個(gè)空間:一個(gè) From空間,一個(gè) To空間,對象一開始只在 From空間分配, To空間是空閑的。GC時(shí)把存活的對象從 From空間復(fù)制粘貼到 To空間,之后把 To空間變成新的 From空間,原來的 From空間變成 To空間。

首先標(biāo)記不可達(dá)對象。

而后移動(dòng)存活的對象到 to區(qū),并保證他們在內(nèi)存中連續(xù)。

清掃垃圾。

可以看到上圖操作后內(nèi)存幾乎都是連續(xù)的,所以它的效率是非常高的,但是相對的吞吐量會較大。并且,把內(nèi)存一分為二,占用了將近一半的可用內(nèi)存。用一段偽代碼來實(shí)現(xiàn)大致為下。

老年代

老年代用來存儲活時(shí)間較長的對象,老年代區(qū)域的 GC是 major garbage collection,老年代中的內(nèi)存不夠時(shí),就會觸發(fā)一次。這也是一個(gè) Stopthe world事件,但是看名字就知道,這個(gè)回收過程會相當(dāng)慢,由于這包括了對新生代和老年代所有對象的回收,也叫 FullGC。

老年代管理內(nèi)存最早采用的算法為標(biāo)記-清除算法,這個(gè)算法很好了解,結(jié)合 GC Root的定義,我們會把所有不可達(dá)的對象一律標(biāo)記進(jìn)行清理。

在清理前,黃色的為不可達(dá)對象。

在清理后,一律都變成可達(dá)對象。

那么,這個(gè)算法的劣勢很好了解:對,會在標(biāo)記清理的過程中產(chǎn)生大量的內(nèi)存碎片,Java在分配內(nèi)存時(shí)通常是按連續(xù)內(nèi)存分配,這樣我們會白費(fèi)很多內(nèi)存。所以,現(xiàn)在的 JVM GC在老年代都是使用標(biāo)記-壓縮清理方法,將上圖在清理后的內(nèi)存進(jìn)行整理和壓縮,以保證內(nèi)存連續(xù),盡管這個(gè)算法的效率是三種算法里最低的。

永久代

永久代位于方法區(qū),主要存放元數(shù)據(jù),例如 Class、 Method的元信息,與 GC要回收的對象其實(shí)關(guān)系并不是很大,我們可以幾乎忽略其對 GC的影響。除了 JavaHotSpot這種較新的虛擬機(jī)技術(shù),會回收無用的常量和的類,以免大量運(yùn)用反射這類頻繁自己設(shè)置 ClassLoader的操作時(shí)方法區(qū)溢出。

GC收集器與優(yōu)化

一般而言, GC不應(yīng)該成為影響系統(tǒng)性能的瓶頸,我們在評估 GC收集器的優(yōu)劣時(shí)一般考慮以下幾點(diǎn):

  • 吞吐量;

  • GC開銷;

  • 暫停時(shí)間;

  • GC頻率;

  • 堆空間;

  • 對象生命周期。

所以針對不同的 GC收集器,我們要對應(yīng)我們的應(yīng)用場景來進(jìn)行選擇和調(diào)優(yōu),回顧 GC的歷史,主要有 4種 GC收集器: Serial、 Parallel、 CMS和 G1。

Serial

Serial收集器使用了標(biāo)記-復(fù)制的算法,可以用 -XX:+UseSerialGC使用單線程的串行收集器。但是在 GC進(jìn)行時(shí),程序會進(jìn)入長時(shí)間的暫停時(shí)間,一般不太建議使用。

Parallel

-XX:+UseParallelGC-XX:+UseParallelOldGCParallel也使用了標(biāo)記-復(fù)制的算法,但是我們稱之為吞吐量優(yōu)先的收集器,由于 Parallel最主要的優(yōu)勢在于并行使用多線程去完成垃圾清除工作,這樣可以充分利用多核的特性,大幅降低 gc時(shí)間。當(dāng)你的程序場景吞吐量較大,例如消息隊(duì)列這種應(yīng)用,需要保證有效利用 CPU資源,可以忍受肯定的停頓時(shí)間,可以優(yōu)先考慮這種方式。

CMS ( ConcurrentMarkSweep)

-XX:+UseParNewGC-XX:+UseConcMarkSweepGCCMS使用了標(biāo)記-清理的算法,當(dāng)應(yīng)用尤其重視服務(wù)器的響應(yīng)速度(比方 Apiserver),希望系統(tǒng)停頓時(shí)間最短,以給客戶帶來較好的體驗(yàn),那么可以選擇 CMS。CMS收集器在 MinorGC時(shí)會暫停所有的應(yīng)用線程,并以多線程的方式進(jìn)行垃圾回收。在 FullGC時(shí)不暫停應(yīng)用線程,而是使用若干個(gè)后端線程定期的對老年代空間進(jìn)行掃描,及時(shí)回收其中不再使用的對象。

G1( GarbageFirst)

-XX:+UseG1GC 在堆比較大的時(shí)候,假如 full gc頻繁,會導(dǎo)致停頓,并且調(diào)用方阻塞、超時(shí)、甚至雪崩的情況出現(xiàn),所以降低 full gc的發(fā)生頻率和需要時(shí)間,非常有必要。G1的誕生正是為了降低 FullGC的次數(shù),而相較于 CMS, G1使用了標(biāo)記-壓縮清理算法,這可以大大降低較大內(nèi)存( 4GB以上) GC時(shí)產(chǎn)生的內(nèi)存碎片。

G1提供了兩種 GC模式, YoungGC和 MixedGC,兩種都是 StopTheWorld(STW)的。YoungGC主要是對 Eden區(qū)進(jìn)行 GC, MixGC不僅進(jìn)行正常的新生代垃圾收集,同時(shí)也回收部分后端掃描線程標(biāo)記的老年代分區(qū)。

另外有趣的一點(diǎn), G1將新生代、老年代的物理空間劃分取消了,而是將堆劃分為若干個(gè)區(qū)域( region),每個(gè)大小都為 2的倍數(shù)且大小一律一致,最多有 2000個(gè)。除此之外, G1專門劃分了一個(gè) Humongous區(qū),它用來專門存放超過一個(gè) region 50%大小的巨型對象。在正常的解決過程中,對象從一個(gè)區(qū)域復(fù)制到另外一個(gè)區(qū)域,同時(shí)也完成了堆的壓縮。

常用參數(shù)

java虛擬機(jī)中對象的訪問及存放

舉個(gè)實(shí)例Student stu=new Student();

這份代碼中Student stu是一個(gè)引用變量所以存放在java虛擬機(jī)棧上,new Student()是一個(gè)實(shí)例對象存放在java堆上。另外,在Java 堆中還必須包含能查找到此對象類型數(shù)據(jù)(如對象類型、父類、實(shí)現(xiàn)的接口、方法等)的地址信息,這些類型數(shù)據(jù)則存儲在方法區(qū)中。

由于reference 類型在Java 虛擬機(jī)規(guī)范里面只規(guī)定了一個(gè)指向?qū)ο蟮囊茫]有定義這個(gè)引用應(yīng)該通過哪種方式去定位,以及訪問到Java 堆中的對象的具體位置,因此不同虛擬機(jī)實(shí)現(xiàn)的對象訪問方式會有所不同,主流的訪問方式有兩種:使用句柄和直接指針。如果使用句柄訪問方式Java 堆中將會劃分出一塊內(nèi)存來作為句柄池,reference中存儲的就是對象的句柄地址,而句柄中包含了對象實(shí)例數(shù)據(jù)和類型數(shù)據(jù)各自的具體地址信息,如下圖所示。

指針方式

Java 堆對象的布局中就必須考慮如何放置訪問類型

這兩種對象的訪問方式各有優(yōu)勢,使用句柄訪問方式的最大好處就是reference 中存儲的是穩(wěn)定的句柄地址,在對象被移動(dòng)(垃圾收集時(shí)移動(dòng)對象是非常普遍的行為)時(shí)只會改變句柄中的實(shí)例數(shù)據(jù)指針,而引用對象本身不需要被修改。使用直接指針訪問方式的最大好處就是速度更快,它節(jié)省了一次指針定位的時(shí)間開銷,由于對象的訪問在Java 中非常頻繁,因此這類開銷積少成多后也是一項(xiàng)非常可觀的執(zhí)行成本。

結(jié)語

就以這段話自勉、共勉吧。越努力、越幸運(yùn),如果你不是官二代、富二代、紅二代,那么請記住:勤奮才是改變你命運(yùn)的唯一捷徑。

[我要糾錯(cuò)]
文:宋聰喬&發(fā)表于江蘇
關(guān)鍵詞: 作者 nbsp 程序員 知識 碼頭

來源:本文內(nèi)容搜集或轉(zhuǎn)自各大網(wǎng)絡(luò)平臺,并已注明來源、出處,如果轉(zhuǎn)載侵犯您的版權(quán)或非授權(quán)發(fā)布,請聯(lián)系小編,我們會及時(shí)審核處理。
聲明:江蘇教育黃頁對文中觀點(diǎn)保持中立,對所包含內(nèi)容的準(zhǔn)確性、可靠性或者完整性不提供任何明示或暗示的保證,不對文章觀點(diǎn)負(fù)責(zé),僅作分享之用,文章版權(quán)及插圖屬于原作者。

點(diǎn)個(gè)贊
0
踩一腳
0

您在閱讀:面試官問我:談?wù)剬?Java GC 的了解?回答完讓我回家等消息....

Copyright?2013-2024 JSedu114 All Rights Reserved. 江蘇教育信息綜合發(fā)布查詢平臺保留所有權(quán)利

蘇公網(wǎng)安備32010402000125 蘇ICP備14051488號-3技術(shù)支持:南京博盛藍(lán)睿網(wǎng)絡(luò)科技有限公司

南京思必達(dá)教育科技有限公司版權(quán)所有   百度統(tǒng)計(jì)

主站蜘蛛池模板: 99在线精品日韩一区免费国产 | 韩国 欧美 日产 国产精品 | 欧美一区二区二区 | 日韩在线一区二区三区免费视频 | 高清国产美女一级a毛片在线 | 老司机亚洲精品 | 成人18免费视频 | 欧美日本亚洲国产一区二区 | 小黄鸭视频破解版 | 日本边添边摸边做边爱小视频 | 国产99r视频精品免费观看 | 女全身裸无遮挡免费毛片 | 手机在线观看黄色网址 | 一区二区不卡视频在线观看 | 国产成人免费高清视频网址 | 亚洲国产成人久久三区 | 欧美日韩国产手机在线观看视频 | 欧美黄色a | 影音先锋在线亚洲精品推荐 | 一级黄a| 国产va精品免费观看 | 亚洲aaaa级特黄毛片 | 免费看片网址 | 涩涩免费网站 | 97人人揉人人捏人人添 | 天天摸夜添狠狠添高 | 中文字幕在线观看亚洲日韩 | 在线www| 欧美一级片 在线播放 | 日本爽妇网 | 亚洲制服丝袜在线播放 | 精品一区一区三区新区乱码 | 国产hd高清freexxxx| 一级视频在线播放 | 欧美一区二区三区不卡免费观看 | 在线免费中文字幕 | 51毛片| 日本三级在在线观看 | 国产日韩欧美不卡www | 国产黄色大片 | 狠狠色狠狠色综合系列 |
最熱文章
最新文章
  • 阿里云上云鉅惠,云產(chǎn)品享最低成本,有需要聯(lián)系,
  • 卡爾蔡司鏡片優(yōu)惠店,鏡片價(jià)格低
  • 蘋果原裝手機(jī)殼