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]
  • -XX:+PrintGCDetails的输出
    • Heap
    • def new generation   total 13824K, used 11223K [0x27e80000, 0x28d80000, 0x28d80000)
    • eden space 12288K,  91% used [0x27e80000, 0x28975f20, 0x28a80000)
    • from space 1536K,   0% used [0x28a80000, 0x28a80000, 0x28c00000)
    • to   space 1536K,   0% used [0x28c00000, 0x28c00000, 0x28d80000)
    • tenured generation   total 5120K, used 0K [0x28d80000, 0x29280000, 0x34680000)
    • the space 5120K,   0% used [0x28d80000, 0x28d80000, 0x28d80200, 0x29280000)
    • compacting perm gen  total 12288K, used 142K [0x34680000, 0x35280000, 0x38680000)
    • the space 12288K,   1% used [0x34680000, 0x346a3a90, 0x346a3c00, 0x35280000)
    • ro space 10240K,  44% used [0x38680000, 0x38af73f0, 0x38af7400, 0x39080000)
    • rw space 12288K,  52% used [0x39080000, 0x396cdd28, 0x396cde00, 0x39c80000)
  • -Xloggc:log/gc.log
    • 指定GC log的位置,以文件输出
    • 帮助开发人员分析问题
  • -XX:+PrintHeapAtGC
    • 每次一次GC后,都打印堆信息

{Heap before GC invocations=0 (full 0):

def new generation   total 3072K, used 2752K [0x33c80000, 0x33fd0000, 0x33fd0000)

eden space 2752K, 100% used [0x33c80000, 0x33f30000, 0x33f30000)

from space 320K,   0% used [0x33f30000, 0x33f30000, 0x33f80000)

to   space 320K,   0% used [0x33f80000, 0x33f80000, 0x33fd0000)

tenured generation   total 6848K, used 0K [0x33fd0000, 0x34680000, 0x34680000)

the space 6848K,   0% used [0x33fd0000, 0x33fd0000, 0x33fd0200, 0x34680000)

compacting perm gen  total 12288K, used 143K [0x34680000, 0x35280000, 0x38680000)

the space 12288K,   1% used [0x34680000, 0x346a3c58, 0x346a3e00, 0x35280000)

ro space 10240K,  44% used [0x38680000, 0x38af73f0, 0x38af7400, 0x39080000)

rw space 12288K,  52% used [0x39080000, 0x396cdd28, 0x396cde00, 0x39c80000)

[GC[DefNew: 2752K->320K(3072K), 0.0014296 secs] 2752K->377K(9920K), 0.0014604 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 

Heap after GC invocations=1 (full 0):

def new generation   total 3072K, used 320K [0x33c80000, 0x33fd0000, 0x33fd0000)

eden space 2752K,   0% used [0x33c80000, 0x33c80000, 0x33f30000)

from space 320K, 100% used [0x33f80000, 0x33fd0000, 0x33fd0000)

to   space 320K,   0% used [0x33f30000, 0x33f30000, 0x33f80000)

tenured generation   total 6848K, used 57K [0x33fd0000, 0x34680000, 0x34680000)

the space 6848K,   0% used [0x33fd0000, 0x33fde458, 0x33fde600, 0x34680000)

compacting perm gen  total 12288K, used 143K [0x34680000, 0x35280000, 0x38680000)

the space 12288K,   1% used [0x34680000, 0x346a3c58, 0x346a3e00, 0x35280000)

ro space 10240K,  44% used [0x38680000, 0x38af73f0, 0x38af7400, 0x39080000)

rw space 12288K,  52% used [0x39080000, 0x396cdd28, 0x396cde00, 0x39c80000)

}

  • -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后,打印类的信息:
    • num #instances #bytes class name
      ----------------------------------------------
      1: 890617 470266000 [B
      2: 890643 21375432 java.util.HashMap$Node
      3: 890608 14249728 java.lang.Long
      4: 13 8389712 [Ljava.util.HashMap$Node;
      5: 2062 371680 [C
      6: 463 41904 java.lang.Class

    • 分别显示:序号、实例数量、总大小、类型
  • -Xmx –Xms
    • 指定最大堆和最小堆
    • -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");

Xmx=19.375M
free mem=4.342750549316406M
total mem=4.875M

  • -Xmx20m -Xms5m  运行代码
    • byte[] b=new byte[1*1024*1024];
    • System.out.println("分配了1M空间给数组");
    • 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");
  • 分配了1M空间给数组
    Xmx=19.375M
    free mem=3.4791183471679688M
    total mem=4.875M

  • Java会尽可能维持在最小堆
    • -Xmx20m -Xms5m  运行代码
      • b=new byte[4*1024*1024];
      • System.out.println("分配了4M空间给数组");
      • 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");
    • 分配了4M空间给数组
      Xmx=19.375M
      free mem=3.5899810791015625M
      total mem=9.00390625M

  • -Xmx20m -Xms5m  运行代码
      • System.gc();
      • System.out.println("回收内存");
      • 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");
    • 回收内存
      Xmx=19.375M
      free mem=6.354591369628906M
      total mem=10.75390625M

  • -Xmn
    • 设置新生代大小
  • -XX:NewRatio
    • 新生代(eden+2*s)和老年代(不包含永久区)的比值
    • 4 表示 新生代:老年代=1:4,即年轻代占堆的1/5
  • -XX:SurvivorRatio
    • 设置两个Survivor区和eden的比
    • 8表示 两个Survivor :eden=2:8,即一个Survivor占年轻代的1/10
    • public static void main(String[] args) {
      byte[] b=null;
      for(int i=0;i<10;i++)
      b=new byte[1*1024*1024];
      }

      -Xmx20m -Xms20m -Xmn1m  -XX:+PrintGCDetails

    • 没有触发GC
    • 全部分配在老年代
    • -Xmx20m -Xms20m -Xmn15m  -XX:+PrintGCDetails

    • 没有触发GC
    • 全部分配在eden
    • 老年代没有使用
    • -Xmx20m -Xms20m –Xmn7m  -XX:+PrintGCDetails

    • 1.进行了2次新生代GC

      2.s0 s1 太小需要老年代担保

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

    • 1.进行了3次新生代GC

      2.s0 s1 增大

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

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

  • -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时,发送邮件,甚至是重启程序
  • 根据实际事情调整新生代和幸存代的大小
  • 官方推荐新生代占堆的3/8
  • 幸存代占新生代的1/10
  • 在OOM时,记得Dump出堆,确保可以排查现场问题

永久区分配参数

  • -XX:PermSize  -XX:MaxPermSize
    • 设置永久区的初始空间和最大空间
    • 他们表示,一个系统可以容纳多少个类型

栈大小分配

  • -Xss
    • 通常只有几百K
    • 决定了函数调用的深度
    • 每个线程都有独立的栈空间
    • 局部变量、参数 分配在栈上
  • 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();
    }
    }
    }

    递归调用

    -Xss128K

    deep of calling = 701

    java.lang.StackOverflowError

    -Xss256K

    deep of calling = 1817

    java.lang.StackOverflowError

深入JVM内核--常用JVM配置参数的更多相关文章

  1. 深入理解JVM(三)——配置参数

    JVM配置参数分为三类参数: 1.跟踪参数 2.堆分配参数 3.栈分配参数 这三类参数分别用于跟踪监控JVM状态,分配堆内存以及分配栈内存. 跟踪参数 跟踪参数用于跟踪监控JVM,往往被开发人员用于J ...

  2. JVM内存模型及配置参数

    JVM 分为堆.栈.方法区.程序计数器.本地方法栈 栈内存存放局部变量表.操作栈.动态链接.方法出口等信息 1.  局部变量表存放了编译期可知的各种基本数据类型(boolean.byte.char.s ...

  3. 天地图常用WMTS配置参数

    wmts常用参数 var matrixIds = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', ...

  4. JVM虚拟机(1)---常用JVM配置参数

    常用JVM配置参数 常用JVM配置参数主要有:Trace跟踪参数.堆的分配参数.栈的分配参数. 一.Trace跟踪参数 跟踪参数用于跟踪监控JVM,对于开发人员来讲用于JVM调优以及故障排查的. 1. ...

  5. JVM配置参数详解

    记录一下jvm中的一些配置参数,这些肯定不全的,希望你们能留个言,补全一下,谢谢啦! -XX: MaxDirectMemorySize--->设置直接内存,不设置与Java堆内存最大值一致 -X ...

  6. struts2学习笔记之四:多配置文件支持和常用配置参数

    struts2支持可以按照不同模块分类的方式拆分配置文件,支持多人分工合作,各自维护自己的配置文件,但是所有配置文件中包名和action的名称不能重复   struts2的配置文件方式有两种,stru ...

  7. php源码安装常用配置参数和说明

    常用的配置参数1. --prefix=/usr/local/php 指定 php 安装目录 install architecture-independent files in PREFIX 默认/us ...

  8. redis常用配置参数解析

    本文主要总结一下redis常用的配置参数的用法: 以下参数决定redis运行方式,默认前台运行,修改为yes可以让redis以后台守护进程方式运行 daemonize no 以下参数指定redis的p ...

  9. PHP 源码安装常用配置参数和说明

    常用的配置参数1. --prefix=/usr/local/php指定 php 安装目录install architecture-independent files in PREFIX 默认/usr/ ...

随机推荐

  1. 用CNN及MLP等方法识别minist数据集

    用CNN及MLP等方法识别minist数据集 2017年02月13日 21:13:09 hnsywangxin 阅读数:1124更多 个人分类: 深度学习.keras.tensorflow.cnn   ...

  2. rpm -qa -qc 查询安装过的软件

    dpkg  -l  | grep ssh        #Ubuntu rpm -qa |grep ssh   #centos 通过ps -e |grep ssh命令查看是否启动.如果只有ssh-ag ...

  3. 大数据攻城狮之进阶技能-Github的使用

    引用百度百科中的介绍: github GitHub是一个面向开源及私有软件项目的托管平台,因为只支持git 作为唯一的版本库格式进行托管,故名GitHub. GitHub于2008年4月10日正式上线 ...

  4. Java Keyword Synchronized 学习记录

    Synchronized Java编程思想:每个对象都包含了一把锁(也叫作"监视器"),它自动成为对象的一部分,调用任何synchronized方法时,对象就会被锁定,不可再调用那 ...

  5. Druid数据库连接池获取连接阻塞(转载)

    一. 背景        17年公司有个项目组在南京做项目的时候,开发框架用的是spring boot ,数据库连接池用的是druid,但老是遇到socket read timeout的错误,不得已放 ...

  6. Leetcode(104)之二叉树的最大深度

    题目描述: 解题思路: 代码: public int MaxDepth(TreeNode root) { if (root == null) return 0; return Mathf.Max(Ma ...

  7. eclipse Java EE 与 Java 区别

    1. 综述 eclipse IDE 一般来说有三种可切换的模式 Java EE Java 调试 可直接下拉至底部看两者的比较. 2. Java Java 是带有用户界面的 基本IDE ,缺少数据库和w ...

  8. mybatis自动扫描的时候,接口跟xml文件的名字最好能够一一对应

    事实证明这是十分有好处的,当然,即便你不这么做,它也不一定会报invalid bound statement (not found),因为你不知道从哪儿拷来的配置文件可能从其他的地方做了配置,但是这么 ...

  9. 创建Maven项目时Maven中的GroupID和ArtifactID的意思

    GroupID 是项目组织中唯一的标识符,对应Java包结构,在项目中看到的是main目录里java的目录结构. ArtifactID是项目的唯一的标识符,实际对应项目的名称(就是idea中工程的名字 ...

  10. 二、Shell脚本高级编程实战第二部

    一.什么是变量? 变量就是一个固定的字符串替代更多更复杂的内容,当然内容里面可能还有变量.路径.字符串等等内容,最大的特点就是方便,更好开展工作 1.变量有环境变量(全局变量)和局部变量 环境变量就是 ...