JVM--虚拟机性能监控与故障处理简介

1、JDK的命令行工具

​   JDK中sun公司附加了一些工具,主要包括监视虚拟机故障处理的工具.这些工具都非常小,只是jdk/lib/tools.jar的一层封装而已.

 1.1 jps: 虚拟机进程状况工具

​   jps(JVM Process Status),取名来自UNIX的ps指令(ps -ef的那个).功能也类似:可以列出正在运行的虚拟机进程,并显示虚拟机执行主类名称以及这些进程的本地虚拟机唯一ID.

 1.2 jstat: 虚拟机统计信息监视工具

​   jstat是用于监视虚拟机各种运行状态信息的命令行工具.可以显示本地或者远程虚拟机进程中的类装载,内存,垃圾收集,JIT编译等运行数据.

 1.3 jinfo: Java配置信息工具

​   jinfo的作用是实时地查看和调整虚拟机各项参数.

 1.4 jmap: Java内存映像工具

​   jmap命令用于生成堆转储快照.

 1.5 jhat: 虚拟机堆转储快照分析工具

​   分析jmap生成的堆转储快照.

 1.6 jstack: Java堆栈跟踪工具

​   用于生成虚拟机当前时刻的线程快照.线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合.

 1.7 HSDIS: JIT生成代码反汇编

​   将JIT动态生成的代码还原为汇编代码输出,并生成大量非常有价值的注释.

2、 JDK的可视化工具

 2.1 JConsole

  JConsole是一个内置Java性能分析器,可以从命令行或在GUI shell中运行.可以轻松地使用JConsole监控Java应用程序性能和跟踪Java中的代码.

 2.2 VisualVM

  VisualVM是一款免费的,集成了多个JDK命令行工具的可视化工具,它能提供强大的分析能力,对Java应用程序做性能分析和调优.这些功能包括生成和分析海量数据、跟踪内存泄漏、监控垃圾回收器、执行内存和 CPU 分析,同时它还支持在MBeans上进行浏览和操作.

3、调优案例分析

 (1). 高性能硬件上的程序部署策略

  高性能硬件上部署程序,目前主要有两种方式:

   1. 通过64位JDK来使用大内存
   2. 使用若干个32位虚拟机建立逻辑集群来利用硬件资源

  ​ 给Java虚拟机分配超大堆的前提是有把握把应用程序的Full GC频率控制得足够低,至少低到不会影响用户使用,因为超大的堆也意味着GC非常的耗时.

​   控制Full GC频率的关键是看应用中绝大多数对象能否符合"朝生夕灭"的原则,也就是大多数对象的生存时间不应该太长,尤其不能有成批量的,长时间生存的大对象,以保证老年代空间的稳定.

  如果使用64位JDK来管理大内存,还应该考虑以下问题:

   1. 内存回收到时长时间停顿.
   2. 64位JDK的性能普遍低于32位JDK
   3. 需要程序足够稳定,因为这种应用一旦堆溢出几部无法产生堆转储快照,页几乎无法分析.
   4. 相同程序下一般64位JDK比32位JDK消耗内存大,这是因为指针膨胀,数据类型对齐补白等因素.

 (2). 集群间同步导致的内存溢出

 (3). 堆外内存导致的溢出错误

​   垃圾收集时虚拟机虽然会对Direct Memory(堆外内存)进行回收,但Direct Memory不能像新生代和老生代那样发现内存不足时通知进行GC,只能等Full GC的时候顺便进行这部分内存的收集.

 (4). 外部命令导致系统缓慢

 (5). 服务器JVM进程崩溃

 (6). 不恰当数据结构导致内存占用过大

 (7). 由Windows虚拟内存导致的长时间停顿

发布了121 篇原创文章 · 获赞 45 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_41596568/article/details/102905504