3. 常用JVM配置參數(shù)

Trace跟蹤參數(shù)

  • 打印GC的簡要信息
    • -verbose:gc
    • -XX:+printGC
    • [GC 4790K->374K(15872K), 0.0001606 secs]
    • [GC 4790K->374K(15872K), 0.0001474 secs]
    • [GC 4790K->374K(15872K), 0.0001563 secs]
    • [GC 4790K->374K(15872K), 0.0001682 secs]
  • 打印GC詳細(xì)信息
    • -XX:+PrintGCDetails
  • 打印CG發(fā)生的時間戳
    • -XX:+PrintGCTimeStamps
    • [GC[DefNew: 4416K->0K(4928K), 0.0001897 secs] 4790K->374K(15872K), 0.0002232 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
  • 指定GC log的位置响鹃,以文件輸出:幫助開發(fā)人員分析問題
    • -Xloggc:log/gc.log
  • 每次進(jìn)行一次GC后城豁,都打印堆信息
    • -XX:+PrintHeapAtGC
  • 監(jiān)控類的加載
    • -XX:+TraceClassLoading
  • 按下Ctrl+Break后,打印類的信息:分別顯示:序號、實例數(shù)量车要、總大小、類型
    • -XX:+PrintClassHistogram


      打印類信息.png

堆的分配參數(shù)

  • 指定最大堆和最小堆

    • -Xmx –Xms
    • -Xmx20m -Xms5m 運行代碼:
    1. 指定最大堆20M牺弹,最小堆5M
      System.out.print("Xmx=");
      System.out.println(Runtime.getRuntime().maxMemory()/1024.0/1024+"M");
    
      System.out.print("free mem=");
      System.out.println(Runtime.getRuntime().freeMemory()/1024.0/1024+"M");
    
      System.out.print("total mem=");
      System.out.println(Runtime.getRuntime().totalMemory()/1024.0/1024+"M");
      
    結(jié)果:
      Xmx=19.375M
      free mem=4.342750549316406M
      total mem=4.875M
    
    1. 指定最大堆20M腕侄,最小堆5M,分配了1M空間給數(shù)組
      byte[] b=new byte[1*1024*1024];
      System.out.println("分配了1M空間給數(shù)組");
    
      System.out.print("Xmx=");
      System.out.println(Runtime.getRuntime().maxMemory()/1024.0/1024+"M");
    
      System.out.print("free mem=");
      System.out.println(Runtime.getRuntime().freeMemory()/1024.0/1024+"M");
    
      //Java會盡可能維持在最小堆
      System.out.print("total mem=");
      System.out.println(Runtime.getRuntime().totalMemory()/1024.0/1024+"M");
    
    結(jié)果:
      分配了1M空間給數(shù)組
      Xmx=19.375M
      free mem=3.4791183471679688M
      total mem=4.875M
    
    1. 指定最大堆20M订雾,最小堆5M肢预,分配了4M空間給數(shù)組
      b=new byte[4*1024*1024];
      System.out.println("分配了4M空間給數(shù)組");
    
      System.out.print("Xmx=");
      System.out.println(Runtime.getRuntime().maxMemory()/1024.0/1024+"M");
    
      System.out.print("free mem=");
      System.out.println(Runtime.getRuntime().freeMemory()/1024.0/1024+"M");
    
      System.out.print("total mem=");
      System.out.println(Runtime.getRuntime().totalMemory()/1024.0/1024+"M");
    
    結(jié)果:
      分配了4M空間給數(shù)組
      Xmx=19.375M
      free mem=3.5899810791015625M
      //總內(nèi)存變多了
      total mem=9.00390625M
    
    
    1. 指定最大堆20M,最小堆5M洼哎,回收內(nèi)存
      b=new byte[4*1024*1024];
      System.out.println("分配了4M空間給數(shù)組");
    
      System.out.print("Xmx=");
      System.out.println(Runtime.getRuntime().maxMemory()/1024.0/1024+"M");
    
      System.out.print("free mem=");
      System.out.println(Runtime.getRuntime().freeMemory()/1024.0/1024+"M");
    
      System.out.print("total mem=");
      System.out.println(Runtime.getRuntime().totalMemory()/1024.0/1024+"M");
    
      System.gc();
    
      System.out.println("回收內(nèi)存");
      System.out.print("Xmx=");
      System.out.println(Runtime.getRuntime().maxMemory()/1024.0/1024+"M");
    
      System.out.print("free mem=");
      System.out.println(Runtime.getRuntime().freeMemory()/1024.0/1024+"M");
    
      System.out.print("total mem=");
      System.out.println(Runtime.getRuntime().totalMemory()/1024.0/1024+"M");
      
    結(jié)果:
      分配了4M空間給數(shù)組
      Xmx=19.375M
      free mem=3.5899810791015625M
      //總內(nèi)存變多了
      total mem=9.00390625M
      
      回收內(nèi)存
      Xmx=19.375M
      //空閑內(nèi)存增多
      free mem=6.354591369628906M
      total mem=10.75390625M
    
  • 設(shè)置新生代大小

    • -Xmn
  • 新生代(eden+2*s)和老年代(不包含永久區(qū))的比值

    • 4 表示 新生代:老年代=1:4烫映,即年輕代占堆的1/5
    • -XX:NewRatio
  • 設(shè)置兩個Survivor區(qū)和eden的比

    • 8表示 兩個Survivor :eden=2:8,即一個Survivor占年輕代的1/10
    • -XX:SurvivorRatio
  • OOM時導(dǎo)出堆到文件

    • -XX:+HeapDumpOnOutOfMemoryError
  • 導(dǎo)出OOM的路徑

    • -XX:+HeapDumpPath
    • -Xmx20m -Xms5m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:/a.dump
  • 在OOM時噩峦,執(zhí)行一個腳本

    • -XX:OnOutOfMemoryError
  • 總結(jié):

  1. 根據(jù)實際事情調(diào)整新生代和幸存代的大小
  2. 官方推薦新生代占堆的3/8
  3. 幸存代占新生代的1/10
  4. 在OOM時锭沟,記得Dump出堆,確笔恫梗可以排查現(xiàn)場問題

永久區(qū)分配參數(shù)

  • 設(shè)置永久區(qū)的初始空間和最大空間
    • -XX:PermSize -XX:MaxPermSize
    • 使用CGLIB等庫的時候族淮,可能會產(chǎn)生大量的類,這些類凭涂,有可能撐爆永久區(qū)導(dǎo)致OOM

棧的分配參數(shù)

  • 棧大小分配
    • -Xss
      • 通常只有幾百K
      • 決定了函數(shù)調(diào)用的深度
      • 每個線程都有獨立的椬@保空間
      • 局部變量、參數(shù)分配在棧上
      public class TestStackDeep {
          private static int count=0;
          public static void recursion(long a,long b,long c){
              long e=1,f=2,g=3,h=4,i=5,k=6,q=7,x=8,y=9,z=10;
              count++;
              recursion(a,b,c);
          }
      
          public static void main(String args[]){
              try{
                  recursion(0L,0L,0L);
              }catch(Throwable e){
                  System.out.println("deep of calling = "+count);
                  e.printStackTrace();
              }
          }
      }
      
    結(jié)果:
      遞歸調(diào)用
      -Xss128K
      deep of calling = 701
      java.lang.StackOverflowError
    
      -Xss256K
      deep of calling = 1817
      java.lang.StackOverflowError
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末切油,一起剝皮案震驚了整個濱河市蝙斜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌澎胡,老刑警劉巖孕荠,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绢片,死亡現(xiàn)場離奇詭異,居然都是意外死亡岛琼,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門巢株,熙熙樓的掌柜王于貴愁眉苦臉地迎上來槐瑞,“玉大人,你說我怎么就攤上這事阁苞±ч荩” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵那槽,是天一觀的道長悼沿。 經(jīng)常有香客問我,道長骚灸,這世上最難降的妖魔是什么糟趾? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮甚牲,結(jié)果婚禮上义郑,老公的妹妹穿的比我還像新娘。我一直安慰自己丈钙,他們只是感情好非驮,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著雏赦,像睡著了一般劫笙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上星岗,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天填大,我揣著相機(jī)與錄音伍茄,去河邊找鬼。 笑死敷矫,一個胖子當(dāng)著我的面吹牛例获,可吹牛的內(nèi)容都是我干的曹仗。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼怎茫,長吁一口氣:“原來是場噩夢啊……” “哼妓灌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蜜宪,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎掉伏,沒想到半個月后澳窑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡摊聋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了麻裁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡悲立,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出薪夕,到底是詐尸還是另有隱情脚草,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布原献,位于F島的核電站馏慨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏姑隅。R本人自食惡果不足惜写隶,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望讲仰。 院中可真熱鬧慕趴,春花似錦、人聲如沸鄙陡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽趁矾。三九已至耙册,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間毫捣,已是汗流浹背详拙。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工帝际, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人饶辙。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓蹲诀,卻偏偏與公主長得像,于是被迫代替她去往敵國和親弃揽。 傳聞我的和親對象是個殘疾皇子侧甫,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 昨晚睡覺近11點,今早小蛋兒叫醒的時候就沒喊他蹋宦,等到小蛋兒再次提醒神奇時間的時候親了親娃的小臉蛋兒,morning...
    顏小彥_d20b閱讀 324評論 0 0
  • Today is Sunday. The thieves sat down under an oak tree i...
    Mr_Oldman閱讀 124評論 0 0
  • dt=read.table("C:/Users/Administrator/python_test/combos1...
    ibmethan閱讀 115評論 0 0
  • 聰明的人咒锻,會把身邊最強的對手冷冗,變成自己最好的隊友。 你在進(jìn)步惑艇,他們也在成長蒿辙。 結(jié)交身邊觸手可及的優(yōu)秀者,正如投資了...
    peter_621f閱讀 224評論 0 1
  • 最近得閑,前天傍晚和朋友去拜訪一位老友恭取。早聽說這位老友住在上海梧桐樹最美的地方泰偿。一直垂涎想去坐坐,沒敢露態(tài)蜈垮。 我常...
    月別驚鵲閱讀 324評論 1 0