深入理解JAVA 虚拟机 (番外篇)JVM 配置参数 ...

2017-09-06  本文已影响0人  Gxgeek

- 打开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]

跟踪参数 打印更详细的

下面是我在JDK 1.8 执行程序 完整的GC日志

GC日志

可以看到新生代、老年代 和 元空间的大小

    -   Xmx20m -Xms5m  运行代码:
   
    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");


out:
Xmx=18.0M
free mem=3.671600341796875M
total mem=5.5M

mark
//-Xmx20m -Xms20m -Xmn1m  -XX:+PrintGCDetails 
public static void main(String[] args) {
   byte[] b=null;
   for(int i=0;i<10;i++)
       b=new byte[1*1024*1024];
}

--
- 没有触发GC
- 全部分配在老年代

1.7的图 (参考)

堆的分配参数

例子:

    Xmx20m -Xms5m -XX:+HeapDumpOnOutOfMemoryError
    -XX:HeapDumpPath=d:/a.dump
    
        Vector v=new Vector();
        for(int i=0;i<25;i++)
            v.add(new byte[1*1024*1024]);
mark

在OOM时,执行一个脚本
"-XX:OnOutOfMemoryError=D:/tools/jdk1.7_40/bin/printstack.bat %p“
当程序OOM时,在D:/a.txt中将会生成线程的dump
可以在OOM时,发送邮件,甚至是重启程序
%p是当前进程的Pid

堆的分配参数 – 总结

元空间 (HotSpot 1.8 去掉永久代 而新增的)

除了上面两个指定大小的选项以外,还有两个与 GC 相关的属性:

栈大小分配

例子:

/*
递归调用
-Xss128K
deep of calling = 701
java.lang.StackOverflowError

-Xss256K
deep of calling = 1817
java.lang.StackOverflowError
*/
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();
        }
    }
}

我的公众号

微信公众号
上一篇 下一篇

猜你喜欢

热点阅读