JVM调优、工具使用与故障分析

柔情痞子 提交于 2019-12-19 03:42:58
一、 JDK运行内存调整:
  • JDK7
-Djdk.tls.ephemeralDHKeySize=2048 -server -Xms512m -Xmx1024m -XX:PermSize=512m -XX:MaxPermSize=512m -XX:MaxNewSize=600m -XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=6 -XX:+ExplicitGCInvokesConcurrent
  • JDK8
JAVA_OPTS="-Xms1024m -Xmx2048m -Xss1024K  -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1024m"
  • TOMCAT调整(Windows):
    catalina.bat:
SET CATALINA_OPTS=-server -Xms512m -Xmx1024m -XX:PermSize=512m -XX:MaxPermSize=512m -XX:MaxNewSize=600m -XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=6 -XX:+ExplicitGCInvokesConcurrent
  • TOMCAT调整(Linux):
    catalina.sh:
CATALINA_OPTS="-server -Xms512m -Xmx1024m -XX:PermSize=512m -XX:MaxPermSize=512m -XX:MaxNewSize=600m -XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=6 -XX:+ExplicitGCInvokesConcurrent"
二、远程调试设置
  • TOMCAT设置(Windows):
SET CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8788
  • TOMCAT设置(Linux):
declare -x CATALINA_OPTS="-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8788" 
三、工具使用
  • jps
    列出JAVA程序路径

    jps -l
    
  • GC信息查看
    jstat -gc PID 周期 总计数
    列出PID进程为2764的统计信息, 每隔250ms统计一次, 共统计20次

    jstat -gc 2764 250 20 : 
    
  • jinfo
    jinfo PID
    显示JAVA进程的JVM配置信息

  • jstack
    jstack -l PID
    显示进程的所有线程堆栈信息

  • jmap
    查看堆使用情况: jmap -heap pid
    查看堆中对象数量和大小: jmap -histo pid
    注意: 如果加上live子参数的话, 会触发一次FUll GC: jmap -histo:live pid
    打印等待终结的对象信息:jmap -finalizerinfo pid
    打印类加载器信息: jmap -clstats pid
    (名称、活跃度、地址、父类加载器、它所加载的类的数量和大小都会被打印)

四、故障分析
1. 获取CPU和内存占用最多的程序
  • linux下获取占用CPU资源最多的10个进程,可以使用如下命令:
    ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head
    
  • 获取占用内存资源最多的10个进程,可以使用如下命令:
    ps aux|head -1;ps aux|grep -v PID|sort -rn -k +4|head
    
  • 获取占用最多线程数的进程, 输出至1.txt文本中:
    ps H -eo user,pid,ppid,tid,time,%cpu,cmd --sort=%cpu > 1.txt
    
2. CPU 100%高占用定位分析
  • 通过top命令, 找出最占cpu的进程
  • 分析进程内部最占CPU的线程:
    top -Hp pid
    或
    top -p pid-H
    
  • 将PID转换成对应的16进制
    printf '%x\n' PID 
    
  • 使用jstack定位线程栈信息:
    jstack 8958 | grep 5c7e
    
3. 获取DUMP日志文件
  • jmap获取:
    jmap -dump:format=b,file=/usr/local/test_jvm.dump PID 
    
  • 发生内存溢出时自动导出DUMP文件:
    追加参数, 指定路径:
    -XX:+HeapDumpOnOutOfMemoryError
    -XX:HeapDumpPath=./
    
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!