概述
性能诊断是软件工程师在日程工作中需要经常面对和解决的问题。在用户体验至上的今天,解决好应用的性能问题能带来非常大的收益。
Java作为最流行的编程语言之一,其应用性能诊断一直受到业界广泛关注。可能造成Java应用出现性能问题的因素非常多,例如线程控制、磁盘读写、数据库访问、网络I/O、垃圾收集等。想要定位这些问题,一款优秀的性能诊断工具必不可少。
体会1:使用数据说明问题,使用知识分析问题,使用工具处理问题。
体会2:无监控、不调优!
jps
- 查看正在运行的Java进程
- 基本情况
jps(Java Process Status):显示指定系统内所有的HotSpot虚拟机进程(查看虚拟机进程信息),可用于查询正在运行的虚拟机进程。
说明:对应本地虚拟机进程来说,进程的本地虚拟机ID与操作系统的进程ID是一致的,是唯一的。
- 基本情况
- 基本语法
jstat(JVM statistics Monitoring Tool)
- 用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。
- 在没有GUI图形界面,只提供了纯问题控制台环境的服务器上,它将是运行期定位虚拟机性能问题的首选工具。常用于检测垃圾回收问题以及内存泄漏问题。
- 基本语法
- option参数
jinfo(Configuration Info for Java)
- 查看虚拟机配置参数信息,也可用于调整虚拟机的配置参数。
- 在很多情况下,Java应用程序不会指定所有的Java虚拟机参数。而此时,开发人员可能不指定某一个具体的Java虚拟机参数的默认值。在这种情况下,可能需要通过查找文档获取某个参数的默认值。这个查找过程可能是非常艰难的。但有了jinfo工具,开发人员可以很方便地找到java虚拟机参数的当前值。
- jinfo不仅可以查看运行时某一个Java虚拟机参数的实际取值,甚至可以在运行时修改部分参数,并使之立即生效。
- 但是,并非所有参数都支持动态修改。参数只有被标记为manageable的flag可以被实时修改。其实,这个修改能力是极其有限的。
- 可以查看被标记为manageable的参数(linux环境下)。
java -XX:+PrintFlagFinal -version | grep manageable
- 具体操作
扩展
- 举例
jmap
导出内存映像文件&内存使用情况。
jmap(JVM Memory Map):作用一方面是获取dump文件(堆转储快照文件,二进制文件),它还可以获取目标Java进程的内存相关信息,包括Java堆各区域的使用情况、堆中对象的统计信息、类加载信息等。
开发人员可以在控制台中输入 jmap -help查询jmap工具的具体使用方式和一些标准选项配置。
基本语法
作用
- 导出内存映像文件。
- 显示堆内存相关信息。
- jmap -heap pid
- jmap -histo
- 其他作用
- jmap -permstat pid 查看系统的ClassLoader信息
- jmap -finalizerinfo 查看堆积在finalizer 队列中的对象
jhat :JDK自带堆分析工具
jhat(JVM Heap Analysis Tool)
- Sun JDK提供的jhat命令与jmap命令搭配使用,用于分析jmap生成的heap dump文件(堆转储快照)。jhat内置了一个微型的HTTP/HTML服务器,生成dump文件的分析结果后,用户可以在浏览器中查看分析结果(分析虚拟机转储快照信息)。
- 使用了jhat命令,就启动了一个http服务,端口是7000,即http://localhost:7000/. 就可以在浏览器里分析。
- jhat命令在jdk9、jdk10中已经被删除,官方建议使用VisualVM代替。
jstack:打印线程快照
基本情况
jstack(JVM Stack Trace):用于生成虚拟机指定进程当前时刻的线程快照(虚拟机堆栈跟踪)。线程快照就是当前虚拟机内指定进程的每一条线程正在执行的方法堆栈的集合。
生成线程快照的作用:可用于定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等问题。这些都是导致线程长时间停顿的常见原因。当线程出现停顿时,就可以用jstack显示各个线程调用的堆栈情况。
在thread dump中,要留意下面几种状态
- 死锁,Deadlock(重点关注)
- 等待资源,Waiting on condition(重点关注)
- 等待获取监视器,Waiting on monitor entry(重点关注)
- 阻塞,Blocked(重点关注)
- 执行中,Runnable
- 暂停,Suspended
基本语法
jcmd:多功能命令行
在JDK 1.7以后,新增了一个命令行工具jcmd。
它是一个多功能的工具,可以用来实现前面除了jstat之外所有命令的功能。比如:用它来导出堆、内存使用、查看Java进程、导出线程信息、执行GC、JVM运行时间等。
jcmd用于jmap的大部分功能,并且在oracle的官网上也推荐使用jcmd命令代替jmap命令。
基本语法
jstatd:远程主机信息收集
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/100379.html