Java JVM:虚拟机性能监控、故障处理工具(三)

一、基础故障处理工具

  • JMC(Java Mission Control)以及JFR(Java Flight Recorder)
    • JMC 从 Java7 以后包含在 JDK 中,直接输入 jmc 就能启动
    • 在使用之前需要配置 Java 进程支持 JMX 连接,在启动时加入配置
      • -Dcom.sun.management.jmxremote.port=7091
      • -Dcom.sun.management.jmxremote.authenticate=false
      • -Dcom.sun.management.jmxremote.ssl=false
    • 取消锁定商业功能开启飞行记录配置(二选一)
      • jcmd pid VM.unlock_commercial_features
      • -XX:+UnlockCommercialFeatures -XX:+FlightRecorder

在这里插入图片描述

  • jps:Java Virtual Machine Process Status Tool 虚拟机进程状况工具
    • 语法:jps [options] [hostid]
      • -q:只输出 PID
      • -m:输出传递给 main 方法的参数
      • -l:完整包名或应用程序 JAR 文件的完整路径名
      • -v:查看虚拟机启动时显示指定的参数列表
    • 可以列出正在运行的虚拟机进程,并显示虚拟机执行主类名称以及这些进程的本地虚拟机唯一ID
    • 还可以通过RMI协议查询开启了RMI服务的远程虚拟机进程状态,参数hostid为RMI注册表中注册的主机名

在这里插入图片描述

  • jstat:虚拟机统计信息监视工具
    • 用于监控虚拟机各种运行状态信息的命令行工具
    • 可以显示虚拟机进程中的类加载、内存、垃圾收集、即使编译等运行时数据
      • 每250毫秒查询一次进程2764垃圾收集情况,一共查询20次
      • jstat -gc 2764 250 20
      • 查询结果表明,2764 进行的新生代 Eden 区(E) 使用 6.2% 空间,2 个 Survivor 区(S0、S1) 里面是空的,老年代(O) 和永久代§ 分别使用 41.42% 和 47.20% 空间,MinorGC (YGC) 16次,耗时(YGCT) 0.105 秒,Full GC (FGC) 3次,耗时(FGCT) 0.472 秒,所有 GC 总耗时 (GCT) 0.577 秒

在这里插入图片描述

  • jinfo:Java配置信息工具
    • 实时查看和调整虚拟机各项参数
  • jmap:Java内存映像工具
    • 生成堆转储快照,还可以查询finalize执行队列、Java堆和方法区的详细信息
  • jhat:虚拟机堆转储快照分析工具
    • 与jmap搭配使用,分析jmap生成的堆转储信息
    • 一般不会在部署应用程序的服务器上直接分析
  • jstack:Java堆栈跟踪工具
    • 生成虚拟机当前时刻的线程快照,同事用于定位线程出现长时间停顿的原因

二、可视化故障处理工具

  • JHSDB:基于服务性代理的调试工具
  • JConsole:Java监视与管理控制台
  • VisualVM:多合-故障处理工具
  • Java Mission Control:可持续在线的监控工具

三、其他故障相关

  • 大内存硬件上的程序部署策略
    • 单体应用在较大内存的硬件上主要的部署方式
      • 通过一个单独的Java虚拟机实例来管理大量的Java堆内存
        • 回收大块堆内存而导致的长时间停顿
        • 大内存必须有64位Java虚拟机的支持
        • 必须保证应用程序足够稳定,发生堆内存溢出要产生大容量的快照文件
        • 相同的程序在64位虚拟机中消耗的内存一般比32位虚拟机要大
      • 同时使用若干个Java虚拟机,建立逻辑集群来利用硬件资源
        • 节点竞争全局的资源,最典型的就是磁盘竞争
        • 很难最高效率地利用某些资源池,比如连接池
        • 节点不可避免地受到32位的内存限制,每个进程只能使用2GB的内存
        • 大量使用本地缓存
  • 集群间同步导致的内存溢出
  • 堆外内存导致的溢出错误
    • Java堆外内存限制
      • 直接内存:可通过-XX:MaxDirectMemorySize调整大小
      • 线程堆栈:可通过-Xss调整大小,内存不足抛出StackOverflowError
      • Socket缓存区:每个Socket连接都Receive和Send两个缓存区
      • JNI代码:如果代码中使用了JNI调用本地库,那本地库使用的内存也不在堆中
      • 虚拟机和垃圾收集器:工作时需要消耗一定量的内存
  • 外部命令导致系统缓慢
  • 服务器虚拟机进程崩溃
  • 不恰当数据结构导致内存占用过大
  • 由Windows虚拟内存导致的长时间停顿
  • 由安全点导致长时间停顿

猜你喜欢

转载自blog.csdn.net/baidu_40468340/article/details/128548313