Java线上问题调查常用命令

前言

Java性能排查基本操作,本文的排查环境是 Linux。

Java性能相关

  • gc(健康度) , 堆栈(gc不掉的数据), 线程(cpu竞争)

    查看jvm进程
      root用户登陆,jps(JVM Process Status Tools)
    
      查看堆内对象是否正常
      jmap -histo 61367 | more
    
      jstat(JVM Statistics Monitoring Tools)
                jstat主要用于监控虚拟机的各种运行状态信息,如类的装载、内存、垃圾回收、JIT编译器等
                jstat [option vmid [interval [s|ms] [vount] ] ]
                参数interval和count分别表示查询间隔和查询次数,如每1毫秒查询一次进程20445的垃圾回收情况,监控20次,命令如下所示:
                     jstat –gc 20445 1 20
                     --------------------------------------------------------------
                     Option    Function
                     -class    监视类的装载、卸载数量以及类的装载总空间和耗费时间等
                     -gc  监视Java堆,包含eden、2个survivor区、old区和永久带区域的容量、已用空间、GC时间合计等信息
                     -gccapcity     监视内容与-gc相同,但输出主要关注Java区域用到的最大和最小空间
                     -gcutil   监视内容与-gc相同,但输出主要关注已使用空间占总空间的百分比
                     -gccause  与-gcutil输出信息相同,额外输出导致上次GC产生的原因
                     -gcnew    监控新生代的GC情况
                     -gcnewcapacity 与-gcnew监控信息相同,输出主要关注使用到的最大和最小空间
                     -gcold    监控老生代的GC情况
                     -gcoldcapacity 与-gcold监控信息相同,输出主要关注使用到的最大和最小空间
                     -gcpermcapacity     输出永久带用到的最大和最小空间
                     -compiler 输出JIT编译器编译过的方法、耗时信息
                     -printcompilation   输出已经被JIT编译的方法
      example:               
      jstat -gcutil jpsPid 1000 10
    
      --------------------------------------------------------------
                          top
                               H show all thread by process
                               P 按cpu占用排序
                               M 按内存占用排序
                               1 显示cpu个数
      --------------------------------------------------------------
    
      查找占用cpu高的java线程:
                top -H -p javaId                        // 找出java thread id
                printf '0x%x\n' java thread id          // 转16进制
                jstack
    
      jstack用于JVM当前时刻的线程快照,又称threaddump文件,它是JVM当前每一条线程正在执行的堆栈信息的集合。生成线程快照的主要目的是为了定位线程出现长时间停顿的原因,如线程死锁、死循环、请求外部时长过长导致线程停顿的原因。通过jstack我们就可以知道哪些进程在后台做些什么?在等待什么资源等!
                jstack [option] vmid
                     --------------------------------------------------------------
                     Option    Function
                     -F   当正常输出的请求不响应时强制输出线程堆栈
                     -l   除堆栈信息外,显示关于锁的附加信息
                     -m   显示native方法的堆栈信息
                     示例:jstack -l 20445
      jstack Pid > jstack.log 打印堆栈
    
       java堆的经验值:
                Space                                Option                             Occupancy Factor
                Java heap                           -Xmx                               3x or 4x old generation space occupancy after full garbage collection
                Perm Generation                -MaxPermSize                1.2 or 1.5x perm generation space occupancy after full garbage collection
                Young Generation              -Xmn                               1x or 1.5x young generation space occupancy after full garbage collection
                Old Generation                                                           2x or 3x old generation space occupancy after full garbage collection

优化思路

  1. 调整分区的比例;
  2. 尽可能的让gc发生在年轻代中;
  3. 年轻代的大小,起始值,最大值,设置一样;
  4. 设置他进阶的生命周期和进阶允许大小设置。
------本文结束感谢阅读------
显示评论
0%