經常使用JVM配置參數

Trace 跟蹤參數

  • -verbose:gc 能夠打印GC的簡要信息java

  • -XX:+PrintGC 能夠打印GC的簡要信息
    使用方式 Java -參數(-verbose:gc) GCTest(這個是要執行的Java程序 也能夠是 .jar) node

  • -XX:+PrintGCDetails 看名字就是打印Gc詳細信息bash

  • -XX:+PrintGCTimeStamps 打印CG發生的時間戳jvm

  • -Xloggc:gc.log( ‘:’ 以後是文件的路徑 直接一個文件名默認是相對路徑) 指定Gc.log的位置,將gc輸出到這個文件中

  • -XX:+PrintHeapAtGC :每次一次GC後,都打印堆信息
  • -XX:+TraceClassLoading: 監控類的加載
  • -XX:+PrintClassHistogram:按下Ctrl+Break後,打印類的信息(若是你是筆記本找不到 break鍵 點擊)

堆的分配參數

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

使用案例

分配 4m的時候 maven

執行gc的時候

到這的時候是時候提出問題了編輯器

-Xmx 和 –Xms 應該保持一個什麼關係,可讓系統的性能儘量的好呢?
  若是你要作一個Java的桌面產品,須要綁定JRE,可是JRE又很大,你如何作一下JRE的瘦身呢?
複製代碼
  • -Xmn:設置新生代大小ide

  • -XX:NewRatio:函數

    新生代(eden+2*s)和老年代(不包含永久區)的比值,
     4 表示 新生代:老年代=1:4,即年輕代佔堆的1/5
    複製代碼
  • -XX:SurvivorRatio:性能

    設置兩個Survivor區和eden的比
    8表示 兩個Survivor :eden=2:8,即一個Survivor佔年輕代的1/10
    複製代碼

    使用 測試

  • -XX:+HeapDumpOnOutOfMemoryError :OOM時導出堆到文件

  • -XX:+HeapDumpPath:導出OOM的路徑

看個例子

其中隱藏掉的是:-Xmx20m -Xms5m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:/a.dump

若是你的編輯器是idea想看一下的話 按照那個圖片設置完成後 運行項目就ok了

  • -XX:OnOutOfMemoryError

    在OOM時,執行一個腳本
    "-XX:OnOutOfMemoryError=D:/tools/jdk1.7_40/bin/printstack.bat %p「(這個printstack.bat裏邊的內容是 D:/tools/jdk1.7_40/bin/jstack -F %1 > D:/a.txt   )
    當程序OOM時,在D:/a.txt中將會生成線程的dump
    能夠在OOM時,發送郵件,甚至是重啓程序
    複製代碼

是時候總結一波了

根據實際事情調整新生代和倖存代的大小
 官方推薦新生代佔堆的3/8
 倖存代佔新生代的1/10
 在OOM時,記得Dump出堆,確保能夠排查現場問題
複製代碼

永久區分配參數

  • -XX:PermSize -XX:MaxPermSize

    設置永久區的初始空間和最大空間

    他們表示,一個系統能夠容納多少個類型

這裏我就截圖把結果顯示出來了

你本身試得時候 CglibBean 沒有,別擔憂在這裏

public class GcTset {

    public static void main(String[] args) {

//        byte [] b = new byte[1*1024*1024];
//        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");

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

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

    }
}
class CglibBean {
        /**
         * 實體Object
         */
        public Object object = null;


        /**
         * 屬性map
         */
        public BeanMap beanMap = null;


        public CglibBean() {
            super();
        }


        @SuppressWarnings("unchecked")
        public CglibBean(String name, Map propertyMap) {
            this.object = generateBean(name,propertyMap);
            this.beanMap = BeanMap.create(this.object);
        }


        /**
         * 給bean屬性賦值
         *
         * @param property
         *            屬性名
         * @param value
         *            值
         */
        public void setValue(String property, Object value) {
            beanMap.put(property, value);
        }


        /**
         * 經過屬性名獲得屬性值
         *
         * @param property
         *            屬性名
         * @return 值
         */
        public Object getValue(String property) {
            return beanMap.get(property);
        }


        /**
         * 獲得該實體bean對象
         *
         * @return
         */
        public Object getObject() {
            return this.object;
        }


        @SuppressWarnings("unchecked")
        private Object generateBean(String name, Map propertyMap) {
            BeanGenerator generator = new BeanGenerator();
            Set keySet = propertyMap.keySet();
            for (Iterator i = keySet.iterator(); i.hasNext();) {
                String key = name +(String) i.next();
                generator.addProperty(key, (Class) propertyMap.get(key));
            }
            return generator.create();
        }
    }
複製代碼

maven的

<dependency>
            <groupId>cglib-nodep-2.2.jar</groupId>
            <artifactId>cglib-nodep-2.2.jar</artifactId>
        </dependency>
複製代碼

棧的分配參數

  • -Xss

    一般只有幾百K
     決定了函數調用的深度
     每一個線程都有獨立的棧空間
     局部變量、參數 分配在棧上
    複製代碼

設置棧大小 仍是先把結果顯示出來

代碼

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();
        }
    }
複製代碼

若是你是idea執行的話不要忘記把這個參數帶上

若是是命令行的話 java -Xss128k GcTest

我以爲 最後補充一下 這個圖片中三單詞的意思

在GC收集的時候,
頻繁收集生命週期短的區域(Young area),由於這個區域內的對象生命週期比較短,GC
效率也會比較高。
而比較少的收集生命週期比較長的區域(Old area or Tenured area),
以及基本不收集的永久區(Perm area)。
複製代碼

由於個人能力有限就到這把,具體在項目中使用呢,我也沒用過爲啥呢由於我作的項目尚未到用這個的時候。固然我很但願能在項目中真正使用一下,這些只是本身寫測試一下,還有好可能是查資料看的。

相關文章
相關標籤/搜索