亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Java虛擬機詳解----常用JVM配置參數

2019-11-14 11:17:14
字體:
來源:轉載
供稿:網友

原文地址:http://www.49028c.com/smyhvae/p/4736162.html

【聲明】 

歡迎

聯系方式:smyhvae@163.com  

 

本文主要內容:

Trace跟蹤參數堆的分配參數棧的分配參數

 

零、在IDE的后臺打印GC日志:

既然學習JVM,閱讀GC日志是處理java虛擬機內存問題的基礎技能,它只是一些人為確定的規則,沒有太多技術含量。

既然如此,那么在IDE的控制臺打印GC日志是必不可少的了?,F在就告訴你怎么打印。

(1)如果你用的是Eclipse,打印GC日志的操作如下:

在上圖的箭頭處加上-XX:+PRintGCDetails這句話。于是,運行程序后,GC日志就可以打印出來了:

(2)如果你用的是IntelliJ IDEA,打印GC日志的操作如下:

在上圖的箭頭處加上-XX:+PrintGCDetails這句話。于是,運行程序后,GC日志就可以打印出來了:

當然了,光有-XX:+PrintGCDetails這一句參數肯定是不夠的,下面我們詳細介紹一下更多的參數配置。

 

一、Trace跟蹤參數:

1、打印GC的簡要信息:

-verbose:gc-XX:+printGC

解釋:可以打印GC的簡要信息。比如:

[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之前,用了4M左右的內存,GC之后,用了374K內存,一共回收了將近4M。內存大小一共是16M左右。

 

2、打印GC的詳細信息:

-XX:+PrintGCDetails

解釋:打印GC詳細信息。

-XX:+PrintGCTimeStamps

解釋:打印CG發生的時間戳。

 

理解GC日志的含義:

例如下面這段日志:

[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。方括號內部的“4416K->0K(4928K)”含義是:“GC前該內存區域已使用容量->GC后該內存區域已使用容量(該內存區域總容量)”。而在方括號之外的“4790K->374K(15872K)”表示“GC前Java堆已使用容量->GC后Java堆已使用容量(Java堆總容量)”。

再往后看,“0.0001897 secs”表示該內存區域GC所占用的時間,單位是秒。

 

再比如下面這段GC日志:

上圖中,我們先看一下用紅框標注的“[0x27e80000, 0x28d80000, 0x28d80000)”的含義,它表示新生代在內存當中的位置:第一個參數是申請到的起始位置,第二個參數是申請到的終點位置,第三個參數表示最多能申請到的位置。上圖中的例子表示新生代申請到了15M的控件,而這個15M是等于:(eden space的12288K)+(from space的1536K)+(to space的1536K)。

疑問:分配到的新生代有15M,但是可用的只有13824K,為什么會有這個差異呢?等我們在后面的文章中學習到了GC算法之后就明白了。

 

3、指定GC log的位置:

-Xloggc:log/gc.log

解釋:指定GC log的位置,以文件輸出。幫助開發人員分析問題。

  

-XX:+PrintHeapAtGC

解釋:每一次GC前和GC后,都打印堆信息。

例如:

上圖中,紅框部分正好是一次GC,紅框部分的前面是GC之前的日志,紅框部分的后面是GC之后的日志。

 

-XX:+TraceClassLoading

解釋:監控類的加載。

例如:

[Loaded java.lang.Object from shared objects file]

[Loaded java.io.Serializable from shared objects file]

[Loaded java.lang.Comparable from shared objects file]

[Loaded java.lang.CharSequence from shared objects file]

[Loaded java.lang.String from shared objects file]

[Loaded java.lang.reflect.GenericDeclaration from shared objects file]

[Loaded java.lang.reflect.Type from shared objects file]

 

-XX:+PrintClassHistogram

 

解釋:按下Ctrl+Break后,打印類的信息。

例如:

 

二、堆的分配參數:

1、-Xmx –Xms:指定最大堆和最小堆

舉例、當參數設置為如下時:

-Xmx20m -Xms5m

然后我們在程序中運行如下代碼:

System.out.println("Xmx=" + Runtime.getRuntime().maxMemory() / 1024.0 / 1024 + "M");     //系統的最大空間System.out.println("free mem=" + Runtime.getRuntime().freeMemory() / 1024.0 / 1024 + "M");   //系統的空閑空間System.out.println("total mem=" + Runtime.getRuntime().totalMemory() / 1024.0 / 1024 + "M");   //當前可用的總空間

 運行效果:

保持參數不變,在程序中運行如下代碼:(分配1M空間給數組)

復制代碼
byte[] b = new byte[1 * 1024 * 1024];System.out.println("分配了1M空間給數組");System.out.println("Xmx=" + Runtime.getRuntime().maxMemory() / 1024.0 / 1024 + "M");   //系統的最大空間System.out.println("free mem=" + Runtime.getRuntime().freeMemory() / 1024.0 / 1024 + "M");   //系統的空閑空間System.out.println("total mem=" + Runtime.getRuntime().totalMemory() / 1024.0 / 1024 + "M");   復制代碼

運行效果:

注:Java會盡可能將total mem的值維持在最小堆。

保持參數不變,在程序中運行如下代碼:(分配10M空間給數組)

復制代碼
byte[] b = new byte[10 * 1024 * 1024];System.out.println("分配了10M空間給數組");System.out.println("Xmx=" + Runtime.getRuntime().maxMemory() / 1024.0 / 1024 + "M");   //系統的最大空間System.out.println("free mem=" + Runtime.getRuntime().freeMemory() / 1024.0 / 1024 + "M");   //系統的空閑空間System.out.println("total mem=" + Runtime.getRuntime().totalMemory() / 1024.0 / 1024 + "M");   //當前可用的總空間復制代碼

運行效果:

如上圖紅框所示:此時,total mem 為7M時已經不能滿足需求了,于是total mem漲成了16.5M。

 

保持參數不變,在程序中運行如下代碼:(進行一次GC的回收)

復制代碼
System.gc();System.out.println("Xmx=" + Runtime.getRuntime().maxMemory() / 1024.0 / 1024 + "M");    //系統的最大空間System.out.println("free mem=" + Runtime.getRuntime().freeMemory() / 1024.0 / 1024 + "M");   //系統的空閑空間System.out.println("total mem=" + Runtime.getRuntime().totalMemory() / 1024.0 / 1024 + "M");   //當前可用的總空間 復制代碼

運行效果:

問題1: -Xmx(最大堆空間)和 –Xms(最小堆空間)應該保持一個什么關系,可以讓系統的性能盡可能的好呢?

問題2:如果你要做一個Java的桌面產品,需要綁定JRE,但是JRE又很大,你如何做一下JRE的瘦身呢?

 

2、-Xmn、-XX:NewRatio、-XX:SurvivorRatio:

-Xmn

    設置新生代大小

-XX:NewRatio

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

        例如:4,表示新生代:老年代=1:4,即新生代占整個堆的1/5

-XX:SurvivorRatio(幸存代)

    設置兩個Survivor區和eden的比值

        例如:8,表示兩個Survivor:eden=2:8,即一個Survivor占年輕代的1/10

 

現在運行如下這段代碼:

復制代碼
public class JavaTest {    public static void main(String[] args) {        byte[] b = null;        for (int i = 0; i < 10; i++)            b = new byte[1 * 1024 * 1024];    }}復制代碼

我們通過設置不同的jvm參數,來看一下GC日志的區別。

 

(1)當參數設置為如下時:(設置新生代為1M,很?。?/p>

-Xmx20m -Xms20m -Xmn1m -XX:+PrintGCDetails 

運行效果:

總結:

  沒有觸發GC

    由于新生代的內存比較小,所以全部分配在老年代。

 

(2)當參數設置為如下時:(設置新生代為15M,足夠大)

-Xmx20m -Xms20m -Xmn15m -XX:+PrintGCDetails

運行效果:

上圖顯示:

沒有觸發GC

全部分配在eden(藍框所示)

老年代沒有使用(紅框所示)

 

(3)當參數設置為如下時:(設置新生代為7M,不大不?。?/p>

-Xmx20m -Xms20m –Xmn7m -XX:+PrintGCDetails

運行效果:

總結:

  進行了2次新生代GC

  s0 s1 太小,需要老年代擔保

 

(4)當參數設置為如下時:(設置新生代為7M,不大不??;同時,增加幸存代大?。?/p>

-Xmx20m -Xms20m -Xmn7m -XX:SurvivorRatio=2 -XX:+PrintGCDetails

運行效果:

總結:

    進行了至少3次新生代GC

    s0 s1 增大

 

(5)當參數設置為如下時:

-Xmx20m -Xms20m -XX:NewRatio=1-XX:SurvivorRatio=2 -XX:+PrintGCDetails 

運行效果:

 

 

(6)當參數設置為如下時: 和上面的(5)相比,適當減小幸存代大小,這樣的話,能夠減少GC的次數

-Xmx20m -Xms20m -XX:NewRatio=1-XX:SurvivorRatio=3 -XX:+PrintGCDetails

 

 

3、-XX:+HeapDumpOnOutOfMemoryError、-XX:+HeapDumpPath

-XX:+HeapDumpOnOutOfMemoryError

    OOM時導出堆到文件

      根據這個文件,我們可以看到系統dump時發生了什么。

-XX:+HeapDumpPath

    導出OOM的路徑

例如我們設置如下的參數:

-Xmx20m -Xms5m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:/a.dump

上方意思是說,現在給堆內存最多分配20M的空間。如果發生了OOM異常,那就把dump信息導出到d:/a.dump文件中。

然后,我們執行如下代碼:

Vector v = new Vector();for (int i = 0; i < 25; i++)  v.add(new byte[1 * 1024 * 1024]);

上方代碼中,需要利用25M的空間,很顯然會發生OOM異?!,F在我們運行程序,控制臺打印如下:

現在我們去D盤看一下dump文件:

8782a0ae-62fb-43a8-a5a6-1c5691e7fa59

上圖顯示,一般來說,這個文件的大小和最大堆的大小保持一致。

我們可以用VisualVM打開這個dump文件。

注:關于VisualVM的使用,可以參考下面這篇博客:

使用 VisualVM 進行性能分析及調優:http://www.ibm.com/developerworks/cn/java/j-lo-visualvm/

或者使用Java自帶的Java VisualVM工具也行:

f9158d50-95d0-4732-942c-e872181fa530

f69bd0d2-a355-4a93-81c1-c3e71bce7509

上圖中就是dump出來的文件,文件中可以看到,一共有19個byte已經被分配了。 

 

4、-XX:OnOutOfMemoryError:

-XX:OnOutOfMemoryError

    在OOM時,執行一個腳本。

      可以在OOM時,發送郵件,甚至是重啟程序。

例如我們設置如下的參數:

-XX:OnOutOfMemoryError=D:/tools/jdk1.7_40/bin/printstack.bat %p //p代表的是當前進程的pid 

上方參數的意思是說,執行printstack.bat腳本,而這個腳本做的事情是:D:/tools/jdk1.7_40/bin/jstack -F %1 > D:/a.txt,即當程序OOM時,在D:/a.txt中將會生成線程的dump。

5、堆的分配參數總結:

根據實際事情調整新生代和幸存代的大小官方推薦新生代占堆的3/8幸存代占新生代的1/10在OOM時,記得Dump出堆,確??梢耘挪楝F場問題

 

6、永久區分配參數:

-XX:PermSize  -XX:MaxPermSize

    設置永久區的初始空間和最大空間。也就是說,jvm啟動時,永久區一開始就占用了PermSize大小的空間,如果空間還不夠,可以繼續擴展,但是不能超過MaxPermSize,否則會OOM。

    他們表示,一個系統可以容納多少個類型

代碼舉例:

我們知道,使用CGLIB等庫的時候,可能會產生大量的類,這些類,有可能撐爆永久區導致OOM。于是,我們運行下面這段代碼:

for(int i=0;i<100000;i++){  CglibBean bean = new CglibBean("geym.jvm.ch3.perm.bean"+i,new HashMap());}

上面這段代碼會在永久區不斷地產生新的類。于是,運行效果如下:

fd7bcefb-d6d5-4fe0-8d77-9cddae2733fc

總結:

  如果堆空間沒有用完也拋出了OOM,有可能是永久區導致的。

    堆空間實際占用非常少,但是永久區溢出 一樣拋出OOM。

 

三、棧的分配參數:

1、Xss:

設置??臻g的大小。通常只有幾百K

  決定了函數調用的深度

  每個線程都有獨立的??臻g

  局部變量、參數 分配在棧上

注:??臻g是每個線程私有的區域。棧里面的主要內容是棧幀,而棧幀存放的是局部變量表,局部變量表的內容是:局部變量、參數。

我們來看下面這段代碼:(沒有出口的遞歸調用)

復制代碼
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();        }    }}復制代碼

上方這段代碼是沒有出口的遞歸調用,肯定會出現OOM的。

如果設置棧大小為128k:

-Xss128K 

運行效果如下:(方法被調用了294次)

5c2b2060-e54a-4e7c-9a30-81567204d55b

如果設置棧大小為256k:(方法被調用748次)

7d6be7d6-b646-42bf-9357-1a3bccbb7a49

意味著函數調用的次數太深,例如遞歸調用。

 

總結:

我們在本文中介紹了jvm的一些最基本的參數,還有很多參數(如GC參數等)將在后續的系列文章中進行介紹。我們將在接下來的文章中介紹GC算法。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
57pao成人国产永久免费| 日韩av一区在线观看| 中文字幕不卡av| 日韩精品免费在线| 欧美成人一区二区三区电影| 亚洲自拍小视频免费观看| 国产日本欧美一区二区三区| 国产精品一区二区久久精品| 日韩欧美在线视频观看| 中文字幕一区电影| 久久久精品久久| 91免费看国产| 国产精品男女猛烈高潮激情| 欧美成人免费网| 亚洲va电影大全| 久久亚洲精品小早川怜子66| 国产视频精品在线| 日韩一区二区在线视频| 亚洲精品资源美女情侣酒店| 日韩欧美国产视频| 亚洲一区二区三区乱码aⅴ蜜桃女| 国产精品久久久久秋霞鲁丝| 日韩av在线免播放器| 国产精品亚洲美女av网站| 国产精品自产拍在线观| 丰满岳妇乱一区二区三区| 欧日韩不卡在线视频| 中文字幕精品一区久久久久| 国产精品极品在线| 精品国内亚洲在观看18黄| 国产精品国内视频| 久久免费少妇高潮久久精品99| 欧美老女人www| 亚洲欧美日韩视频一区| 国产欧美va欧美va香蕉在| 欧美日韩国产一区中文午夜| 青青久久av北条麻妃海外网| 97精品国产91久久久久久| 国产成人精品亚洲精品| 一本色道久久综合亚洲精品小说| 日韩av一区在线观看| 欧美性猛交xxxx黑人猛交| 亚洲欧洲av一区二区| 亚洲免费视频观看| 国模视频一区二区三区| 亚洲免费一级电影| 国产成人综合一区二区三区| 精品国产一区av| 欧美另类99xxxxx| 色综合影院在线| 18一19gay欧美视频网站| 日韩视频一区在线| 久久精品国产2020观看福利| 欧美亚洲另类激情另类| 亚洲免费人成在线视频观看| 欧美精品情趣视频| 久久精品国产96久久久香蕉| 海角国产乱辈乱精品视频| 日韩一区视频在线| 亚洲www在线| 一区二区三区久久精品| 国外成人在线视频| 欧美国产精品日韩| 亚洲乱码一区av黑人高潮| 国产精品入口尤物| 精品国产一区二区三区四区在线观看| 亚洲一区二区自拍| 日韩电影中文字幕在线观看| 亚洲第一天堂av| 久久综合国产精品台湾中文娱乐网| 久久人人爽人人爽人人片av高清| 欧美国产亚洲视频| 国产91精品黑色丝袜高跟鞋| 琪琪亚洲精品午夜在线| 91精品久久久久久综合乱菊| 欧美视频中文在线看| 成人激情黄色网| 热久久这里只有精品| 亚洲欧美在线免费观看| 97色在线播放视频| 亚洲一区二区三区视频播放| 中文字幕9999| 国产精品福利网站| 国产mv免费观看入口亚洲| 日韩第一页在线| 久久久日本电影| 91麻豆国产语对白在线观看| 成人精品一区二区三区电影黑人| 亚洲欧美日韩直播| 国产ts人妖一区二区三区| 三级精品视频久久久久| 51ⅴ精品国产91久久久久久| 久久国产精品久久久久久久久久| 亚洲国产精品一区二区久| 国内精品小视频| 国内精品久久久久影院优| 国产成人一区二区三区| 97成人精品区在线播放| 2019日本中文字幕| 亚洲欧美中文日韩v在线观看| 欧美在线视频免费播放| 亚洲国产日韩欧美综合久久| 在线观看日韩av| 国产亚洲一区二区精品| 欧美视频一区二区三区…| 2019中文字幕在线| 日韩精品一二三四区| 欧美激情乱人伦一区| 日本精品一区二区三区在线| 久久久女女女女999久久| 欧美诱惑福利视频| 最近的2019中文字幕免费一页| 一区二区三区亚洲| 国产精品精品久久久| 97**国产露脸精品国产| 美日韩丰满少妇在线观看| 精品国产91久久久| 欧美韩日一区二区| 色婷婷久久一区二区| 粗暴蹂躏中文一区二区三区| 久久国产精品电影| 色综合久久中文字幕综合网小说| 国产精品99久久久久久久久久久久| 国产精品欧美日韩久久| 国产日韩欧美综合| 欧美性xxxx极品hd满灌| 国产精品视频播放| 国模精品视频一区二区三区| 国产精品亚洲第一区| 一区二区三区无码高清视频| 亚洲国产精品人久久电影| 欧美日韩亚洲精品内裤| 亚洲自拍偷拍一区| 亚洲精品久久久久久久久| 成人黄色大片在线免费观看| 国产精品入口尤物| 国产精品久久久999| 一区二区三区天堂av| 97视频在线观看播放| 国产精品视频导航| 色偷偷av一区二区三区乱| 亚洲成人a**站| 亚洲福利在线视频| 精品国偷自产在线视频99| 久久精品视频免费播放| 亚洲一区二区三区成人在线视频精品| 亚洲视频在线观看免费| 久久亚洲综合国产精品99麻豆精品福利| 国产va免费精品高清在线| 日韩在线视频线视频免费网站| 日韩大胆人体377p| 日韩av免费在线看| 欧美成人免费小视频| 亚洲色图35p| 亚洲人线精品午夜| 亚洲最大av网| 欧美激情中文字幕乱码免费| 91情侣偷在线精品国产| 91社区国产高清| 亚洲欧美国产日韩天堂区| 黄色成人在线免费| 91精品久久久久久久久不口人| 日韩av在线网页| 午夜精品99久久免费|