美文网首页
JVM常用操作

JVM常用操作

作者: 斜月86 | 来源:发表于2019-04-13 09:52 被阅读0次

    java-jvm性能调优

    1 jps

    查看所有的jvm进程,包括进程ID,进程启动的路径等等。

    jps [-q] [-mlvV] [<hostid>]
    
    -q:忽略输出的类名、Jar名以及传递给main方法的参数,只输出pid。
    -m:输出传递给main方法的参数,如果是内嵌的JVM则输出为null。
    -l:输出完全的包名,应用主类名,jar的完全路径名
    -v:输出传给jvm的参数
    -V:输出通过标记的文件传递给JVM的参数(.hotspotrc文件,或者是通过参数-XX:Flags=指定的文件)。
    -J 用于传递jvm选项到由javac调用的java加载器中,例如,“-J-Xms48m”将把启动内存设置为48M,使用-J选项可以非常方便的向基于Java的开发的底层虚拟机应用程序传递参数。
    
     jps -m
     jps -l
     jps -v 
    
    

    2 jstack

    观察jvm中当前所有线程的运行情况和线程当前状态。

    jstack [-lFhm] pid
    -F  强制dump线程信息
    -m  打印java和native栈信息
    -l 长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表.
    -h 打印帮助信息
    

    3 jstat

    jstat利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对进程的classloader,compiler,gc情况;特别的,一个极强的监视内存的工具,可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量,以及加载类的数量。

    -class:统计class loader行为信息
    -compile:统计编译行为信息
    -gc:统计jdk gc时heap信息
    -gccapacity:统计不同的generations(不知道怎么翻译好,包括新生区,老年区,permanent区)相应的heap容量情况
    -gccause:统计gc的情况,(同-gcutil)和引起gc的事件
    -gcnew:统计gc时,新生代的情况
    -gcnewcapacity:统计gc时,新生代heap容量
    -gcold:统计gc时,老年区的情况
    -gcoldcapacity:统计gc时,老年区heap容量
    -gcpermcapacity:统计gc时,permanent区heap容量
    -gcutil:统计gc时,heap情况
    
    jstat -gc 22008 1000 3 查看gc 情况 1秒一次 一共输出3次
    
    ## 信息字段说明
    S0  — Heap上的 Survivor space 0 区已使用空间的百分比
    S0C:S0当前容量的大小
    S0U:S0已经使用的大小
    S1  — Heap上的 Survivor space 1 区已使用空间的百分比
    S1C:S1当前容量的大小
    S1U:S1已经使用的大小
    E   — Heap上的 Eden space 区已使用空间的百分比
    EC:Eden space当前容量的大小
    EU:Eden space已经使用的大小
    O   — Heap上的 Old space 区已使用空间的百分比
    OC:Old space当前容量的大小
    OU:Old space已经使用的大小
    P   — Perm space 区已使用空间的百分比
    OC:Perm space当前容量的大小
    OU:Perm space已经使用的大小
    YGC — 从应用程序启动到采样时发生 Young GC 的次数
    YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒)
    FGC — 从应用程序启动到采样时发生 Full GC 的次数
    FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒)
    GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒),它的值等于YGC+FGC 
    

    4 jmap

    监视进程运行中的jvm物理内存的占用情况,该进程内存内,所有对象的情况,例如产生了哪些对象,对象数量;

    java memory = direct memory(直接内存) + jvm memory(MaxPermSize +Xmx)

    jmap -heap 27900
    
    Attaching to process ID 27900, please wait...
    Debugger attached successfully.
    Client compiler detected.
    JVM version is 20.45-b01
    using thread-local object allocation.
    Mark Sweep Compact GC
    Heap Configuration: #堆内存初始化配置
       MinHeapFreeRatio = 40     #-XX:MinHeapFreeRatio设置JVM堆最小空闲比率  
       MaxHeapFreeRatio = 70   #-XX:MaxHeapFreeRatio设置JVM堆最大空闲比率  
       MaxHeapSize = 100663296 (96.0MB)   #-XX:MaxHeapSize=设置JVM堆的最大大小
       NewSize = 1048576 (1.0MB)     #-XX:NewSize=设置JVM堆的‘新生代’的默认大小
       MaxNewSize = 4294901760 (4095.9375MB) #-XX:MaxNewSize=设置JVM堆的‘新生代’的最大大小
       OldSize = 4194304 (4.0MB)  #-XX:OldSize=设置JVM堆的‘老生代’的大小
       NewRatio = 2    #-XX:NewRatio=:‘新生代’和‘老生代’的大小比率
       SurvivorRatio = 8  #-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值
       PermSize = 12582912 (12.0MB) #-XX:PermSize=<value>:设置JVM堆的‘持久代’的初始大小  
       MaxPermSize = 67108864 (64.0MB) #-XX:MaxPermSize=<value>:设置JVM堆的‘持久代’的最大大小  
    Heap Usage:
    New Generation (Eden + 1 Survivor Space): #新生代区内存分布,包含伊甸园区+1个Survivor区
       capacity = 30212096 (28.8125MB)
       used = 27103784 (25.848182678222656MB)
       free = 3108312 (2.9643173217773438MB)
       89.71169693092462% used
    Eden Space: #Eden区内存分布
       capacity = 26869760 (25.625MB)
       used = 26869760 (25.625MB)
       free = 0 (0.0MB)
       100.0% used
    From Space: #其中一个Survivor区的内存分布
       capacity = 3342336 (3.1875MB)
       used = 234024 (0.22318267822265625MB)
       free = 3108312 (2.9643173217773438MB)
       7.001809512867647% used
    To Space: #另一个Survivor区的内存分布
       capacity = 3342336 (3.1875MB)
       used = 0 (0.0MB)
       free = 3342336 (3.1875MB)
       0.0% used
    tenured generation:   #当前的Old区内存分布  
       capacity = 67108864 (64.0MB)
       used = 67108816 (63.99995422363281MB)
       free = 48 (4.57763671875E-5MB)
       99.99992847442627% used
    Perm Generation:     #当前的 “持久代” 内存分布
       capacity = 14417920 (13.75MB)
       used = 14339216 (13.674942016601562MB)
       free = 78704 (0.0750579833984375MB)
       99.45412375710227% used
    
    
    

    5 jinfo

    观察进程运行环境参数,包括Java System属性和JVM命令行参数

    jinfo -flags 53520  查看jvm参数
    jinfo -sysflags 53520  查看系统参数
    jinfo -flag +PrintGC 43520 打开 printgc -关闭 不加是查看
    jinfo -flag -PrintGC 关闭
    jinfo -flag  PrintGC 查看 
    jinfo -flag +PrintGCDetails 43520 
    jinfo -sysflags 53520  查看系统参数
    
    -Xms:初始堆大小,默认为物理内存的1/64(<1GB);默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制
    -Xmx:最大堆大小,默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制
    -Xmn:新生代的内存空间大小,注意:此处的大小是(eden+ 2 survivor space)。与jmap -heap中显示的New gen是不同的。整个堆大小=新生代大小 + 老生代大小 + 永久代大小。在保证堆大小不变的情况下,增大新生代后,将会减小老生代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
    -XX:SurvivorRatio:新生代中Eden区域与Survivor区域的容量比值,默认值为8。两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10。
    -Xss:每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。应根据应用的线程所需内存大小进行适当调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。一般小的应用, 如果栈不是很深, 应该是128k够用的,大的应用建议使用256k。这个选项对性能影响比较大,需要严格的测试。和threadstacksize选项解释很类似,官方文档似乎没有解释,在论坛中有这样一句话:"-Xss is translated in a VM flag named ThreadStackSize”一般设置这个值就可以了。
    -XX:PermSize:设置永久代(perm gen)初始值。默认值为物理内存的1/64。
    -XX:MaxPermSize:设置持久代最大值。物理内存的1/4。
    
    
    

    6 java垃圾回收器查看

    # 查看使用的垃圾回收器
    java -XX:+PrintCommandLineFlags -version
    -XX:+UseSerialGC        新生代和老年代都使用 Serial
    -XX:+UseParNewGC    新生代使用ParNew,老年代使用 Serial old 
    -XX:+UseParallelGC  新生代使用 ParallelGC ,老年代使用 Serial old 
    -XX:+UseConcMarkSweepGC  新生代使用 ParNew 回收器,老年代使用 CMS
    -XX:+UseParallelOldGC 新生代使用 ParallelGC 回收器,老年代使用 ParallelOldGC 回收器。
    
    7 GC Roots
    作为GC Roots的对象包括下面几种:
    1.当前虚拟机栈中局部变量表中的引用的对象
    2.当前本地方法栈中局部变量表中的引用的对象
    3.方法区中类静态属性引用的对象
    4.方法区中的常量引用的对象
    

    jmm结构


    331425-20160623115840235-1252768148.png

    jvm内存结构


    331425-20160623115841781-223449019.png
    运行时数据区域
    331425-20160623115846235-947282498.png

    https://blog.csdn.net/weixin_42447959/article/details/81637909

    https://www.cnblogs.com/andy-zhou/p/5327288.html

    markdown 数学公式

    https://www.cnblogs.com/jngwl/articles/10096017.html

    www.codecogs.com/latex/eqneditor.php

    https://blog.csdn.net/liao0801_123/article/details/83022647

    相关文章

      网友评论

          本文标题:JVM常用操作

          本文链接:https://www.haomeiwen.com/subject/fmokmqtx.html