最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

010、動手實驗:親自感受一下線上系統(tǒng)部署時如何設(shè)置JVM內(nèi)存大???

2023-06-01 21:33 作者:儒猿課堂  | 我要投稿

動手實驗:親自感受一下線上系統(tǒng)部署時如何設(shè)置JVM內(nèi)存大小?


目錄:

  1. 前文回顧

  2. 跟JVM內(nèi)存相關(guān)的幾個核心參數(shù)圖解

  3. 如何在啟動系統(tǒng)的時候設(shè)置JVM參數(shù)?

  4. 通過案例,學(xué)習(xí)參數(shù)優(yōu)化設(shè)置的預(yù)告

  5. 昨日思考題解析

  6. 今日思考題


1、前文回顧

咱們先簡單回顧一下目前為止已經(jīng)學(xué)到的內(nèi)容,現(xiàn)在大家肯定都知道,我們平時代碼里創(chuàng)建的對象,都是優(yōu)先在新生代分配的

然后隨著一些方法執(zhí)行完畢,大部分新生代里的對象就沒有人引用了,就成了垃圾對象,如下圖所示:

大家可以想象一下,隨著代碼持續(xù)運行,新生代里對象會越來越多,而且里面大部分的對象其實都是那種短生存周期的對象,很快就沒有人引用他們了,因此大部分都會是一些垃圾對象。

然后代碼繼續(xù)運行,是不是肯定會創(chuàng)建新的對象分配在新生代里?

肯定是的,所以一旦新生代里內(nèi)存不夠了,就會觸發(fā)一次Minor GC,把新生代里那些沒有人引用的垃圾對象都給回收掉,騰出來內(nèi)存空間。如下圖所示:

如果是那種在長周期存活的對象,他在新生代里會持續(xù)躲過多次垃圾回收,每躲過 一次垃圾回收,年齡會增長1歲

然后當(dāng)他成為是十多歲的“老年人”的時候,就會被轉(zhuǎn)移到老年代里去,如下圖:

好,到此為止,我們撇開一些特殊情況,至少JVM中基本的內(nèi)存分配原理,大家就搞清楚了

本周最核心的概念,就是讓大家屢清楚短生存周期的對象和長生存周期的對象分別是什么,他們是如何在新生代里分配的,新生代什么時候觸發(fā)Minor GC,然后長生存周期的對象如何轉(zhuǎn)移到老年代里去。


2、跟JVM內(nèi)存相關(guān)的幾個核心參數(shù)圖解

本文就不涉及到任何原理性的東西了,直接開始逐步給大家講解JVM的參數(shù)如何設(shè)置。

在JVM內(nèi)存分配中,有幾個參數(shù)是比較核心的,如下所示。

  1. -Xms:Java堆內(nèi)存的大小

  2. -Xmx:Java堆內(nèi)存的最大大小

  3. -Xmn:Java堆內(nèi)存中的新生代大小,扣除新生代剩下的就是老年代的內(nèi)存大小了

  4. -XX:PermSize:永久代大小

  5. -XX:MaxPermSize:永久代最大大小

  6. -Xss:每個線程的棧內(nèi)存大小

下面我們對上述參數(shù)來進行一一說明。

-Xms和-Xmx,分別用于設(shè)置Java堆內(nèi)存的剛開始的大小,以及允許擴張到的最大大小。

對于這對參數(shù),通常來說,都會設(shè)置為完全一樣的大小。大家先不用太過于糾結(jié)這里的細節(jié),因為其實JVM里的各種技術(shù)細節(jié)真的太多了,不能一下子全部都搞定,要隨著后續(xù)幾十個案例,層層鋪展開來。

但是至少大家需要清楚,這兩個參數(shù),是用來限定Java堆內(nèi)存的總大小的,如下圖。

-Xmn,這個參數(shù)也是很常見的,他用來設(shè)置Java堆內(nèi)存中的新生代的大小,然后扣除新生代大小之后的剩余內(nèi)存就是給老年代的內(nèi)存大小,我們看下圖:

-XX:PermSize和-XX:MaxPermSize,分別限定了永久代大小和永久代的最大大小

通常這兩個數(shù)值也是設(shè)置為一樣的,至于原因,請看后面結(jié)合案例的文章分析。

如果是JDK 1.8以后的版本,那么這倆參數(shù)被替換為了-XX:MetaspaceSize和-XX:MaxMetaspaceSize,但是大家至少得知道,這兩個參數(shù)限定了永久代的大小,如下圖所示:

-Xss,這個參數(shù)限定了每個線程的棧內(nèi)存大小

大家都很清楚,每個線程都有一個自己的虛擬機棧,然后每次執(zhí)行一個方法,就會將方法的棧幀壓入線程的棧里,方法執(zhí)行完畢,那么棧幀就會從線程的棧里出棧,如下圖:


3、如何在啟動系統(tǒng)的時候設(shè)置JVM參數(shù)?

那么現(xiàn)在大家結(jié)合圖示都知道了JVM內(nèi)存各個區(qū)域的大小該使用什么參數(shù)來設(shè)置,那么到底怎么設(shè)置呢?

現(xiàn)在就帶著大家來做一些實驗

你要是在Eclipse/IntelliJ IDEA里開發(fā)代碼的話,如果要在這種開發(fā)IDE里啟動一個程序,然后設(shè)置JVM參數(shù),那么就需要對按照下面的步驟來設(shè)置:

首先右擊你寫好的一個帶main()方法的類,他有一個菜單欄,里面有一個“Debug as”選項,鼠標(biāo)移動進入,會看到一個“Debug Configuration”選項,接著會看到下面的面板。

這個面板里有一個“Arguments”的選項,點擊他,會看到下面的圖。然后在“VM arguments”中輸入你的JVM參數(shù)即可

比如你可以按照下面的示例來設(shè)置,-Xms之類的參數(shù)直接后面跟上你要設(shè)置的內(nèi)存大小,多少M即可。

但是-XX:PermSize這種格式的參數(shù),需要跟一個“=”符號,跟上你要設(shè)置的內(nèi)存大小即可。


那么如果是在線上部署系統(tǒng)應(yīng)該如何設(shè)置JVM參數(shù)呢?

其實都很簡單,比如說采用“java -jar”的方式啟動一個jar包里的系統(tǒng),那么就可以采用類似下面的格式:

java -Xms512M -Xmx512M -Xmn256M -Xss1M -XX:PermSize=128M -XX:MaxPermSize=128M -jar App.jar

如果是現(xiàn)在非常流行的那種啟動Spring Boot開發(fā)的系統(tǒng)呢?

其實都是類似的,大家自行翻閱一下Spring Boot的文檔即可。


4、通過案例,學(xué)習(xí)參數(shù)優(yōu)化設(shè)置的預(yù)告

明天開始,我們會做發(fā)布本專欄的第一個案例,就是百萬交易的支付系統(tǒng)案例

通過分析一個支付系統(tǒng)的核心業(yè)務(wù)流程,然后結(jié)合我們學(xué)習(xí)到的JVM相關(guān)的知識,來一步步探究,JVM內(nèi)存相關(guān)的這些核心參數(shù),到底在我們上線一個生產(chǎn)系統(tǒng)的時候,針對預(yù)估的并發(fā)壓力,到底應(yīng)該如何合理的給出一個未經(jīng)過調(diào)優(yōu)的比較合理的初始值。

另外我們會分析各種參數(shù)在設(shè)置的時候有哪些考慮的點,Java堆內(nèi)存到底需要多大?新生代和老年代的內(nèi)存分別需要多大?永久代和虛擬機棧分別 需要多大?這些我們都結(jié)合案例來一步一步的分析。

其實JVM參數(shù)到底該如何設(shè)置,一定是根據(jù)不同的業(yè)務(wù)系統(tǒng)他具體的一些場景來調(diào)整的,不是說有一個通用的配置和模板,照著設(shè)就沒問題了,那個思路肯定是不對的,也不能干巴巴的告訴你,這個參數(shù)應(yīng)該這樣設(shè)置,那個參數(shù)應(yīng)該那樣設(shè)置。

一切都要從案例出發(fā),結(jié)合業(yè)務(wù)場景來分析。


5、昨日思考題解析

昨天讓大家結(jié)合學(xué)到的知識,去分析一下自己手頭負責(zé)的那些業(yè)務(wù)系統(tǒng),哪些是短生存周期的對象,哪些是長生存周期的對象

其實就是讓大家開始在腦子里建立起來自己負責(zé)的系統(tǒng)在JVM中運行時的一個概念圖,要有這個意識,才能更好的進行JVM調(diào)優(yōu)。


6、今日思考題

給大家留一個思考題,大家都知道平時我們一般部署Java系統(tǒng),主要以Tomcat部署Web系統(tǒng)居多,現(xiàn)在還更多的是通過Spring Boot來部署系統(tǒng)。

那么大家可以自行去網(wǎng)上查閱一下,Tomcat、Spring Boot部署啟動系統(tǒng)的時候,JVM參數(shù)如何設(shè)置?

然后大家再看看自己公司手頭負責(zé)的系統(tǒng),你們部署系統(tǒng)的時候是通過什么方式來設(shè)置JVM參數(shù)的?

End

版權(quán):公眾號儒猿技術(shù)窩

未經(jīng)許可不得傳播,如有侵權(quán)將追究法律責(zé)任

010、動手實驗:親自感受一下線上系統(tǒng)部署時如何設(shè)置JVM內(nèi)存大小?的評論 (共 條)

分享到微博請遵守國家法律
渭南市| 阿克| 铜梁县| 普兰县| 都匀市| 翁牛特旗| 新民市| 元江| 迭部县| 合肥市| 长治市| 星座| 务川| 开封县| 正定县| 德化县| 长泰县| 商丘市| 明光市| 尉氏县| 连城县| 黄石市| 襄汾县| 深水埗区| 康乐县| 镇巴县| 金平| 阳西县| 闽侯县| 平邑县| 静乐县| 宁陕县| 清流县| 乌苏市| 岳西县| 灵石县| 渝北区| 富蕴县| 岳阳市| 宁河县| 宝坻区|