zoukankan      html  css  js  c++  java
  • java常用命令

    1.JMAP
    Jmap命令用于生成堆转储快照,有时候也成为heapdump或者dump文件。
    Jmap不仅仅可以获取dump文件,还可以查询finalize执行队列,Java堆和永久代的详细信息,如空间使用率、当时用的是那种收集器等。
    命令格式:
    C:Program Files (x86)Javajdk1.7.0_79in>jmap
    Usage:
        jmap [option] <pid>
            (to connect to running process)
        jmap [option] <executable <core>
            (to connect to a core file)
        jmap [option] [server_id@]<remote server IP or hostname>
            (to connect to remote debug server)
    
    where <option> is one of:
        <none>               to print same info as Solaris pmap
        -heap                打印java堆统计消息
        -histo[:live]        显示堆中对象的统计信息
        -permstat            打印永久内存统计信息
        -finalizerinfo       显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象
        -dump:<dump-options> 
                             dump-options:
                               live         live导出存活对象 不指定导出所有对象
                               format=b     二进制格式
                               file=<file>  指定dump文件目录
                             例如: jmap -dump:live,format=b,file=heap.bin <pid>
        -F                   使用 -dump:<dump-options> <pid> or -histo
                             当-dump没有响应时,强制生成dump快照. "live"不支持 
      
    option介绍
    模拟环境 随便开启java类 System.in.read()造成阻塞  
    -heap 统计堆内存情况
    C:Program Files (x86)Javajdk1.7.0_79in>jmap -heap 69616
    Attaching to process ID 69616, please wait...
    Debugger attached successfully.
    Client compiler detected.
    JVM version is 24.79-b02
    
    using thread-local object allocation.
    Mark Sweep Compact GC
    
    Heap Configuration:
       MinHeapFreeRatio = 40  //对应jvm启动参数-XX:MinHeapFreeRatio设置JVM堆最小空闲比率(default 40)
       MaxHeapFreeRatio = 70 //对应jvm启动参数 -XX:MaxHeapFreeRatio设置JVM堆最大空闲比率(default 70)
       MaxHeapSize      = 536870912 (512.0MB) //对应jvm启动参数-XX:MaxHeapSize=设置JVM堆的最大大小
       NewSize          = 1048576 (1.0MB) //对应jvm启动参数-XX:NewSize=设置JVM堆的‘新生代’的默认大小
       MaxNewSize       = 4294901760 (4095.9375MB) //对应jvm启动参数-XX:MaxNewSize=设置JVM堆的‘新生代’的最大大小
       OldSize          = 4194304 (4.0MB) //对应jvm启动参数-XX:OldSize=<value>:设置JVM堆的‘老生代’的大小
       NewRatio         = 2 //对应jvm启动参数-XX:NewRatio=:‘新生代’和‘老生代’的大小比率
       SurvivorRatio    = 8 //对应jvm启动参数-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值 
       PermSize         = 134217728 (128.0MB) //对应jvm启动参数-XX:PermSize=<value>:设置JVM堆的‘永生代’的初始大小
       MaxPermSize      = 134217728 (128.0MB) //对应jvm启动参数-XX:MaxPermSize=<value>:设置JVM堆的‘永生代’的最大大小
       G1HeapRegionSize = 0 (0.0MB)
    
    Heap Usage: 堆使用情况
    New Generation (Eden + 1 Survivor Space):  新生代情况 (edn+1个survivor区)
       capacity = 161021952 (153.5625MB)  总容量 
       used     = 8587904 (8.1900634765625MB) 使用
       free     = 152434048 (145.3724365234375MB) 剩余
       5.333374669312169% use d  使用比例
    Eden Space:  edn区统计
       capacity = 143130624 (136.5MB)
       used     = 8587904 (8.1900634765625MB)
       free     = 134542720 (128.3099365234375MB)
       6.000046502976191% used
    From Space:  survivor1 区统计
       capacity = 17891328 (17.0625MB)
       used     = 0 (0.0MB)
       free     = 17891328 (17.0625MB)
       0.0% used
    To Space:  survivor2区统计
       capacity = 17891328 (17.0625MB)
       used     = 0 (0.0MB)
       free     = 17891328 (17.0625MB)
       0.0% used
    tenured generation: 老年代统计
       capacity = 357957632 (341.375MB)
       used     = 0 (0.0MB)
       free     = 357957632 (341.375MB)
       0.0% used
    Perm Generation: 永久代统计
       capacity = 134217728 (128.0MB)
       used     = 284864 (0.27166748046875MB)
       free     = 133932864 (127.72833251953125MB)
       0.21224021911621094% used
    
    11833 interned Strings occupying 916536 bytes.
    -heap 统计堆内存情况
    打印堆的对象统计,包括对象数、内存大小等等 (因为在dump:live前会进行full gc,如果带上live则只统计活对象,因此不加live的堆大小要大于加live堆的大小 )
    C:Program Files (x86)Javajdk1.7.0_79in>jmap -histo:live 69616
    
     num     #instances         #bytes  class name
    ----------------------------------------------
       1:          1379         247800  [C
       2:           801          84824  <constMethodKlass>
       3:           801          57728  <methodKlass>
       4:           100          45968  <constantPoolKlass>
       5:           109          37008  [B
       6:           100          36384  <instanceKlassKlass>
       7:          1231          29544  java.lang.String
       8:           785          25120  java.util.TreeMap$Entry
       9:            92          21712  <constantPoolCacheKlass>
      10:           316          12824  [Ljava.lang.Object;
      11:            40          12480  <objArrayKlassKlass>
      12:           140          11968  java.lang.Class
      13:           138           8832  java.lang.reflect.Field
      14:           179           7624  [S
      15:           189           7080  [Ljava.lang.String;
      16:           165           6112  [[I
      17:            97           3104  java.lang.ref.SoftReference
      18:           112           2688  java.util.Hashtable$Entry
    后面classname分别表示
    B  byte
    C  char
    D  double
    F  float
    I  int
    J  long
    Z  boolean
    [  数组,如[I表示int[]
    [L+类名 其他对象
    -permstat
    打印Java堆内存的永久保存区域的类加载器的智能统计信息。对于每个类加载器而言,它的名称、活跃度、地址、父类加载器、它所加载的类的数量和大小都会被打印。此外,包含的字符串数量和大小也会被打印。
    C:Program Files (x86)Javajdk1.7.0_79in>jmap -permstat 69616
    Attaching to process ID 69616, please wait...
    Debugger attached successfully.
    Client compiler detected.
    JVM version is 24.79-b02
    finding class loader instances ..done.
    computing per loader stat ..done.
    please wait.. computing liveness..............done.
    class_loader    classes bytes   parent_loader   alive?  type
    
    <bootstrap>     426     1817688   null          live    <internal>   Bootstrap类加载器
    0x1aef9408      0       0         null          live    sun/misc/Launcher$ExtCla  Ext类加载器
    ssLoader@0x38e95570
    0x1aefb8a8      14      107320  0x1aef9408      live    sun/misc/Launcher$AppCla  应用类加载器
    ssLoader@0x38eb7728
    
    total = 3       440     1925008     N/A         alive=3, dead=0     N/A
    -dump 导出堆信息到dump文件中 该文件直接用MAT(Memory Anlysis Tool)打开。
    C:Program Files (x86)Javajdk1.7.0_79in>jmap -dump:live,format=b,file=dump.h
    prof 69616
    Dumping heap to C:Program Files (x86)Javajdk1.7.0_79indump.hprof ...
    Heap dump file created
    安装mat 在eclipse markerplace搜索mat  安装

    具体用法参考 动态图


    下面是overview选项图


    在Overview选项中,以饼状图的形式列举出了程序内存消耗的一些基本信息,其中每一种不同颜色的饼块都代表了不同比例的内存消耗情况。

         1. Histogram可以列出内存中的对象,对象的个数以及大小。
            Shallow Size表示该类型实际占用堆的大小  Retained Size:表示gc后被回收的大小

         2. Dominator Tree可以列出那个线程,以及线程下面的那些对象占用的空间。
         3.Top consumers通过图形列出最大的object。
         4.Leak Suspects通过MA自动分析泄漏的原因。
         

    2.jhat 

       jhat(JVM Heap Analysis Tool) 命令是与jmap搭配使用,用来分析jmap生成的dump,jhat内置了一个微型的HTTP/HTML服务器,生成dump的分析结果后,可以在浏览器中查看。在此要注意,一般不会直接在服务器上进行分析,因为jhat是一个耗时并且耗费硬件资源的过程,一般把服务器生成的dump文件复制到本地或其他机器上进行分析。

    C:Program Files (x86)Javajdk1.7.0_79in>jhat dump.hprof
    Reading from dump.hprof...
    Dump file created Wed Apr 18 11:50:35 CST 2018
    Snapshot read, resolving...
    Resolving 47693 objects...
    Chasing references, expect 9 dots.........
    Eliminating duplicate references.........
    Snapshot resolved.
    Started HTTP server on port 7000
    Server is ready.
    通过浏览器访问  http://localhost:7000

    可以点击 All  classes 查看所有对象 可以结合代码 查看是否有大量应该被回收而没有被回收的对象
    可以点击  Show heap histogram 查看各种类型对象实例个数

    2.javah

    开发jni程序可以使用javah转换java类为c++头文件 开发对应dll文件
    用法:javah [选项] <类>
    其中 [选项] 包括:
            

    -help                 输出此帮助消息并退出
            -classpath <路径>     用于装入类的路径
            -bootclasspath <路径> 用于装入引导类的路径
            -d <目录>             输出目录
            -o <文件>             输出文件(只能使用 -d 或 -o 中的
            -jni                  生成 JNI样式的头文件(默认)
            -version              输出版本信息
            -verbose              启用详细输出
            -force                始终写入输出文件


    使用全限定名称指定 <类>(例
    如,java.lang.Object)。

    比如定义了一个java类 可以转换成c的头文件和类 

    package test;
    public class Test{
    public final static String hello()
    {
      System.out.print("hello");
    }
    native static String chello();
    }

    使用 C: est 写入Test.java文件
    使用命令  javac  C: estTest.java 编译
    使用 javah命令

    cd C:
    C:>javah -jni -d C:	est test.Test

    可以看到 C: est 生成了test_Test.h
    jni具体开发 入门参考 https://blog.csdn.net/liaomin416100569/article/details/5672145

    3.jps

    用来查看基于HotSpot的JVM里面中,所有具有访问权限的Java进程的具体状态, 包括进程ID,进程启动的路径及启动参数等等,与unix上的ps类似,只不过jps是用来显示java进程,可以把jps理解为ps的一个子集。
        使用jps时,如果没有指定hostid,它只会显示本地环境中所有的Java进程;如果指定了hostid,它就会显示指定hostid上面的java进程,不过这需要远程服务上开启了jstatd服务,可以参看前面的jstatd章节来启动jstad服务。
    命令格式:

    usage: jps [-help]
           jps [-q] [-mlvV] [<hostid>]
    Definitions:
        <hostid>:      <hostname>[:<port>]
    选项参数:
    -l : 输出主类全名或jar路径
    -q : 只输出LVMID
    -m : 输出JVM启动时传递给main()的参数
    -v : 输出JVM启动时显示指定的JVM参数
    演示实例(比如 启动了带有main方法BlockQueueTest 添加main参数 a b  添加vm参数  -verbose:gc -XX:+PrintGCDetails)
    C:Usersjiaozi>jps     ---只是输出了进程号 运行类名
    47984 BlockQueueTest
    53236 Jps
    49628
    
    C:Usersjiaozi>jps -l   ---输出了进程号和完整主类名
    47984 cn.quene.BlockQueueTest
    52436 sun.tools.jps.Jps
    49628
    
    C:Usersjiaozi>jps -lm  ---m参数还输出了main类传入的main参数
    47984 cn.quene.BlockQueueTest a b
    52088 sun.tools.jps.Jps -lm
    49628
    
    C:Usersjiaozi>jps -lmv  --v参数 输出了 配置的vm参数
    47984 cn.quene.BlockQueueTest a b -verbose:gc -XX:+PrintGCDetails -Dfile.encodin
    g=GBK
    49628  -Dosgi.requiredJavaVersion=1.7 -Xms256m -Xmx1024m -XX:MaxPermSize=256m
    53132 sun.tools.jps.Jps -lmv -Dapplication.home=C:Program FilesJavajdk1.8.0_1
    31 -Xms8m

    添加代码模拟多个线程操作 来分析堆栈

    线程的状态:

        NEW:新建状态 
        RUNNABLE:运行状态
       BLOCKED:阻塞状态
       WAITING:获取到锁 调用了wait方法 等待其他线程调用notify唤醒
       TIMED_WAITING 获取到锁 调用了wait(时间)方法 等待其他线程调用notify唤醒或者超时
       TERMINATED:线程结束


    package test;
    /**
     * 模拟 线程1 锁定 ts  锁定ts1  让ts的锁释放等待 
     * 线程2 因为 ts1的锁一直未释放 等待获取ts1的锁
     * @author jiaozi
     *
     */
    public class BlockQueueTest {
        static String ts="aa";
        static String ts1="aa1";
    	public static void main(String[] args) {
    		Thread t1=new Thread(){
    			@Override
    			public void run() {
    				synchronized (ts) {
    					try {
    						synchronized (ts1) {
    							System.out.println("获取线程锁1");
    							ts.wait();
    						}
    					} catch (InterruptedException e) {
    						// TODO Auto-generated catch block
    						e.printStackTrace();
    					}
    				}
    			}
    		};
    		t1.setName("线程1");
    		t1.start();		
    		Thread t2=new Thread(){
    			@Override
    			public void run() {
    				try {
    					Thread.sleep(500);
    				} catch (InterruptedException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
    				synchronized (ts1) {
    						System.out.println("获取ts1的锁");
    				}
    			}
    		};
    		t2.setName("线程2");
    		t2.start();
    	}
    }
    

    使用jstack分析:

    C:Program Files (x86)Javajdk1.7.0_79in>jstack 22540
    2018-04-19 10:01:48
    Full thread dump Java HotSpot(TM) Client VM (24.79-b02 mixed mode, sharing):
    
    "DestroyJavaVM" prio=6 tid=0x04b0ac00 nid=0x5c20 waiting on condition [0x0000000
    0]
       java.lang.Thread.State: RUNNABLE
    
    "线程2" prio=6 tid=0x04b0a400 nid=0x5c5c waiting for monitor entry [0x04e4f000]
       java.lang.Thread.State: BLOCKED (on object monitor)  线程2因为一直获取不到锁 阻塞状态
            at test.BlockQueueTest$2.run(BlockQueueTest.java:41)
            - 【waiting to】 lock <0x245135d8> (a java.lang.String)  正在想要获取0x245135d8的锁
    "线程1" prio=6 tid=0x04b09c00 nid=0x490c in Object.wait() [0x04dbf000]
       java.lang.Thread.State: WAITING (on object monitor)  线程1 调用了wait方法 除了waiting状态
            at java.lang.Object.wait(Native Method)
            - 【waiting on】 <0x245135b0> (a java.lang.String) 在ts对象调用了wait  on to区别搞清楚
            at java.lang.Object.wait(Object.java:503)
            at test.BlockQueueTest$1.run(BlockQueueTest.java:19)
            - locked <0x245135d8> (a java.lang.String)  锁定了一个string对象 ts1
            - locked <0x245135b0> (a java.lang.String)  锁定了一个string对象 ts
    
    "Service Thread" daemon prio=6 tid=0x00d93000 nid=0x5c58 runnable [0x00000000]
       java.lang.Thread.State: RUNNABLE   其他线程都是系统线程
    
    "C1 CompilerThread0" daemon prio=10 tid=0x00d7e400 nid=0x5c48 waiting on conditi
    on [0x00000000]
       java.lang.Thread.State: RUNNABLE
    
    "Attach Listener" daemon prio=10 tid=0x00d7d000 nid=0x5c34 waiting on condition
    [0x00000000]
       java.lang.Thread.State: RUNNABLE
    
    "Signal Dispatcher" daemon prio=10 tid=0x00d6a800 nid=0x5c44 runnable [0x0000000
    0]
       java.lang.Thread.State: RUNNABLE
    
    "Finalizer" daemon prio=8 tid=0x00cf5c00 nid=0x5c50 in Object.wait() [0x0105f000
    ]
       java.lang.Thread.State: WAITING (on object monitor)
            at java.lang.Object.wait(Native Method)
            - waiting on <0x24400e48> (a java.lang.ref.ReferenceQueue$Lock)
            at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)
            - locked <0x24400e48> (a java.lang.ref.ReferenceQueue$Lock)
            at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)
            at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)
    
    "Reference Handler" daemon prio=10 tid=0x00cf4000 nid=0x5c54 in Object.wait() [0
    x0116f000]
       java.lang.Thread.State: WAITING (on object monitor)
            at java.lang.Object.wait(Native Method)
            - waiting on <0x24400c70> (a java.lang.ref.Reference$Lock)
            at java.lang.Object.wait(Object.java:503)
            at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133)
            - locked <0x24400c70> (a java.lang.ref.Reference$Lock)
    
    "VM Thread" prio=10 tid=0x00cf2800 nid=0x5c40 runnable
    
    "VM Periodic Task Thread" prio=10 tid=0x00dae400 nid=0x5640 waiting on condition
    
    
    JNI global references: 126


    4.jstack

    jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。 线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。

    命令格式:

    C:Usersjiaozi>jstack --help
    Usage:
        jstack [-l] <pid>
            (to connect to running process)
        jstack -F [-m] [-l] <pid>
            (to connect to a hung process)
        jstack [-m] [-l] <executable> <core>
            (to connect to a core file)
        jstack [-m] [-l] [server_id@]<remote server IP or hostname>
            (to connect to a remote debug server)
    Options:
        -F  to force a thread dump. Use when jstack <pid> does not respond (process
    is hung)
        -m  to print both java and native frames (mixed mode)
        -l  long listing. Prints additional information about locks
        -h or -help to print this help message

    5.jstat(JVM statistics Monitoring)

    Jstat用于监控基于HotSpot的JVM,对其堆的使用情况进行实时的命令行的统计,使用jstat我们可以对指定的JVM做如下监控:
    - 类的加载及卸载情况
    - 查看新生代、老生代及持久代的容量及使用情况
    - 查看新生代、老生代及持久代的垃圾收集情况,包括垃圾回收的次数及垃圾回收所占用的时间
    - 查看新生代中Eden区及Survior区中容量及分配情况等
    jstat工具特别强大,它有众多的可选项,通过提供多种不同的监控维度,使我们可以从不同的维度来了解到当前JVM堆的使用情况。详细查看堆内各个部分的使用量,使用的时候必须加上待统计的Java进程号,可选的不同维度参数以及可选的统计频率参数。

     命令格式:

    C:Usersjiaozi>jstat --help
    invalid argument count
    Usage: jstat -help|-options
           jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
    
    Definitions:
      <option>      -选项选择需要统计的数据 查看下标
      <vmid>        启动虚拟机ip格式:
                         <lvmid>[@<hostname>[:<port>]] 远程必须开启jmx
                    本地可以使用jps查看进程id
      <lines>       Number of samples between header lines.
      <interval> 连续输出的时间间隔 单位可以是:["ms"|"s"] 默认单位是ms
      <count> 连续输出的次数 每隔interval时间统计一次 达到count次数 不再统计 
       -J<flag> Pass <flag> directly to the runtime system.
    option可选的统计项:

    OptionDisplays…
    classclass loader的行为统计。Statistics on the behavior of the class loader.
    compilerHotSpt JIT编译器行为统计。Statistics of the behavior of the HotSpot Just-in-Time compiler.
    gc垃圾回收堆的行为统计。Statistics of the behavior of the garbage collected heap.
    gccapacity各个垃圾回收代容量(young,old,perm)和他们相应的空间统计。Statistics of the capacities of the generations and their corresponding spaces.
    gcutil垃圾回收统计概述。不过输出的是已使用空间占总空间的百分比
    gccause垃圾收集统计概述(同-gcutil),附加最近两次垃圾回收事件的原因。Summary of garbage collection statistics (same as -gcutil), with the cause of the last and
    gcnew新生代行为统计。Statistics of the behavior of the new generation.
    gcnewcapacity新生代与其相应的内存空间的统计。Statistics of the sizes of the new generations and its corresponding spaces.
    gcold年老代和永生代行为统计。Statistics of the behavior of the old and permanent generations.
    gcoldcapacity年老代行为统计。Statistics of the sizes of the old generation.
    gcpermcapacity永生代行为统计。Statistics of the sizes of the permanent generation.
    printcompilationHotSpot编译方法统计。HotSpot compilation method statistics. 

    -class (监视类装载、卸载数量、总空间以及耗费的时间)

    C:Usersjiaozi>jps
    47984 BlockQueueTest
    60724 Jps
    49628
    C:Usersjiaozi>jstat -class 47984
    Loaded  Bytes  Unloaded  Bytes     Time
       428   479.8        0     0.0       0.12
    • Loaded : 加载class的数量
    • Bytes : class字节大小
    • Unloaded : 未加载class的数量
    • Bytes : 未加载class的字节大小
    • Time : 加载时间

    -compiler  (输出JIT【Just-in-Time 】编译过的方法数量耗时等))

    C:Usersjiaozi>jps
    47984 BlockQueueTest
    59232 Jps
    49628
    C:Usersjiaozi>jstat -compiler 47984
    Compiled Failed Invalid   Time   FailedType FailedMethod
           8      0       0     0.00          0
    • Compiled : 编译数量
    • Failed : 编译失败数量
    • Invalid : 无效数量
    • Time : 编译耗时
    • FailedType : 失败类型
    • FailedMethod : 失败方法的全限定名
    -gc (垃圾回收堆的行为统计)

    C:Usersjiaozi>jps
    68596 BlockQueueTest
    68104 Jps
    49628
    C:Usersjiaozi>jstat -gc 68596
    Warning: Unresolved Symbol: sun.gc.metaspace.capacity substituted NaN
    Warning: Unresolved Symbol: sun.gc.metaspace.used substituted NaN
    Warning: Unresolved Symbol: sun.gc.compressedclassspace.capacity substituted NaN
    
    
    Warning: Unresolved Symbol: sun.gc.compressedclassspace.used substituted NaN
     S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU
       CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
    17472.0 17472.0  0.0    0.0   139776.0  8386.6   349568.0     0.0       -      -
          -      -         0    0.000   0      0.000    0.000
    

    这里发现 Warning: Unresolved Symbol: sun.gc.metaspace.capacity substituted NaN 后来发现eclipse启动main方法使用
    jdk1.7 jstat是使用jdk1.8 所有出现兼容问题 后续将命令也修改成了jdk1.7就成功兼容  正确输出如下:
    这里在main方法中添加vm参数(-Xms512M -XX:PermSize=128M)

    C:Program Files (x86)Javajdk1.7.0_79in>jps
    69616 BlockQueueTest
    65616 Jps
    49628
    
    C:Program Files (x86)Javajdk1.7.0_79in>jstat -gc 69616
     S0C    S1C    S0U    S1U      EC       EU        OC         OU       PC     PU   YGC     YGCT    FGC    FGCT     GCT
    17472.0 17472.0  0.0    0.0   139776.0  8386.6   349568.0     0.0     131072.0 2   78.2       0    0.000   0      0.000    0.000

    C即Capacity 总容量,U即Used 已使用的容量 注意单位都是kb

    • S0C : survivor0区的总容量
    • S1C : survivor1区的总容量
    • S0U : survivor0区已使用的容量
    • S1U : survivor1区已使用的容量
    • EC : Eden区的总容量
    • EU : Eden区已使用的容量
    • OC : Old区的总容量
    • OU : Old区已使用的容量
    • PC 当前perm的容量 (KB)
    • PU perm的使用 (KB)
    • YGC : 新生代垃圾回收次数
    • YGCT : 新生代垃圾回收时间
    • FGC : 老年代垃圾回收次数
    • FGCT : 老年代垃圾回收时间
    • GCT : 垃圾回收总消耗时间
    堆内存=survivor0总+survivor1总+eden总+old代总=17472.0 +17472.0 +139776.0  +349568.0 =  524,288K =512M

    eden区/survivor1=139776.0/17472.0 =8 说明 eden和survivor是 8:1:1的比例  老年代空间明显大于新生代

    永久内存=PC/1024=131072.0 /1024=128M 和配置一致

    新生代和老年代比例: 349568.0/174,720=2 
    通过jmap也可以统计到:

      NewRatio         = 2   老年代和新生代比例
      SurvivorRatio    = 8   eden去和survivor比例

    6.jinfo

    jinfo(JVM Configuration info)这个命令作用是实时查看和调整虚拟机运行参数。 之前的jps -v口令只能查看到显示指定的参数,如果想要查看未被显示指定的参数的值就要使用jinfo口令

    命令格式:

    C:Program Files (x86)Javajdk1.7.0_79in>jinfo --help
    Usage:
        jinfo [option] <pid>
            (to connect to running process)
        jinfo [option] <executable <core>
            (to connect to a core file)
        jinfo [option] [server_id@]<remote server IP or hostname>
            (to connect to remote debug server)
    
    where <option> is one of:
        -flag <name>        打印名字是name的vm参数
        -flag [+|-]<name>    启用获取禁用vm参数
        -flag <name>=<value> 设置vm的参数值
        -flags               打印所有设置的vm参数
        -sysprops            打印所有 Java system properties
        <no option>          没有选项打印上面两种 vm和properties

    例如
    打印所有vm参数和properties

    C:Program Files (x86)Javajdk1.7.0_79in>jinfo  22540
    打印某个vm参数
    C:Program Files (x86)Javajdk1.7.0_79in>jinfo -flag MaxPermSize 22540
    -XX:MaxPermSize=67108864
    开启打印gc日志(PrintGC PrintGCDateStamps PrintGCDetails)具体参数 通过 ( java -XX:+PrintFlagsFinal -version > c:/a.log 查看 )
    C:Program Files (x86)Javajdk1.7.0_79in>jinfo -flag +PrintGC 22
    540
    启动当fullgc前导出dump文件 
    C:Program Files (x86)Javajdk1.7.0_79in>jinfo -flag +HeapDumpBeforeFullGC 22
    540
    设置dump文件位置
    C:Program Files (x86)Javajdk1.7.0_79in>jinfo -flag HeapDumpPath=c:/ttt.hpro
    f 22540


  • 相关阅读:
    About Inside the Azure Storage Outage of November 18th
    Microsoft Azure 的一些限制 Global
    js递归遍历树形json数据,根据关键字查找节点
    如何修改 WordPress 的默认 Gravatar 头像
    flatpickr功能强大的日期时间选择器插件
    express框架,使用 static 访问 public 内静态文件
    nodejs实时的检测系统文件的变化(无需重启服务)
    redis的常用命令
    NPM install -save 和 -save-dev 傻傻分不清
    Git的使用--如何将本地项目上传到Github
  • 原文地址:https://www.cnblogs.com/liaomin416100569/p/9331276.html
Copyright © 2011-2022 走看看