国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java 垃圾回收機(jī)制

DoINsiSt / 1246人閱讀

摘要:什么是自動(dòng)垃圾回收自動(dòng)垃圾回收是一種在堆內(nèi)存中找出哪些對(duì)象在被使用,還有哪些對(duì)象沒被使用,并且將后者刪掉的機(jī)制。本文接下來將介紹垃圾回收機(jī)制的基本過程。事件小型垃圾回收屬于一種叫的事件。還要注意,的的時(shí)長(zhǎng)受年老代垃圾回收器類型的影響。

什么是自動(dòng)垃圾回收?
自動(dòng)垃圾回收是一種在堆內(nèi)存中找出哪些對(duì)象在被使用,還有哪些對(duì)象沒被使用,并且將后者刪掉的機(jī)制。
所謂使用中的對(duì)象(已引用對(duì)象),指的是程序中有指針指向的對(duì)象;而未使用中的對(duì)象(未引用對(duì)象),則沒有被任何指針給指向,因此占用的內(nèi)存也可以被回收掉。
在用 C 之類的編程語言時(shí),程序員需要自己手動(dòng)分配和釋放內(nèi)存。而 Java 不一樣,它有垃圾回收器,釋放內(nèi)存由回收器負(fù)責(zé)。本文接下來將介紹垃圾回收機(jī)制的基本過程。
第一步:標(biāo)記
垃圾回收的第一步是標(biāo)記。垃圾回收器此時(shí)會(huì)找出哪些內(nèi)存在使用中,還有哪些不是。

上圖中,藍(lán)色表示已引用對(duì)象,橙色表示未引用對(duì)象。垃圾回收器要檢查完所有的對(duì)象,才能知道哪些有被引用,哪些沒。如果系統(tǒng)里所有的對(duì)象都要檢查,那這一步可能會(huì)相當(dāng)耗時(shí)間。
第二步:清除
這一步會(huì)刪掉標(biāo)記出的未引用對(duì)象。

內(nèi)存分配器會(huì)保留指向可用內(nèi)存的引用,以供分配新對(duì)象。
壓縮
為了提升性能,刪除了未引用對(duì)象后,還可以將剩下的已引用對(duì)象放在一起(壓縮),這樣就能更簡(jiǎn)單快捷地分配新對(duì)象了。

JVM 分代
根據(jù)之前的規(guī)律,就可以用來提升 JVM 的效率了。方法是,把堆分成幾個(gè)部分(就是所謂的分代),分別是新生代、老年代,以及永生代。

新對(duì)象會(huì)被分配在新生代內(nèi)存。一旦新生代內(nèi)存滿了,就會(huì)開始對(duì)死掉的對(duì)象,進(jìn)行所謂的小型垃圾回收過程。一片新生代內(nèi)存里,死掉的越多,回收過程就越快;至于那些還活著的對(duì)象,此時(shí)就會(huì)老化,并最終老到進(jìn)入老年代內(nèi)存。
Stop the World 事件 —— 小型垃圾回收屬于一種叫 "Stop the World" 的事件。在這種事件發(fā)生時(shí),所有的程序線程都要暫停,直到事件完成(比如這里就是完成了所有回收工作)為止。
老年代用來保存長(zhǎng)時(shí)間存活的對(duì)象。通常,設(shè)置一個(gè)閾值,當(dāng)達(dá)到該年齡時(shí),年輕代對(duì)象會(huì)被移動(dòng)到老年代。最終老年代也會(huì)被回收。這個(gè)事件成為 Major GC。
Major GC 也會(huì)觸發(fā)STW(Stop the World)。通常,Major GC會(huì)慢很多,因?yàn)樗婕暗剿写婊顚?duì)象。所以,對(duì)于響應(yīng)性的應(yīng)用程序,應(yīng)該盡量避免Major GC。還要注意,Major GC的STW的時(shí)長(zhǎng)受年老代垃圾回收器類型的影響。
永久代包含JVM用于描述應(yīng)用程序中類和方法的元數(shù)據(jù)。永久代是由JVM在運(yùn)行時(shí)根據(jù)應(yīng)用程序使用的類來填充的。此外,Java SE類庫和方法也存儲(chǔ)在這里。
如果JVM發(fā)現(xiàn)某些類不再需要,并且其他類可能需要空間,則這些類可能會(huì)被回收。
世代垃圾收集過程
首先,將任何新對(duì)象分配給 eden 空間。 兩個(gè) survivor 空間都是空的。

當(dāng) eden 空間填滿時(shí),會(huì)觸發(fā)輕微的垃圾收集。

引用的對(duì)象被移動(dòng)到第一個(gè) survivor 空間。 清除 eden 空間時(shí),將刪除未引用的對(duì)象。

在下一次Minor GC中,Eden區(qū)也會(huì)做同樣的操作。刪除未被引用的對(duì)象,并將被引用的對(duì)象移動(dòng)到Survivor區(qū)。然而,這里,他們被移動(dòng)到了第二個(gè)Survivor區(qū)(S1)。
此外,第一個(gè)Survivor區(qū)(S0)中,在上一次Minor GC幸存的對(duì)象,會(huì)增加年齡,并被移動(dòng)到S1中。待所有幸存對(duì)象都被移動(dòng)到S1后,S0和Eden區(qū)都會(huì)被清空。注意,Survivor區(qū)中有了不同年齡的對(duì)象。

在下一次Minor GC中,會(huì)重復(fù)同樣的操作。不過,這一次Survivor區(qū)會(huì)交換。被引用的對(duì)象移動(dòng)到S0,。幸存的對(duì)象增加年齡。Eden區(qū)和S1被清空。

在較小的GC之后,當(dāng)老化的物體達(dá)到一定的年齡閾值(在該示例中為8)時(shí),它們從年輕一代晉升到老一代。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/75065.html

相關(guān)文章

  • Java 語言概述與開發(fā)環(huán)境

    摘要:一次性編譯成機(jī)器碼,脫離開發(fā)環(huán)境獨(dú)立運(yùn)行,運(yùn)行效率較高。解釋型語言使用專門的解釋器對(duì)源程序逐行解釋成特定平臺(tái)的機(jī)器碼并立即執(zhí)行的語言。垃圾回收機(jī)制保護(hù)程序的完整性,垃圾回收是語言安全性策略的一個(gè)重要部分。 Java程序運(yùn)行機(jī)制 編譯型語言 使用專門的編譯器,針對(duì)特定平臺(tái)(操作系統(tǒng))將某種高級(jí)語言源代碼一次性翻譯成可被該平臺(tái)硬件執(zhí)行的機(jī)器碼(包括機(jī)器指令和操作數(shù)),并包裝成該平臺(tái)所能識(shí)...

    wangshijun 評(píng)論0 收藏0
  • 細(xì)述 Java垃圾回收機(jī)制→Types of Java Garbage Collectors

    摘要:并發(fā)標(biāo)記清除垃圾回收器,使用多個(gè)線程來掃描堆內(nèi)存并標(biāo)記可被清除的對(duì)象,然后清除標(biāo)記的對(duì)象。垃圾回收器應(yīng)用于大的堆內(nèi)存空間。它將堆內(nèi)存空間劃分為不同的區(qū)域,對(duì)各個(gè)區(qū)域并行地做回收工作。它會(huì)通過把重復(fù)的值移動(dòng)到同一個(gè)數(shù)組來優(yōu)化堆內(nèi)存占用。 本文非原創(chuàng),翻譯自Types of Java Garbage Collectors在Java中為對(duì)象分配和釋放內(nèi)存空間都是由垃圾回收線程自動(dòng)執(zhí)行完成的。...

    Julylovin 評(píng)論0 收藏0
  • 細(xì)述 Java垃圾回收機(jī)制→How Java Garbage Collection Works?

    摘要:當(dāng)一個(gè)實(shí)例被創(chuàng)建的時(shí)候,它最初被存放在堆內(nèi)存空間的年輕代的區(qū)中。老年代或者永久代是堆內(nèi)存的第二個(gè)邏輯部分。在垃圾回收過程中掃描屬于部分的堆內(nèi)存。一旦實(shí)例從堆內(nèi)存中刪除了,它們?cè)瓉淼奈恢脤⒖粘鰜斫o以后分配實(shí)例使用。 本文非原創(chuàng),翻譯自How Java Garbage Collection Works?在Java中為對(duì)象分配和釋放內(nèi)存空間都是由垃圾回收線程自動(dòng)執(zhí)行完成的。和C語言不一樣的是...

    cc17 評(píng)論0 收藏0
  • Java 對(duì)象與垃圾回收

    摘要:當(dāng)一個(gè)對(duì)象被一個(gè)或一個(gè)以上的引用變量所引用時(shí),它處于可達(dá)狀態(tài),不可能被系統(tǒng)垃圾回收機(jī)制回收。虛引用主要用于跟蹤對(duì)象被垃圾回收的狀態(tài),虛引用不能單獨(dú)使用,虛引用必須和引用隊(duì)列聯(lián)合使用。 當(dāng)程序創(chuàng)建對(duì)象、數(shù)組等引用類型實(shí)體時(shí),系統(tǒng)都會(huì)在堆內(nèi)存中為之分配一塊內(nèi)存區(qū),對(duì)象就保存在這塊內(nèi)存區(qū)中,當(dāng)這塊內(nèi)存不再被任何引用變量引用時(shí),這塊內(nèi)存就變成垃圾,等待垃圾回收機(jī)制進(jìn)行回收。垃圾回收機(jī)制具有如下...

    booster 評(píng)論0 收藏0
  • 細(xì)述 Java垃圾回收機(jī)制Java Garbage Collection Introduction

    摘要:在架構(gòu)中,堆內(nèi)存和垃圾回收器這兩個(gè)部分和垃圾回收相關(guān)。堆內(nèi)存在的內(nèi)存模型中,最重要的是要了解堆內(nèi)存的概念。在垃圾回收的過程中,這些對(duì)象將被從堆內(nèi)存中清除,同時(shí)它們的空間也就被回收了。 本文非原創(chuàng),翻譯自Java Garbage Collection introduction在Java中為對(duì)象分配和釋放內(nèi)存空間都是由垃圾回收線程自動(dòng)執(zhí)行完成的。和C語言不一樣的是Java程序員不需要手動(dòng)寫...

    codergarden 評(píng)論0 收藏0
  • Java性能優(yōu)化之垃圾回收機(jī)制

    摘要:年輕代的目標(biāo)就是盡可能快速的收集掉那些生命周期短的對(duì)象。年老代在年輕代中經(jīng)歷了次垃圾回收后仍然存活的對(duì)象,就會(huì)被放到年老代中。什么情況下觸發(fā)垃圾回收由于對(duì)象進(jìn)行了分代處理,因此垃圾回收區(qū)域時(shí)間也不一樣。 [TOC] 與C/C++相比,java語言不需要程序員直接控制內(nèi)存回收,java程序的內(nèi)存分配和回收都是由JRE在后臺(tái)自動(dòng)進(jìn)行,JRE會(huì)負(fù)責(zé)回收那些不再使用的內(nèi)存,這種機(jī)制被稱為垃圾...

    philadelphia 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<