监控 Java 虚拟机( JVM )

您可以使用 Instana 对 Java 虚拟机( JVM )进行全面监控,从而识别瓶颈并优化性能。 要监控 JVM ,请安装 Instana 主机代理。 安装代理后, Instana Java 传感器会自动激活,收集实时指标和跟踪数据,您可以在 Instana 用户界面中查看这些数据。

Java 传感器为受支持的技术提供自动代码插桩功能,支持对 JVM 实例进行零配置健康监测,并能跨所有系统对请求进行端到端追踪。

补充信息

Java 传感器支持以下语言、操作系统和运行时环境:

支持的语言

该传感器支持以下语言:

  • Clojure
  • Java
  • Kotlin
  • Scala

受支持的操作系统

Java 传感器支持符合主机代理要求的操作系统,具体信息可在各主机代理的“支持的操作系统”部分中查看,例如 Unix 的“支持的操作系统 ”。

系统需求

在安装 Instana 代理之前,请确保满足必要的系统要求。 如需更多信息,请参阅系统要求

安装 Instana 代理程序

要监控 JVM ,您必须安装 Instana 主机代理。 如需更多信息,请参阅 “安装主机代理 ”。 该代理会自动部署、配置并安装 Java 传感器。 为确保您的 Java 应用程序已进行性能监控,请确认您的 JVM 发行版受支持。

注意: 请勿同时使用多家供应商的代理。 您可能会遇到无法预料的结果,这可能会导致应用程序故障。 如需更多信息,请参阅 “不兼容的代理”

将 JVM 排除在监控之外

为避免 Instana 代理连接到 JVM ,您可以在 JVM 环境中将 INSTANA_IGNORE true 环境变量设置为。

可选:配置传感器

安装 Instana 代理后, Java 传感器将自动安装并完成配置。 虽然对于开箱即用的度量和分布式跟踪,您不需要任何配置,但可以配置传感器的各个组件。

有关配置传感器的更多信息,请参阅 《配置 Java 传感器 》。

配置完 Java 传感器后,它会自动开始从 JVM 收集指标。 您可以在 Instana 用户界面中查看这些指标。 Java 传感器还支持 Instana 的其他功能,例如自动跟踪、自定义跟踪和自动性能分析。

配置数据

下表列出了从 JVM 实例中收集的配置数据:

配置 描述
Java 版本 JVM 使用的 Java 版本
Java 运行时 Java 运行时环境(JRE)的实现
堆最大值 JVM 可用的最大堆内存大小
类路径 在 JVM 中设置的类路径参数
JVM 自变量 传递给 JVM 的启动选项和配置参数
服务 由 Instana 识别和监控的逻辑服务名称

绩效指标

以下性能指标是从 JVM 实例中收集的:

内存度量值

下表总结了用于衡量 JVM 中内存使用情况的内存指标:

性能指标 描述 数据源 单元
已使用的内存 JVM 当前使用的总内存 java.lang.Runtime#totalMemory 字节
堆内存 JVM 可用的最大堆内存大小 - 已用堆内存:与 java.lang.Runtime#totalMemoryjava.lang.Runtime#freeMemory 之间的差值。 - 最大堆内存大小:通过解析 命令行 -Xmx 参数确定,或从 中获取 java.lang.Runtime#maxMemory。 - 堆内存使用率:(已用堆内存 / 总堆内存) * 100 java.lang.Runtime 方法 字节或百分比 (%)
内存池 堆内存池和非堆内存池的内存池使用情况,以图表形式显示在所选时间段内 ManagementFactory#getMemoryPoolMXBeans 字节
使用中 JVM 当前使用的堆内存大小(使用量和利用率) java.lang.management.MemoryUsage 用法: MiB 利用率:百分比 (%)
游泳池 由 JVM 管理的内存区域的名称 ManagementFactory#getMemoryPoolMXBeans
早年 JVM 启动时分配的初始内存大小 getInit 字节
最大值 JVM 可以为该池分配的最大内存大小 getMax 字节
当前已使用的内存大小 getUsage 字节

Threads 指标

下表总结了与线程指标相关的信息:

性能指标 描述 数据源 单元
线程 在选定时间段内,处于不同状态的线程数量(以图表形式显示): new, runnable, timed-waiting, waiting, 或 blocked java.lang.management.ThreadMXBean#getAllThreadIds 计数
已创建但尚未启动的线程数 ThreadMXBean#getThreadInfo 计数
可运行 / 可执行 可运行且符合CPU执行条件的线程数 ThreadMXBean#getThreadInfo 计数
计时等待 等待指定时间段的线程数 ThreadMXBean#getThreadInfo 计数
正在等待 等待指定时间段的线程数 ThreadMXBean#getThreadInfo 计数
已阻止 等待获取锁时被阻塞的线程数 ThreadMXBean#getThreadInfo 计数

垃圾回收(GC)指标

下表总结了与垃圾回收指标相关的信息:

性能指标 描述 数据源 单元
垃圾回收 在选定时间段内,垃圾回收的激活情况及运行时值以图表形式展示 - 垃圾回收信息: ManagementFactory#getGarbageCollectorMXBeans - 图值: java.lang.management.GarbageCollectorMXBean
PS 搜刮时间 Young 区域中用于垃圾回收的总时间(Eden + Survivor)(次要垃圾回收) getCollectionTime 毫秒
附注: MarkSweep 时间 旧区域中垃圾回收(GC)所耗费的总时间(主要垃圾回收) getCollectionTime 毫秒
PS 回收呼叫 次要 GC 运行次数 getCollectionCount 计数
附注: MarkSweep 呼叫 主要GC运行次数 getCollectionCount 计数
注:
  • `getCollectionTime` 且 `getCollectionCount` 的值是 1‑second 区间内计算出的微分。
  • `getCollectionTime` 这是累计垃圾回收所耗费的大致时间(单位为毫秒)。
  • `getCollectionCount` 是调用次数。

应用程序度量值

下表总结了与应用程序性能指标相关的信息:

性能指标 描述 数据源 单元
暂停 / 中断 过去一秒内,应用程序执行时间因 JVM、操作系统或 CPU 调度而延迟。 根据应用内 Instana 测量线程计算得出。 毫秒

衍生指标

下表列出了基于性能指标生成的可用指标,这些指标是根据 JVM 实例计算得出的:

绩效指标 描述 数据源 指标名称
垃圾回收后的内存 垃圾回收(GC)事件发生后,应用程序所占用的内存量。 当 JVM 传感器报告全局垃圾回收被调用时,将使用当时的内存值来报告“GC 后的内存”值。 内存使用统计信息和垃圾回收事件 memory.gc.after
GC 之前的内存 在发生垃圾回收(GC)事件之前,应用程序所占用的内存量。 当 JVM 传感器报告全局垃圾回收被调用时,会使用此次调用之前的内存值来报告“垃圾回收前的内存”值。 内存使用统计信息和垃圾回收事件 memory.gc.before
垃圾回收后的内存使用率 垃圾回收(GC)事件发生后,应用程序占用的可用内存总量所占的比例。 这是全局垃圾回收后已用内存占 JVM 所用最大内存的百分比。 内存使用性能统计、最大内存使用量以及垃圾回收统计 memory.gc.afterPercentage
GC 前的内存使用率 在垃圾回收(GC)事件发生前,应用程序占用的可用内存总量所占的比例。 这是全局垃圾回收前已使用内存占 JVM 所用最大内存的百分比。 内存使用性能统计、最大内存使用量以及垃圾回收统计 memory.gc.beforePercentage

健康指标

每个传感器都有一个经过整理的运行状况特征知识库,这些特征会根据传入度量值不断进行评估。 这些运行状况特征符用于引发依赖于用户影响的问题或事件。

内置事件根据实体上失败的运行状况特征符来触发问题或事件,而定制事件根据任何实体的单个指标的阈值来触发问题或事件。

有关 Java 传感器内置事件的更多信息,请参阅 “内置事件参考 ”。

定制指标

Instana 支持一些常用的 Java 指标库。 如果您使用以下库,可以手动对应用程序代码进行instrumentation以收集自定义指标:

如需更多信息,请参阅 “自定义跟踪 ”。

使用 Dropwizard 指标对自定义 JVM 进行监控

如果 JVM 加载了 Dropwizard 指标库,则会收集自定义指标,并在 JVM 仪表板上显示。 为防止后端过载,指标 200 数量设有默认上限。

若要禁用或更改收集指标的限制,请使用以下配置:

com.instana.plugin.java:
  dropwizardMetricCollection:
    enabled: false
    limit: 200
 

如果您正在将 Dropwizard 指标作为 Dropwizard 框架的一部分使用,请参阅《 监控 Dropwizard 》。

其他指标

除了配置、性能和自定义指标外, Java 传感器还会收集其他指标,例如实时线程转储和堆转储。

实时线程转储

要查看 JVM 的实时线程转储,请单击获取线程转储

堆转储

要为 JVM 创建堆转储,请单击获取堆转储。 要存储堆转储文件,请指定位于 JVM 内的存储位置。

跟踪 Java 应用程序

Instana 中的 Java 传感器使用以下方法来跟踪 Java 应用程序:

  • Instana AutoTrace :无需手动配置或修改代码,即可自动追踪 Java 应用程序。
  • 自定义追踪 :通过手动在 Java 应用程序代码的特定部分添加代码片段,以捕获自定义指标并获得更深入的洞察。
  • Instana AutoProfile : Java 应用程序的自动性能分析功能可提供有关性能、CPU 使用率、内存分配及其他系统资源的详细信息。

Instana AutoTrace

默认情况下, Java 传感器会监控所有请求,并为每个请求自动创建一个分布式追踪。 此分布式追踪支持跨主机和跨语言追踪。 如需了解更多信息,请访问 InstanaAutoTrace™

您可以在 Instana 用户界面中查看这些跟踪记录。 如需了解更多信息,请参阅 “分析跟踪记录和调用”

正在记录

您只能查看级别为 WARN 及更高级别的日志。

当使用 Log4j、 Log4j2 或 Logback 来实现日志与跟踪之间的更精确关联时, Instana 会自动将跟踪 ID 填入映射诊断上下文 (MDC) 中。 MDC 变量名称为 instana.trace.id。 有关在格式字符串中使用日志记录框架的更多信息,请参阅日志记录框架的文档。

定制跟踪

Java 传感器提供了一套开箱即用的全自动跟踪监视工具。 但在某些情况下,您可能更希望将自定义跟踪数据发送至您的 Instana 仪表板。 您可以使用以下方法来实现定制跟踪:

基于配置的 Java 跟踪SDK

您可能会遇到这样的情况:使用 Java Trace SDK(这需要修改源代码或联系能够进行此类操作的人员)既不可行,也不理想。 在这种情况下,请使用基于配置的 Java Trace SDK。 尽管功能不如基于编程的 Java Trace SDK 丰富,但基于配置的 Java Trace SDK支持对跨度(spans)和标签(tags)进行声明式配置,可满足许多常见用例的需求。

在您使用基于配置的 Java Trace SDK 实现自定义追踪之前,请参阅追踪最佳实践

Java OpenTracing API

要收集通过 OpenTracing API 描述的跟踪记录,您必须使用 Java OpenTracing。 有关更多信息,请参阅 OpenTracing

重要提示: 在使用 Java OpenTracing API 之前,请先禁用自动跟踪功能( Instana AutoTrace™ )。 如需更多信息,请参阅 “禁用 Java 跟踪仪器 ”。

OpenCensus Instana Trace Exporter

Instana 为使用 Java 编写的应用程序提供了一个 OpenCensus 跟踪导出器。 通过将 Instana 代理进程用作代理, Instana 会将由已部署Census的应用程序导出的跟踪信息转发至其后端。

如需更多信息,请参阅 OpenCensus 出口商

重要提示: 如果代理与Census位于同一主机上,请禁用自动跟踪( Instana AutoTrace™ )。 如需了解更多信息,请参阅 “禁用 Java 跟踪仪器 ”。

Instana AutoProfile

在代码级别查找性能热点和瓶颈时,概要文件至关重要。 它们在减少资源消耗和提高性能方面发挥了重要作用。

Instana AutoProfile™ 生成进程配置文件并将其上报至 Instana。 与开发阶段和按需分析器不同,后者需要手动启动分析,而 AutoProfile™ 会自动安排并持续执行分析,非常适合关键的生产环境。

如需了解更多信息,请访问 Instana AutoProfile™

不包括 JVM

您可以在 JVM 环境中将 INSTANA_IGNORE true 环境变量设置为 ,以避免将 Instana 代理连接到 JVM。

故障诊断

您可能会遇到与 Instana 相关的监控问题。 有关更多信息,请参阅故障诊断