jvm_虚拟机参数讲解(二)
生活随笔
收集整理的這篇文章主要介紹了
jvm_虚拟机参数讲解(二)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
堆里面分Eden區,s0,s1區,老年代,整體分兩塊大的區,復制算法分別轉換角色,對于JAVA里面的棧,里面有局部變量表,操作數棧,幀數據區,主要是操作數棧是一個主要的概念,局部變量表和幀數據區主要是拋異常處理的線程,處理異常什么的,然后方法區就是永久區了然后看一下之前所學的例子test1,虛擬機參數的分配,-XX是系統級的,虛擬機參數進行調優的,堆虛擬機本身調優的,剩下非-XX的參數,都是對應用程序進行調優的,比如設置一些堆內存,然后配置一些棧,永久區的設置,我們之前的test1的helloworld, Run As -----> Configuration,給他設置一下這個參數 -Xmx20m -Xms5m -XX:+PrintCommandLineFlags 它會把參數傳給虛擬機,當然有一個參數是 -XX:PrintCommandLineFlags可以打印具體的配置,是可以打印的,在第一行的時候,其實之前有一個小結:在實際工作中,我們可以直接將初始的堆大小和最大堆大小設置相等,以后我們進行TOMCAT調優的時候,你可以把初始化的堆內存和實際的堆內存大小配置成一樣,其實這種方式帶來的好處就是減少GC的回收次數,比如一開始你分配一個G的內存,然后你初始化的時候如果調100M,這個時候他會不斷地向你的虛擬機不斷的去申請,我這邊沒達到上限的內存都會給你,一旦達到一個G了,相當于不給你了,就報異常了,其實建議是調到大小相等,我個人一般調百分之八十,你給我1G,初始化就給800M,我可能就分配一半,500M,開始運行跑起來就行了,后期我們做實驗的時候你能看出來,配置相等的時候差距真的很大
打印的東西那天我們也詳細去說了,第一次分配1M的時候我就去用了1M,第二次我分配了4M,我的 free memory 不夠了,我就會去向虛擬機要,由于我設置的上限是20M,所以它還能要一些內存,free memory幾乎沒有什么變化,然后 total memory 使用的內存就變多了, 下面就是一個詳細的detail信息
?
?
新生代和老年代,新生代分為三塊,老年代還有永久區新生代的配置:一般我們使用-Xmn, 之前我們用-Xms,s代表我們初始化的堆大小,-Xmx中x代表最大的大小,初始化和最大的,但是我們看到Xmn,這個是設置新生代,這個是更細粒度的一個設置了,就是我們可以通過參數去設置新生代的一個大小,這個設置一個比較大的新生代會減少老年代的大小,我整個堆內存是一定的,新生代大了,那老年代肯定是少了但是對于我們正常的工作來講,一般我們不能隨便給新生代設置多大,新生代設置的太小了也不行,設置太大了也不太好,根據你實際的情況,一般我們會把新生代設置到整個堆空間的1/3到1/4左右.相當于新生代占1份,老年代占2份,或者新生代占1份,老年代占3分,三分之一到四分之一是比較合適的,因為你整個程序跑起來的時候,那更多的是一直在使用的對象,大部分是一直存活的,要不你的程序怎么運行呢,但是你的新生代也不能分配太小,一旦調用一個方法名調用對象的時候,如果是堆放不下來的話,會把新生代的對象直接扔到老年代老年代會占去GC,對系統的性能是有很重要的影響的,所以要合理的設置-Xmn這一塊,我不知道我們剛剛說的你聽懂了沒有,就是這個參數堆GC的行為是有一個很大的影響的.比如說我現在新生代設置三分之一,老年代2份,假如我設置配置比的話,對象過來的時候首先是往Eden區存放,經過一次垃圾回收收集GC的話,它會放在s0或者s1區,JVM默認的15次的GC,如果這個對象還是保留那就進化到老年代中但是如果說Xmn設置的很小的話,新生代設置一點點,老年代設置很大,老年代設置大了很應該的,因為很多應用程序跑的時候需要JAVA的內存和對象進行支撐,如果你的應用程序啟動之后,就相當于你沒有多少功能嗎 加入你設置非常小的話,對象過來的時候發現我的對象進不去了,那這個時候他就去往老年代扔了,如果你設置太小的話,100次以后,往新生代new了100個或者1000個以后,新生代放不下了,那這個對象就直接放在老年代了,或者是一些大對象,一些大對象也直接放在老年代,這個時候老年代產生了GC,新生代也產生GC,新生代必然會產生GC的,因為我們在應用程序走的時候,對象初始化的銷毀,新生代一定是有GC的,老年代如果頻繁的產生GC的話,就是Full GC,這種堆JAVA虛擬機的影響還是非常大的,這個時候就會產生應用程序的停頓,導致性能是有一些問題的,時間長的話就會導致崩潰,內存溢出,新生代和老年代的設置一般來說是需要你注意一下的,就是三分之一到四分之一左右,但是也是根據你實際的工作去看,到底是三分之一合適還是四分之一合適,如果你以后精通你整體的這個項目,做一個實時運維和架構的模式,那你的代碼有多少個接口,多少個類,都是可以看出來的,用一些JVM調優的工具看一下,先下之前做一些壓力測試,然后你們給出一個比較合適的配置,這配置可不是隨便配置的,當然你要依賴TOMCAT這種程序的話,這個配置的要求是很高的 我怎么去配這個大小的協調,就是新生代我能配置多大,新生代給他配置20M,但是新生代我們還可以去配置比例,有一個-XX:SurvivorRatio這么一個參數,用來設置新生代中的Eden和from/to空間的比例,更細粒度的再比一下設置的是from和to的一個比例 -XX:SurvivorRatio=eden/from=eden/to 就是新生代除以from, 新生代除以to就是和from/to比例是對等的,如果eden/from比值等于2的話是什么意思呢,就是我有2份新生代,1份from,還有1份to,并不是from加上to的之和,是和其中一個的比例,因為from和to是大小相等的,可以角色相互轉換的空間,所以eden是和其中之一比的,整個堆內存我們可以先配置新生代的大小,然后新生代的大小給他設置100M,然后再配置-XX:SurvivorRatio這個參數,配置成2,就是eden和from或者是eden和to,比例是2比1的關系,其實就是這么一個情況,eden比上from是二比一,eden比上to也是二比一 這是002,我們看看做了什么事情Run As ----> Configuration,來看看這個配置,一點要點到Test02才行,然后看arguments 首先我們初始化的時候配置的是20M,最大也是20M,也就是他們兩個是相等的,這個是比較好的,一般你運行一個比較小的程序,也許他耗內存不是非常多,給他300M就足夠了,這個時候你初始化給300M,最大也是300M,他們兩個相等也就OK了,Ratio我們配置的是2,就是這個比值我們配置的是2 我們這里Xmn新生代配置的是1M,比值又是2,你想想這個應該怎么去劃分呢,然后直接運行看結果 我們這個是連續申請10M的空間,我是第一次配置,我初始化配置20M,肯定夠,但是我新生代就配置1M,那我們主要看這塊,eden是512K,from和to都是256K,這個充分說明這個比值是沒有問題的,就是2比值是沒有問題的,然后我們去看第二次配置,我們去看新生代我們一共是7M 然后我們再次執行看控制臺打印的信息 eden,from,to加起來約等于7M,已經看到這個效果了第三次配置我們看到了多了一個配置,多了一個NewRatio,NewRatio是什么概念呢,新生代的Eden和to的配置是SurvivorRatio這個參數,NewRatio是老年代和新生代的比例不同的堆的分布情況,對系統執行會產生一定的影響的,在實際工作中,應該根據系統的特點做出合理的配置,基本策略:盡可能將對象預留在新生代,減少老年代的GC次數.老年代GC是非常耗性能的,除了可以設置新生代的絕對大小(-Xmn),你分10M或者20M,還可以使用(-XX:NewRatio)設置新生代和老年代的比例, -XX:NewRatio = 老年代/新生代,老年代在前,新生代在后,那我們看一下這個配置是怎么說的.我初始了20M,我們設置新生代和老年代,就不設置具體的,那我整個堆的內存是20M那我們來看一下這個有什么區別 這里配置老年代和新生代的比例是2:1,老年代是新生代的2倍,你可以看這個數據 說的比例的配置是非常的細了,以后你想怎么做就可以按照這個配置配了,這是關于配置參數,然后我們繼續看一個配置參數,其實參數就是這么點,還有一些就是不常用的參數在JAVA程序中,如果堆空間不足,則會拋出內存溢出的異常,是非常嚴重的,可能引起業務的嚴重的中斷,這個事我還是要強調一下,你寫程序的時候,你做測試的時候可能會出現異常,可能你個人覺得這種異常沒有什么大不了的,不就是報個內存溢出,自己使用eclipse開發代碼寫的不好也經常報內存溢出,其實在生產環境出現內存溢出是非常可怕的,內存溢出相當于down了,不像我們拋出一個什么exception,我就catch捕捉記錄日志,我的系統還能繼續對外提供服務,像這種RuntimeException,其實是可控的,就是我在系統運行的時候出RuntimeException是很正常的,但是如果出現OOM這種東西的話,那整個服務就不可用了,這種肯定是要盡量避免的,當然有一些內存為什么溢出的工具,整個我們可以給你一個地址,這個是可以給eclipse做集成的?
首先初始化是2M,最大也是2M,打印內存溢出的error,找到D盤的dump,我一共申請了5次,內存一共要使用5次,那必然會內存溢出,當然你這個參數也要配好了 就是2M,2M, 它會看到一個信息 java.lang.OutofMemoryError, Java heap 空間不足了, 是放在Temp003文件里了?
總結
以上是生活随笔為你收集整理的jvm_虚拟机参数讲解(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jvm_虚拟机参数讲解(一)
- 下一篇: jvm_虚拟机参数讲解(三)