JVM 【常用配置参数】

2019年1月5日 作者 jacky
  • Trace跟踪参数
  • 堆的分配参数
  • 栈的分配参数

Trace跟踪参数

  • -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]
  • -XX:+PrintGCDetails 打印GC详细信息
  • -XX:+PrintGCTimeStamps 打印CG发生的时间戳
例
[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] 

  • -Xloggc:~/logs/gc.log
    • 指定了GC日志的位置,以文件输出
    • 帮助开发人员分析问题


堆的分配参数

堆的分配参数 -Xmx -Xms

-Xmx20m -Xms5m 运行代码


堆上分配参数

  • -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
 Vector v=new Vector();
        for(int i=0;i<25;i++)
            v.add(new byte[1*1024*1024]);

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

堆分配参数总结

  1. 根据实际事情调整新生代和幸存代的大小
  2. 官方推荐新生代占堆的3/8
  3. 幸存代占新生代的1/10
  4. 在OOM时,记得Dump出堆,确保可以排查现场问题

永久区分配参数

  • -XX:PermSize -XX:MaxPermSize
    • 设置永久区的初始空间和最大空间
    • 他们表示,一个系统可以容纳多少个类型
  • 使用CGLIB等库的时候,可能会产生大量的类,这些类,有可能撑爆永久区导致OOM

  • 打开堆的Dump
    • 堆空间实际占用的很少的
    • 但是永久区溢出,一样会抛出OOM

栈的参数分配

  • -Xss
    • 通常只有几百K
    • 决定了函数调用的深度
    • 每个线程都有独立的栈空间
    • 局部变量、参数 分配在栈上