JVM诊断调优CheatSheet

标签: 基础技术 JVM 调优 | 发表时间:2017-04-11 07:16 | 作者:liuchi1993
出处:http://www.importnew.com

常用Shell命令

  • 查看网络状况
     netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
  • 使用top去获取进程cpu使用率;使用/proc文件查看进程所占内存。
     #!/bin/bash
      for i in `ps -ef | egrep -v "awk|$0" | awk '/'$1'/{print $2}'`
      do
          mymem=`cat /proc/$i/status 2> /dev/null | grep VmRSS | awk '{print $2" " $3}'`
          cpu=`top -n 1 -b |awk '/'$i'/{print $9}'`
      done

常用JDK命令

  • 查看类的一些信息,如字节码的版本号、常量池等

    javap -verbose classname

  • 查看jvm进程

    jps

    jcmd -l

  • 查看进程的gc情况

    jstat -gcutil [pid] (显示总体情况)

    jstat -gc [pid] 1000 10(每隔1秒刷新一次 一共10次)

  • 查看jvm内存使用状况

    jmap -heap [pid]

  • 查看jvm内存存活的对象:

    jcmd [pid] GC.class_histogram

    jmap -histo:live [pid]

  • 把heap里所有对象都dump下来,无论对象是死是活

    jmap -dump:format=b,file=xxx.hprof [pid]

  • 先做一次full GC,再dump,只包含仍然存活的对象信息:

    jcmd [PID] GC.heap_dump [FILENAME]

    jmap -dump:format=b,live,file=xxx.hprof [pid]

  • 线程dump

    jstack [pid] #-m参数可以打印出native栈的信息

    jcmd Thread.print

    kill -3 [pid]

  • 查看目前jvm启动的参数

    jinfo -flags [pid] #有效参数

    jcmd [pid] VM.flags #所有参数

  • 查看对应参数的值

    jinfo -flag [flagName] [pid]

  • 启用/禁止某个参数

    jinfo -flag [+/-][flagName] [pid]

  • 设置某个参数

    jinfo -flag [flagName=value] [pid]

  • 查看所有可以设置的参数以及其默认值

    java -XX:+PrintFlagsInitial

第三方工具

======== awesome-scripts========

安装:

curl -s "https://raw.githubusercontent.com/superhj1987/awesome-scripts/master/self-installer.sh" | bash -s

使用:

  • 显示最繁忙的java线程: -c <要显示的线程栈数> -p <指定的Java Process>

    opscipts show-busy-java-threads [-c] [-p]

  • 使用greys跟踪方法耗时

    opscripts greys [@IP:PORT]

    ga?: trace [class] [method]

  • 显示当前cpu和内存使用状况,包括全局和各个进程的。

    opscripts show-cpu-and-memory

  • 进入jvm调试交互命令行,包含对java栈、堆、线程、gc等状态的查看

    opscripts jvm [pid]

JVM配置示例

-server #64位机器下默认
-Xms6000M #最小堆大小
-Xmx6000M #最大堆大小
-Xmn500M #新生代大小
-Xss256K #栈大小
-XX:PermSize=500M (JDK7)
-XX:MaxPermSize=500M (JDK7)
-XX:MetaspaceSize=128m  (JDK8)
-XX:MaxMetaspaceSize=512m(JDK8)
-XX:SurvivorRatio=65536
-XX:MaxTenuringThreshold=0 #晋升到老年代需要的存活次数,设置为0时,survivor区失去作用,一次minor gc,eden中存活的对象就会进入老年代,默认是15,使用CMS时默认是4
-Xnoclassgc #不做类的gc
#-XX:+PrintCompilation #输出jit编译情况,慎用
-XX:+TieredCompilation #启用多层编译,jd8默认开启
-XX:CICompilerCount=4 #编译器数目增加
-XX:-UseBiasedLocking #取消偏向锁
-XX:AutoBoxCacheMax=20000 #自动装箱的缓存数量,如int默认缓存为-128~127
-Djava.security.egd=file:/dev/./urandom #替代默认的/dev/random阻塞生成因子
-XX:+AlwaysPreTouch #启动时访问并置零内存页面,大堆时效果比较好
-XX:-UseCounterDecay #禁止JIT调用计数器衰减。默认情况下,每次GC时会对调用计数器进行砍半的操作,导致有些方法一直是个温热,可能永远都达不到C2编译的1万次的阀值。
-XX:ParallelRefProcEnabled=true # 默认为false,并行的处理Reference对象,如WeakReference
-XX:+DisableExplicitGC #此参数会影响使用堆外内存,会造成oom,如果使用NIO,请慎重开启
#-XX:+UseParNewGC #此参数其实在设置了cms后默认会启用,可以不用设置
-XX:+UseConcMarkSweepGC #使用cms垃圾回收器
#-XX:+UseCMSCompactAtFullCollection #是否在fullgc是做一次压缩以整理碎片,默认启用
-XX:CMSFullGCsBeforeCompaction=0 #full gc触发压缩的次数
#-XX:+CMSClassUnloadingEnabled #如果类加载不频繁,也没有大量使用String.intern方法,不建议打开此参数,况且jdk7后string pool已经移动到了堆中。开启此项的话,即使设置了Xnoclassgc也会进行class的gc, 但是某种情况下会造成bug:https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=5&cad=rja&uact=8&ved=0ahUKEwjR16Wf6MHQAhWLrVQKHfLdCe4QFgg8MAQ&url=https%3A%2F%2Fblogs.oracle.com%2Fpoonam%2Fentry%2Fjvm_hang_with_cms_collector&usg=AFQjCNFNtkw6jHM-uyz-Wjri3LtAVXWJ8g&sig2=BFxSfHc-AIek18fEhY07mg。
#-XX:+CMSParallelRemarkEnabled #并行标记, 默认开启, 可以不用设置
#-XX:+CMSScavengeBeforeRemark #强制remark之前开始一次minor gc,减少remark的暂停时间,但是在remark之后也将立即开始又一次minor gc
-XX:CMSInitiatingOccupancyFraction=90 #触发full gc的内存使用百分比
-XX:+PrintClassHistogram #打印类统计信息
-XX:+PrintHeapAtGC #打印gc前后的heap信息
-XX:+PrintGCDetails #以下都是为了记录gc日志
-XX:+PrintGCDateStamps
-XX:+PrintGCApplicationStoppedTime #打印清晰的GC停顿时间外,还可以打印其他的停顿时间,比如取消偏向锁,class 被agent redefine,code deoptimization等等
-XX:+PrintTenuringDistribution #打印晋升到老年代的年龄自动调整的情况(并行垃圾回收器启用UseAdaptiveSizePolicy参数的情况下以及其他垃圾回收期也会动态调整,从最开始的MaxTenuringThreshold变成占用当前堆50%的age)
#-XX:+UseAdaptiveSizePolicy # 此参数在并行回收器时是默认开启的会根据应用运行状况做自我调整,如MaxTenuringThreshold、survivor区大小等,其他情况下最好不要开启
#-XX:StringTableSize #字符串常量池表大小(hashtable的buckets的数目),java 6u30之前无法修改固定为1009,后面的版本默认为60013,可以通过此参数设置
-XX:GCTimeLimit=98 #gc占用时间超过多少抛出OutOfMemoryError
-XX:GCHeapFreeLimit=2 #gc回收后小于百分之多少抛出OutOfMemoryError
-Xloggc:/home/logs/gc.log

 

相关文章

相关 [jvm 诊断 cheatsheet] 推荐:

JVM诊断调优CheatSheet

- - ImportNew
使用top去获取进程cpu使用率;使用/proc文件查看进程所占内存. 查看类的一些信息,如字节码的版本号、常量池等. 查看进程的gc情况. jstat -gcutil [pid] (显示总体情况). jstat -gc [pid] 1000 10(每隔1秒刷新一次 一共10次). 查看jvm内存使用状况.

Java调优CheatSheet

- - 后端技术杂谈 | 飒然Hang
包含调优java程序的各种命令以及jvm配置示例. 使用top去获取进程cpu使用率;使用/proc文件查看进程所占内存. 查看jvm内存存活的对象:. 把heap里所有对象都dump下来,无论对象是死是活. 先做一次full GC,再dump,只包含仍然存活的对象信息:. 查看类的一些信息,如字节码的版本号、常量池等.

Gentoo, Debian 和 OS X 软件包管理器 Cheatsheet

- David Ruan - LinuxTOY
Gentoo, Debian 和 OS X 软件包管理器 cheatsheet. 放出部分积累的Gentoo, Debian 和 OS X Cheatsheet. 请不要在生产环境玩,请不要在自己的机器上玩,导致rm -rf /usr /这种问题,我一概不负责任,除非你是MM. 为什么 rpm/yum 一列为空捏.

JVM研究

- - 开源软件 - ITeye博客
每天接客户的电话都是战战兢兢的,生怕再出什么幺蛾子了. 我想Java做的久一点的都有这样的经历,那这些问题的最终根结是在哪呢. JVM全称是Java Virtual Machine,Java虚拟机,也就是在计算机上再虚拟一个计算机,这和我们使用 VMWare不一样,那个虚拟的东西你是可以看到的,这个JVM你是看不到的,它存在内存中.

jvm调优

- - 互联网 - ITeye博客
printf "%x\n" 21742  找到耗时最长的进程. jstack pid | grep 54ee  定位某个类的方法. jstack 10535|grep -A 10 2a1d (最后十行). jmap 查询pid 内存线程. 附:TOP命令中需要关注的值:. (1)load average:此值反映了任务队列的平均长度;如果此值超过了CPU数量,则表示当前CPU数量不足以处理任务,负载过高.

【JVM故障问题排查心得】「内存诊断系列」Xmx和Xms的大小是小于Docker容器以及Pod的大小的,为啥还是会出现OOMKilled?

- - 掘金 后端
为什么我设置的大小关系没有错,还会OOMKilled. 这种问题常发生在JDK8u131或者JDK9版本之后所出现在容器中运行JVM的问题:在大多数情况下,JVM将一般默认会采用宿主机Node节点的内存为Native VM空间(其中包含了堆空间、直接内存空间以及栈空间),而并非是是容器的空间为标准.

学习JVM的References

- LightingMan - 淘宝JAVA中间件团队博客
本blog中列举了我学习JVM的references,会不断的更新,为了避免版权问题,就不在blog上提供references的下载了,感兴趣的同学可自行下载或购买,:). |— [ Hotspot GC论文 ]. |— [ 其他JVM GC ]. |— Linux内核源代码情景分析. |— Linux 内核中断内幕.

深入理解JVM

- 小伟 - ITeye论坛最新讨论
1   Java技术与Java虚拟机. 说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成: Java编程语言、Java类文件格式、Java虚拟机和Java应用程序接口(Java API). 图1   Java四个方面的关系. 运行期环境代表着Java平台,开发人员编写Java代码(.java文件),然后将之编译成字节码(.class文件).

jvm垃圾回收

- Cano - 淘宝共享数据平台 tbdata.org
在jvm中堆空间划分为三个代:年轻代(Young Generation)、年老代(Old Generation)和永久代(Permanent Generation). 年轻代和年老代是存储动态产生的对象. 永久带主要是存储的是java的类信息,包括解析得到的方法、属性、字段等等. 我们这里讨论的垃圾回收主要是针对年轻代和年老代.

JVM内存分配

- - 移动开发 - ITeye博客
计算机内存,它算是CPU与计算机打交道最频繁的区域,所有数据都是先经过硬盘至内存,然后由CPU再从内存中获取数据进行处理,又将数据保存到内存,通过分页或分片技术将内存中的数据再flush至硬盘. 那JVM的内存结构到底是如何呢. JVM做为一个运行在操作系统上,但又独立于os运行的平台,它的内存至少应该包括象寄存器、堆栈等区域.