阅读 110

常用JVM配置参数

Trace 跟踪参数

  • -verbose:gc 可以打印GC的简要信息

  • -XX:+PrintGC 可以打印GC的简要信息
    使用方式 Java -参数(-verbose:gc) GCTest(这个是要执行的Java程序 也可以是 .jar)

  • -XX:+PrintGCDetails 看名字就是打印Gc详细信息

  • -XX:+PrintGCTimeStamps 打印CG发生的时间戳

  • -Xloggc:gc.log( ‘:’ 之后是文件的路径 直接一个文件名默认是相对路径) 指定Gc.log的位置,将gc输出到这个文件中

  • -XX:+PrintHeapAtGC :每次一次GC后,都打印堆信息
  • -XX:+TraceClassLoading: 监控类的加载
  • -XX:+PrintClassHistogram:按下Ctrl+Break后,打印类的信息(如果你是笔记本找不到 break键 点击)

堆的分配参数

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

使用案例

分配 4m的时候

执行gc的时候

到这的时候是时候提出问题了

  -Xmx 和 –Xms 应该保持一个什么关系,可以让系统的性能尽可能的好呢?
  如果你要做一个Java的桌面产品,需要绑定JRE,但是JRE又很大,你如何做一下JRE的瘦身呢?
复制代码
  • -Xmn:设置新生代大小

  • -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)。
复制代码

因为我的能力有限就到这把,具体在项目中使用呢,我也没用过为啥呢因为我做的项目还没有到用这个的时候。当然我很希望能在项目中真正使用一下,这些只是自己写测试一下,还有好多是查资料看的。