JVM工具命令使用初探

  • jvm虚拟机给我们提供了很多java开发时的辅助命令,帮助我们在开发的时候查看运行时数据区的使用及垃圾回收状态等数据,让我们有效的掌握java程序在运行时内存结构及使用情况。下面我就简单的介绍下在自己初学中的实践,有不对的地方,还望指正。
    首先我们都知道jdk中bin目录下有javac、java、jps、jstat、jinfo、jstack、jmap等。
    1.javac命令是编译java代码使符合java格式的文件编译成class字节文件;
    2.java命令是执行上文中编译好的class字节文件;
    3.jps是查看当前正在执行的虚拟机进程,可以查看到具体的类和进程ID,如下图:
    jps命令使用重点内容
    如图中一共看到4个进程,其中5245的进程是jps本身,480应该是我所启动的eclipse使用java的进程,而5239是我启动的一个tomcat服务的进程。从5239的具体类是Bootstrap可以看出tomcat的类加载器的启动类加载器就是Bootstrap.
    4.jstat命令 虚拟机统计信息监视工具,能够显示VM进程中的类装载、内存、GC、JIT编译等运行数据。使用方法如下:
    jstat -gc 5239 100 1
    -gc 表示查看gc的工作情况,还有很多其他命令,大体上分为三类-class查看类加载情况-compiler查看JIT编译的情况等。
    5239是用jps -l查看到的进程id
    100是每隔多少ms查询一次
    1是查询一次
    看下结果:

    S0C S1C S0U S1U EC EU OC OU PC PU YGC YGCT FGC FGCT GCT
    32768.0 10752.0 0.0 10521.1 279040.0 38739.8 74240.0 50196.4 189952.0 110630.7 23 0.810 2 0.442 1.252
    S0C是新生代中的Survivor 0区的内存大小32768.0;
    S0U是新生代中的Survivor 0区的已使用内存大小0.0;
    S1C是新生代中的Survivor 1区的内存大小10752.0;
    S1U是新生代中的Survivor 1区的已使用内存大小10521.1;
    EC是新生代中的Eden区的内存大小279040.0;
    EU是新生代中的Eden区的已使用内存大小38739.8;
    从数据中可以看出,Eden与Survivor0、Survivor1的比例并不是精确的8:1:1而是大概的。还可以获取信息,Survivor 0和Survivor 1在同 一个时段并不会都使用,这是由于新生代采用复制的垃圾回收,只要Eden和Survivor中的一个满了就会触发YGC(YOUNG GC),将剩余的对象复制到另一个Survivor中。所以设置两个Survivor区是为了保证能够复制回收机制的实施。有些文章将两个Suvivor区名字命名成Survivor from 与 Survivor to,这样的命名方式其实并不精确。应为两个Survivor区是来回切换成空的,其中一个Survivor区在这个回收时段是from角色,在下个回收时段就会成为to角色,所以这种命名并不精确。(下文还会看具体他们之间切换的数据来证实)
    OC是老年代的分配的内存大小74240.0;
    OU是老年代的已经使用的内存大小50196.4;
    PC是永久代(Perm Gen)分配的内存大小189952.0;
    PU是永久代已经使用的内存大小110630.7;
    YGC是新生代垃圾回收的次数23次;
    YGCT是新生代垃圾回收所花的时间810ms;
    FGC(FULL GC)是新生代与老年代一起垃圾回收的次数2次;
    YGCT是新生代与老年代一起垃圾回收所花的时间442ms;
    GCT是垃圾回收所花时间的总和1252ms。
    从数据中可以看出,一般young gc的次数比较多,full gc的次数比较少,我们也是要最好减少full gc的次数,因为full gc的时间比较长,会消耗更多的内存。
    接下来我们继续看我在请求tomcat服务时的内存使用回收的变化:
    JVM工具命令使用初探_第1张图片

你可能感兴趣的:(jvm,jdk,java,虚拟机,JVM探索)