JVM(四):JVM调优

JVM调优

一、命令大全

1.jps

JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程。

jps [options] [hostid]
-l : 输出主类全名或jar路径
-q : 只输出LVMID
-m : 输出JVM启动时传递给main()的参数
-v : 输出JVM启动时显示指定的JVM参数
jps -l -m

 

2.jstat

jstat [option] LVMID [interval] [count]
  • [option] : 操作参数
  • LVMID : 本地虚拟机进程ID
  • [interval] : 连续输出的时间间隔
  • [count] : 连续输出的次数

 

  • jstat -class 11589 监视类装载、卸载数量、总空间以及耗费的时间
  • jstat -compiler 1262 输出JIT编译过的方法数量耗时等
  • jstat -gc 1262 垃圾回收堆的行为统计
  • jstat -gc 1262 2000 20 每隔2000ms输出1262的gc情况,一共输出20次
  • jstat -gccapacity 1262 同-gc,不过还会输出Java堆各区域使用到的最大、最小空间
  • jstat -gcutil 28920 同-gc,不过输出的是已使用空间占总空间的百分比
  • jstat -gccause 28920 垃圾收集统计概述(同-gcutil),附加最近两次垃圾回收事件的原因
  • jstat -gcnew 28920 统计新生代的行为
  • jstat -gcnewcapacity 28920 新生代与其相应的内存空间的统计
  • jstat -gcold 28920 统计旧生代的行为
  • jstat -gcpermcapacity 28920 永生代行为统计
  • jstat -printcompilation 28920 hotspot编译方法统计

3.jmap

jmap(JVM Memory Map)命令用于生成heap dump文件,如果不使用这个命令,还阔以使用-XX:+HeapDumpOnOutOfMemoryError参数来让虚拟机出现OOM的时候·自动生成dump文件。
jmap不仅能生成dump文件,还阔以查询finalize执行队列、Java堆和永久代的详细信息,如当前使用率、当前使用的是哪种收集器等。

jmap [option] LVMID
  • dump : 生成堆转储快照
  • finalizerinfo : 显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象
  • heap : 显示Java堆详细信息
  • histo : 显示堆中对象的统计信息
  • permstat : to print permanent generation statistics
  • F : 当-dump没有响应时,强制生成dump快照

 

  • jmap -dump:live,format=b,file=dump.hprof 28920   dump堆到文件,format指定输出格式,live指明是活着的对象,file指定文件名
  • jmap -heap 28920                           打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况,可以用此来判断内存目前的使用情况以及垃圾回收情况
  • jmap -histo:live 28920 | more              打印堆的对象统计,包括对象数、内存大小等等 
  • jmap -permstat 28920                       打印Java堆内存的永久保存区域的类加载器的智能统计信息

 

4.jhat

jhat(JVM Heap Analysis Tool)命令是与jmap搭配使用,用来分析jmap生成的dump,jhat内置了一个微型的HTTP/HTML服务器,生成dump的分析结果后,可以在浏览器中查看。

一般不会直接在服务器上进行分析,因为jhat是一个耗时并且耗费硬件资源的过程,一般把服务器生成的dump文件复制到本地或其他机器上进行分析。

jhat [dumpfile]
    • -stack false|true
      关闭对象分配调用栈跟踪(tracking object allocation call stack)。 如果分配位置信息在堆转储中不可用. 则必须将此标志设置为 false. 默认值为 true.>
    • -refs false|true
      关闭对象引用跟踪(tracking of references to objects)。 默认值为 true. 默认情况下, 返回的指针是指向其他特定对象的对象,如反向链接或输入引用(referrers or incoming references), 会统计/计算堆中的所有对象。>
    • -port port-number
      设置 jhat HTTP server 的端口号. 默认值 7000.>
    • -exclude exclude-file
      指定对象查询时需要排除的数据成员列表文件(a file that lists data members that should be excluded from the reachable objects query)。 例如, 如果文件列列出了 java.lang.String.value , 那么当从某个特定对象 Object o 计算可达的对象列表时, 引用路径涉及 java.lang.String.value 的都会被排除。>
    • -baseline exclude-file
      指定一个基准堆转储(baseline heap dump)。 在两个 heap dumps 中有相同 object ID 的对象会被标记为不是新的(marked as not being new). 其他对象被标记为新的(new). 在比较两个不同的堆转储时很有用.>
    • -debug int
      设置 debug 级别. 0 表示不输出调试信息。 值越大则表示输出更详细的 debug 信息.>
    • -version
      启动后只显示版本信息就退出>
    • -J< flag >
      因为 jhat 命令实际上会启动一个JVM来执行, 通过 -J 可以在启动JVM时传入一些启动参数. 例如, -J-Xmx512m 则指定运行 jhat 的Java虚拟机使用的最大堆内存为 512 MB. 如果需要使用多个JVM启动参数,则传入多个 -Jxxxxxx.

jhat -J-Xmx512m dump.hprof

 

5.jstack

jstack用于生成java虚拟机当前时刻的线程快照。

线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。

线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。

如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。

另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。

jstack [option] LVMID
  • -F : 当正常输出请求不被响应时,强制输出线程堆栈
  • -l : 除堆栈外,显示关于锁的附加信息
  • -m : 如果调用到本地方法的话,可以显示C/C++的堆栈

jstack -l 11494|more

 

6.jinfo

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

jinfo [option] [args] LVMID
  • flag : 输出指定args参数的值
  • -flags : 不需要args参数,输出所有JVM参数的值
  • -sysprops : 输出系统属性,等同于System.getProperties()

jinfo -flag 11494

 

二、调优

堆大小调优

一般来说堆越大越好,

  • 可以降低GC频率,但会增加单次GC时间;
  • 对象更有可能成为垃圾

参数

堆每次调整都会触发一次 FullGC,避免频繁调整可以设置-Xms = -Xmx

新生代调优

大小

增大Eden的大小

  降低MinorDC的频率,但不一定会增大MinorGC的时间

参数

  • -XX:NewSize=1024MB        新生代初始大小
  • -XX: MaxNewSize=1024MB  新生代最大值
  • -XX:NewRatio=m    New和   Old的比值
  • -Xmn=1024MB              新生代大小

一般用Xmn固定新生代大小 

晋升

尽可能让对象呆在Survivor中,使之在新生代被回收,同时避免长时间存活的对象在Survivor间不必要的拷贝(Better copy more, than promote more)

-XX: SurvivorRation=m           Eden和Survivor比值

旧生代调优

对于CMS,在不紧要时间段手动FullGC

大小平衡,太大单次GC时长高,太小GC频率高

硬件优化(加CPU),程序优化

 

posted on 2018-10-30 15:38  samuel1  阅读(122)  评论(0编辑  收藏  举报

导航