日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JVM(六)为什么新生代有两个Survivor分区?

發(fā)布時間:2025/3/11 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JVM(六)为什么新生代有两个Survivor分区? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本文會使用排除法的手段,來講解新生代的區(qū)域劃分,從而讓讀者能夠更清晰的理解分代回收器的原理,在開始之前我們先來整體認識一下分代收集器。

分代收集器會把內(nèi)存空間分為:老生代和新生代兩個區(qū)域,而新生代又會分為:Eden 區(qū)和兩個 Survivor區(qū)(From Survivor、To Survivor),來看內(nèi)存空間分布圖,如下:

(圖片來自 fancydeepin)

可以看出 Eden 和 Survivor 分區(qū)的默認比例是 8:1:1,這個值可以通過:–XX:SurvivorRatio 設(shè)定,默認值: –XX:SurvivorRatio=8。

順便說一下,新生代和老生代默認情況下的內(nèi)存占比是 1:2,該值可以通過:-XX:NewRatio 來設(shè)定。

為什么 Survivor 分區(qū)不能是 0 個?

如果 Survivor 是 0 的話,也就是說新生代只有一個 Eden 分區(qū),每次垃圾回收之后,存活的對象都會進入老生代,這樣老生代的內(nèi)存空間很快就被占滿了,從而觸發(fā)最耗時的 Full GC ,顯然這樣的收集器的效率是我們完全不能接受的。

為什么 Survivor 分區(qū)不能是 1 個?

如果 Survivor 分區(qū)是 1 個的話,假設(shè)我們把兩個區(qū)域分為 1:1,那么任何時候都有一半的內(nèi)存空間是閑置的,顯然空間利用率太低不是最佳的方案。

但如果設(shè)置內(nèi)存空間的比例是 8:2 ,只是看起來似乎“很好”,假設(shè)新生代的內(nèi)存為 100 MB( Survivor 大小為 20 MB ),現(xiàn)在有 70 MB 對象進行垃圾回收之后,剩余活躍的對象為 15 MB 進入 Survivor 區(qū),這個時候新生代可用的內(nèi)存空間只剩了 5 MB,這樣很快又要進行垃圾回收操作,顯然這種垃圾回收器最大的問題就在于,需要頻繁進行垃圾回收。

為什么 Survivor 分區(qū)是 2 個?

如果 Survivor 分區(qū)有 2 個分區(qū),我們就可以把 Eden、From Survivor、To Survivor 分區(qū)內(nèi)存比例設(shè)置為 8:1:1 ,那么任何時候新生代內(nèi)存的利用率都 90% ,這樣空間利用率基本是符合預期的。再者就是虛擬機的大部分對象都符合“朝生夕死”的特性,所以每次新對象的產(chǎn)生都在空間占比比較大的 Eden 區(qū),垃圾回收之后再把存活的對象方法存入 Survivor 區(qū),如果是 Survivor 區(qū)存活的對象,那么“年齡”就 +1 ,當年齡增長到 15 (可通過 -XX:+MaxTenuringThreshold 設(shè)定)對象就升級到老生代。

總結(jié)

根據(jù)上面的分析可以得知,當新生代的 Survivor 分區(qū)為 2 個的時候,不論是空間利用率還是程序運行的效率都是最優(yōu)的,所以這也是為什么 Survivor 分區(qū)是 2 個的原因了。

總結(jié)

以上是生活随笔為你收集整理的JVM(六)为什么新生代有两个Survivor分区?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。