成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳解JVM內存布局及GC原理,值得收藏

開發 后端
java發展歷史上出現過很多垃圾回收器,各有各的適應場景,不僅僅是開發,作為運維也需要對這方面有一定的掌握,今天簡單介紹一下java的內存布局以及各種垃圾回收器的原理。

java發展歷史上出現過很多垃圾回收器,各有各的適應場景,不僅僅是開發,作為運維也需要對這方面有一定的掌握,今天簡單介紹一下java的內存布局以及各種垃圾回收器的原理。

JVM內存布局

JVM從概念上大致分為6個(邏輯)區域:

詳解JVM內存布局及GC原理,值得收藏

這6塊區域按是否被線程共享,可以分為兩大類:

詳解JVM內存布局及GC原理,值得收藏

一類是每個線程所獨享的:

  • PC Register:也稱為程序計數器, 記錄每個線程當前執行的指令信。eg:當前執行到哪一條指令,下一條該取哪條指令。
  • JVM Stack:也稱為虛擬機棧,記錄每個棧幀(Frame)中的局部變量、方法返回地址等。
  • Native Method Stack:本地(原生)方法棧,顧名思義就是調用操作系統原生本地方法時,所需要的內存區域。

上述3類區域,生命周期與Thread相同,即:線程創建時,相應的區域分配內存,線程銷毀時,釋放相應內存。

另一類是所有線程共享的:

  • Heap:即鼎鼎大名的堆內存區,也是GC垃圾回收的主站場,用于存放類的實例對象及Arrays實例等。
  • Method Area:方法區,主要存放類結構、類成員定義,static靜態成員等。
  • Runtime Constant Pool:運行時常量池,比如:字符串,int -128~127范圍的值等,它是Method Area中的一部分。

Heap、Method Area 都是在虛擬機啟動時創建,虛擬機退出時釋放。

總之,程序運行時,內存中的信息大致分為兩類,一是跟程序執行邏輯相關的指令數據,這類數據通常不大,而且生命周期短;一是跟對象實例相關的數據,這類數據可能會很大,而且可以被多個線程長時間內反復共用,比如字符串常量、緩存對象這類。

將這兩類特點不同的數據分開管理,體現了軟件設計上“模塊隔離”的思想。好比我們通常會把后端service與前端website解耦類似,也更便于內存管理。

GC垃圾回收原理

1. 哪些內存區域需要GC ?

詳解JVM內存布局及GC原理,值得收藏

thread獨享的區域:PC Regiester、JVM Stack、Native Method Stack,其生命周期都與線程相同(即:與線程共生死),所以無需GC。線程共享的Heap區、Method Area則是GC關注的重點對象。

2. 常用的GC算法

(1) mark-sweep 標記清除法

詳解JVM內存布局及GC原理,值得收藏

如上圖,黑色區域表示待清理的垃圾對象,標記出來后直接清空。該方法簡單快速,但是缺點也很明顯,會產生很多內存碎片。

(2) mark-copy 標記復制法

詳解JVM內存布局及GC原理,值得收藏

思路也很簡單,將內存對半分,總是保留一塊空著(上圖中的右側),將左側存活的對象(淺灰色區域)復制到右側,然后左側全部清空。避免了內存碎片問題,但是內存浪費很嚴重,相當于只能使用50%的內存。

(3) mark-compact 標記-整理(也稱標記-壓縮)法

詳解JVM內存布局及GC原理,值得收藏

避免了上述兩種算法的缺點,將垃圾對象清理掉后,同時將剩下的存活對象進行整理挪動(類似于windows的磁盤碎片整理),保證它們占用的空間連續,這樣就避免了內存碎片問題,但是整理過程也會降低GC的效率。

(4) generation-collect 分代收集算法

上述三種算法,每種都有各自的優缺點,都不完美。在現代JVM中,往往是綜合使用的,經過大量實際分析,發現內存中的對象,大致可以分為兩類:有些生命周期很短,比如一些局部變量/臨時對象,而另一些則會存活很久,典型的比如websocket長連接中的connection對象,如下圖:

詳解JVM內存布局及GC原理,值得收藏

縱向y軸可以理解分配內存的字節數,橫向x軸理解為隨著時間流逝(伴隨著GC),可以發現大部分對象其實相當短命,很少有對象能在GC后活下來。因此誕生了分代的思想,以Hotspot為例(JDK 7):

詳解JVM內存布局及GC原理,值得收藏

將內存分成了三大塊:年青代(Young Genaration),老年代(Old Generation),永久代(Permanent Generation),其中Young Genaration更是又細為分eden,S0,S1三個區。

結合我們經常使用的一些jvm調優參數后,一些參數能影響的各區域內存大小值,示意圖如下:

詳解JVM內存布局及GC原理,值得收藏

GC主要過程

下圖引自阿里出品的《碼出高效-Java開發手冊》一書,梳理了GC的主要過程。

詳解JVM內存布局及GC原理,值得收藏

責任編輯:趙寧寧 來源: 今日頭條
相關推薦

2024-07-31 08:33:17

2023-11-15 16:35:31

SQL數據庫

2019-12-10 08:59:55

JVM內存算法

2022-05-27 08:01:36

JVM內存收集器

2022-11-30 08:17:41

JVM調優技巧

2019-11-27 14:41:50

Java技術語言

2019-09-26 08:59:39

DockerGoogle軟件

2011-03-11 09:41:17

JavaGC

2012-01-11 11:07:04

JavaJVM

2012-01-11 10:45:57

JavaJVM

2010-09-27 13:48:41

JVM內存結構

2010-09-25 12:38:40

JVM內存模型

2020-01-06 10:58:18

JvmGC機制虛擬機

2020-12-18 08:03:00

插件MyBatis Executor

2019-06-12 15:07:24

JVMStackHeap

2010-09-26 10:53:00

JVM內存調優設置

2010-09-26 13:23:13

JVM內存管理機制

2020-09-10 14:52:01

JVMJava算法

2009-07-09 14:01:22

JVM工作原理

2010-09-26 08:50:11

JVM工作原理
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产中文一区二区三区 | 欧美精品被 | 黄色大全免费看 | 欧美日韩电影一区二区 | 91亚洲国产成人久久精品网站 | 嫩草黄色影院 | 国产精品视频偷伦精品视频 | 日本福利一区 | 亚洲最大av | 日韩精品视频在线免费观看 | 99热碰| 日韩欧美中文 | 伊人一区 | 国精产品一区一区三区免费完 | 久久高清免费视频 | 国产精品无码专区在线观看 | 日韩精品四区 | 亚洲视频在线一区 | 欧美一区二区在线观看 | 亚洲国产一区在线 | 中文字幕免费在线观看 | 一区二区三区四区不卡视频 | 国产91网址| 中文字幕日韩欧美一区二区三区 | 欧美日韩综合视频 | 成人中文字幕av | 日韩免费成人av | 伦理午夜电影免费观看 | 毛片视频观看 | 欧美aaa一级片 | 亚洲一区二区三区免费在线观看 | 一区二区三区四区在线播放 | 国产免费一区二区 | 欧美人成在线视频 | 中文字幕一区二区三区乱码图片 | 亚洲免费一区二区 | 日韩在线视频一区 | 精品国产乱码久久久久久久久 | 精品96久久久久久中文字幕无 | 精品久久久久久亚洲综合网 | 日本激情一区二区 |