小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

圖解 Java 垃圾回收機制,寫得非常好!

 鷹兔牛熊眼 2019-08-17

20大進階架構專題每日送達

原文:https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

譯文:https://www.oschina.net/translate/java-gc

翻譯:Rhys_Lee, AzureSora, 溪邊九節(jié), 小小菜鳥雞

什么是自動垃圾回收?

自動垃圾回收是一種在堆內存中找出哪些對象在被使用,還有哪些對象沒被使用,并且將后者刪掉的機制。

所謂使用中的對象(已引用對象),指的是程序中有指針指向的對象;而未使用中的對象(未引用對象),則沒有被任何指針給指向,因此占用的內存也可以被回收掉。

在用 C 之類的編程語言時,程序員需要自己手動分配和釋放內存。而 Java 不一樣,它有垃圾回收器,釋放內存由回收器負責。本文接下來將介紹垃圾回收機制的基本過程。

第一步:標記

垃圾回收的第一步是標記。垃圾回收器此時會找出哪些內存在使用中,還有哪些不是。

上圖中,藍色表示已引用對象,橙色表示未引用對象。垃圾回收器要檢查完所有的對象,才能知道哪些有被引用,哪些沒。如果系統(tǒng)里所有的對象都要檢查,那這一步可能會相當耗時間。關注Java技術棧微信公眾號,回復:JVM46,可以獲取一份超全 JVM 調優(yōu)攻略。

第二步:清除

這一步會刪掉標記出的未引用對象。

內存分配器會保留指向可用內存的引用,以供分配新對象。

壓縮

為了提升性能,刪除了未引用對象后,還可以將剩下的已引用對象放在一起(壓縮),這樣就能更簡單快捷地分配新對象了。

為什么需要分代垃圾收集?

之前說過,逐一標記和壓縮 Java 虛擬機里的所有對象非常低效:分配的對象越多,垃圾回收需時就越久。不過,根據統(tǒng)計,大部分的對象,其實用沒多久就不用了。

來看個例子吧。(下圖中,豎軸代表已分配的字節(jié),而橫軸代表程序運行時間)

上圖可見,存活(沒被釋放)的對象隨運行時間越來越少。而圖中左側的那些峰值,也表明了大部分對象其實都挺短命的。

JVM 分代

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

新對象會被分配在新生代內存。一旦新生代內存滿了,就會開始對死掉的對象,進行所謂的小型垃圾回收過程。一片新生代內存里,死掉的越多,回收過程就越快;至于那些還活著的對象,此時就會老化,并最終老到進入老年代內存。

Stop the World 事件 —— 小型垃圾回收屬于一種叫 'Stop the World' 的事件。在這種事件發(fā)生時,所有的程序線程都要暫停,直到事件完成(比如這里就是完成了所有回收工作)為止。

老年代用來保存長時間存活的對象。通常,設置一個閾值,當達到該年齡時,年輕代對象會被移動到老年代。最終老年代也會被回收。這個事件成為 Major GC。

Major GC 也會觸發(fā)STW(Stop the World)。通常,Major GC會慢很多,因為它涉及到所有存活對象。所以,對于響應性的應用程序,應該盡量避免Major GC。還要注意,Major GC的STW的時長受年老代垃圾回收器類型的影響。

永久代包含JVM用于描述應用程序中類和方法的元數據。永久代是由JVM在運行時根據應用程序使用的類來填充的。此外,Java SE類庫和方法也存儲在這里。

如果JVM發(fā)現某些類不再需要,并且其他類可能需要空間,則這些類可能會被回收。

世代垃圾收集過程

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發(fā)現有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多