<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Java生產(chǎn)環(huán)境JVM設(shè)置成固定堆大小深層原理

        可能很多人都知道Java程序上生產(chǎn)后,運(yùn)維人員都會(huì)設(shè)定好JVM的堆大小,而且還是把最大最小設(shè)置成一樣的值。那究竟是為什么呢?一般而言,Java程序如果你不顯示設(shè)定該值得話,會(huì)自動(dòng)進(jìn)行初始化設(shè)定。
        -Xmx 的默認(rèn)值為你當(dāng)前機(jī)器最大內(nèi)存的 1/4
        -Xms 的默認(rèn)值為你當(dāng)前機(jī)器最大內(nèi)存的 1/64 
        顯然這樣配置的意義是希望JVM可以根據(jù)當(dāng)前運(yùn)行的環(huán)境,動(dòng)態(tài)伸縮堆內(nèi)存大小。之所以生產(chǎn)上設(shè)置成固定大小,網(wǎng)上也是說法不一,很多時(shí)候都是使用“防止內(nèi)存抖動(dòng)”這樣的模糊詞語給出解釋。但是我相信各位讀者也很懵,不知道這個(gè)詞具體表達(dá)什么含義。
        所以接下來我打算用這篇文章來著重解釋一下這其中的門道。帶大家徹底弄懂設(shè)置固定大小堆的底層原理和好處。為了能順利看懂本文,我假設(shè)你們已經(jīng)具備了一定的操作系統(tǒng)基礎(chǔ)知識(shí)。
      最大堆或最小堆,從字面上理解就是JVM在運(yùn)行Java程序時(shí),為其分配堆內(nèi)存空間的上限和下限值。我們把最大和最小堆設(shè)置成相同值那意思就是分配了固定大小的內(nèi)存唄。這樣不就省去了動(dòng)態(tài)調(diào)整內(nèi)存(申請(qǐng)和釋放)以及頻繁的用戶態(tài)和內(nèi)核態(tài)的切換帶來的開銷嗎?。如下圖所示。
        看上去就是這么回事,簡(jiǎn)單明了。然而當(dāng)我們嘗試去做個(gè)模擬實(shí)驗(yàn),事實(shí)卻并非如此。比如,隨便寫個(gè)Java程序,使用如下命令啟動(dòng)之。并設(shè)置好固定大小堆為1G。
        java -Xmx1024m -Xms1024m -jar demo.jar
        然后我們通過查看進(jìn)程的內(nèi)存占用時(shí),發(fā)現(xiàn)程序并沒有占用1G的空間,而是很小的占用。這個(gè)實(shí)驗(yàn)結(jié)果和我們預(yù)期的完全不一致。究竟是什么原因呢?
        問題其實(shí)出在我們對(duì)內(nèi)存模型的理解上有問題。很多人可能都是像上面圖中那樣理解程序分配內(nèi)存的。實(shí)際上是不對(duì)的,且也更復(fù)雜。首先我們要理解一個(gè)重要概念,那就是“進(jìn)程的虛擬地址空間”,我們用戶程序通過malloc這個(gè)系統(tǒng)調(diào)用申請(qǐng)內(nèi)存,實(shí)際上就是申請(qǐng)了一個(gè)虛擬的內(nèi)存,并不是真正的物理內(nèi)存。大家要注意,這個(gè)虛擬的內(nèi)存就是指“進(jìn)程的虛擬地址空間”,而不是我們通常理解的Windows下的虛擬內(nèi)存或Linux下的swap(分區(qū)交換)。如下圖所示。
        用戶程序申請(qǐng)的虛擬內(nèi)存(虛擬地址空間),也就是通過malloc系統(tǒng)調(diào)用,本質(zhì)就是在進(jìn)程的虛擬地址空間里分配了一塊地址范圍而已。32位系統(tǒng)理論上最大4G,每個(gè)進(jìn)程都有自己的虛擬地址空間,都能申請(qǐng)到最大4G內(nèi)存。但是申請(qǐng)了的內(nèi)存,如果沒有實(shí)際使用(寫入數(shù)據(jù)),則操作系統(tǒng)不會(huì)給這塊虛擬空間分配實(shí)際的物理內(nèi)存。其實(shí)原因很簡(jiǎn)單,物理內(nèi)存一直屬于緊缺資源,所以現(xiàn)代操作系統(tǒng)都設(shè)計(jì)為由內(nèi)核程序統(tǒng)一管理,用戶程序無權(quán)直接干涉。不是說你申請(qǐng)多少就真的給你多少,而是你實(shí)際使用多少才會(huì)給你多少。
        回到上面那個(gè)小實(shí)驗(yàn),你發(fā)現(xiàn)啟動(dòng)后程序內(nèi)存占用很小就是這個(gè)原因。盡管JVM已經(jīng)在你啟動(dòng)時(shí)向系統(tǒng)申請(qǐng)了1G的固定堆大小空間。但是由于你這個(gè)程序只是一個(gè)簡(jiǎn)單的測(cè)試,里面并沒有實(shí)際的代碼操作業(yè)務(wù)。所以你實(shí)際上只用到了很小的物理內(nèi)存空間。但是如果你的程序真有業(yè)務(wù)邏輯,隨著系統(tǒng)的運(yùn)行,實(shí)際占用物理內(nèi)存就會(huì)越來越多,直到達(dá)到申請(qǐng)的上限值1G。運(yùn)行期間,你的程序同時(shí)也會(huì)釋放一些對(duì)象(通過GC),并在適當(dāng)?shù)臅r(shí)機(jī)歸還一些物理內(nèi)存給操作系統(tǒng)。所以占用的物理內(nèi)存大小,也會(huì)動(dòng)態(tài)有所調(diào)整。這樣操作系統(tǒng)就可以給其他程序使用,提高了內(nèi)存利用效率。這樣的設(shè)計(jì)也沒什么不好的。
        如上圖所示,操作系統(tǒng)對(duì)內(nèi)存管理是以頁為基本單位的,一個(gè)頁代表了一個(gè)固定大小的地址范圍。用戶程序給某個(gè)變量比如byte[]賦值時(shí),此時(shí)該變量對(duì)應(yīng)的進(jìn)程虛擬地址空間所在的頁在物理內(nèi)存上找不到對(duì)應(yīng)的頁映射時(shí),就會(huì)觸發(fā)了一個(gè)缺頁中斷異常,操作系統(tǒng)就會(huì)重新將虛擬地址的頁映射到物理內(nèi)存中的頁,此時(shí)才是真正實(shí)現(xiàn)了內(nèi)存分配,會(huì)占用實(shí)際的物理內(nèi)存空間。假如Java程序的GC把這個(gè)byte[]變量收回了,也就是不需要占用內(nèi)存空間了,用戶進(jìn)程的堆管理器會(huì)適當(dāng)?shù)臍w還一些物理內(nèi)存給操作系統(tǒng),以便下次可以給其他任何程序使用。需要注意的是用戶程序調(diào)用的malloc和free兩個(gè)系統(tǒng)調(diào)用,都是針對(duì)用戶進(jìn)程的虛擬地址空間而言的,并不是實(shí)際操作物理內(nèi)存。只有操作系統(tǒng)才擁有對(duì)實(shí)際物理內(nèi)存的管理權(quán)限。操作系統(tǒng)可以使用有效的各種算法,來獨(dú)立高效的管理物理內(nèi)存。這里面的細(xì)節(jié),我這里不詳細(xì)說了,有興趣的可以去看些操作系統(tǒng)的資料深入了解下。
        然而我們實(shí)際的Java程序,配置成固定堆大小后,你會(huì)發(fā)現(xiàn),內(nèi)存占用一旦上去了就下不來了。即使當(dāng)前程序處于比較空閑的狀態(tài)下。這又是為什么呢?難道Java的GC沒有回收內(nèi)存?
        其實(shí)并不是GC沒有回收內(nèi)存,而是我們這里存在理解問題。GC回收內(nèi)存并不是指物理內(nèi)存,而是指當(dāng)前進(jìn)程的虛擬內(nèi)存(虛擬地址空間)。一般而言,回收的虛擬內(nèi)存并不會(huì)立即歸還給操作系統(tǒng),從而操作系統(tǒng)也就無法回收它了。至于何時(shí)歸還物理內(nèi)存,這取決于一個(gè)叫g(shù)libc的堆管理器。它根據(jù)一定的策略和算法適當(dāng)?shù)尼尫耪鎸?shí)的物理內(nèi)存。否則即便Java程序GC了對(duì)象,該對(duì)象占用的物理內(nèi)存也不會(huì)立即釋放出來。由于這里我們是設(shè)置了固定大小的堆空間,實(shí)際上GC回收的虛擬內(nèi)存,也不會(huì)被釋放歸還給操作系統(tǒng)。故Java進(jìn)程內(nèi)存占用一旦增長(zhǎng),內(nèi)存占用幾乎都不會(huì)再下降了,這樣也是出于對(duì)象再分配的效率考慮的。這樣顯然可以避免操作系統(tǒng)反復(fù)把進(jìn)程的虛擬地址頁復(fù)映射物理內(nèi)存頁(缺頁中斷異常)操作,導(dǎo)致頻繁的用戶態(tài)和內(nèi)核態(tài)切換造成的性能問題。
       

      posted @ 2021-11-28 15:57  月光冷鋒  閱讀(2776)  評(píng)論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 国产精品久久久国产盗摄| 亚洲中文字幕无码专区| 午夜福利看片在线观看| 亚洲av色综合久久综合| 人人爽人人爽人人片a免费| 国产精品天堂蜜av在线播放| 国产精品一亚洲av日韩| 永久免费av无码网站直播| 亚洲成a人无码av波多野| 日韩加勒比一本无码精品| 成人午夜视频一区二区无码| 国产性生大片免费观看性| 亚洲自在精品网久久一区| 大地资源中文第二页日本| 兔费看少妇性l交大片免费| 白嫩少妇无套内谢视频| 1024你懂的国产精品| 精品国产成人午夜福利| 久久精品免视看成人国产| 高清性欧美暴力猛交| 国产乱码精品一区二三区| 久久精品国产精品亚洲综合| 天天摸天天做天天添欧美| 午夜免费福利小电影| 曰批免费视频播放免费| 国产精品三级中文字幕| 中文字幕在线永久免费视频| 亚洲国内精品一区二区| 精品国产成人亚洲午夜福利 | 国产成人精品区一区二区| 97亚洲熟妇自偷自拍另类图片| 久99久热精品免费视频| 精品一区二区三区在线观看l| 玩弄放荡人妻少妇系列| 欧美一区二区三区在线观看| 国产最大成人亚洲精品| 亚洲精品麻豆一二三区| 欧洲中文字幕国产精品| 成人免费av色资源日日| 精品国产自在久久现线拍| 又大又硬又爽免费视频|