Java应用实例监控

Java应用安装探针后,ARMS即可开始监控Java应用,您可以在实例监控页面了解应用的基础监控、实例GCJVM内存等信息。

前提条件

重要

ARMS应用监控面向已开通新版计费的用户提供全新的监控详情页面,新版计费详情,请参见产品计费(新版)

对于未开通新版计费的用户,如需查看新版监控详情页面,可在应用列表页面单击切换新版

已为应用安装探针,具体操作,请参见应用监控接入概述

查看实例监控

  1. 登录ARMS控制台,在左侧导航栏选择应用监控 > 应用列表

  2. 应用列表页面顶部选择目标地域,然后单击目标应用名称。

    说明

    语言列的图标含义如下:

    Java图标:接入应用监控的Java应用。

    image:接入应用监控的Golang应用。

    image:接入应用监控的Python应用。

    -:接入可观测链路 OpenTelemetry 版的应用。

  3. 在上方导航栏单击实例监控

页面说明

实例监控页面会根据应用接入的信息自动适配展示大盘,并针对ECS环境和容器环境做区别展示。

在容器场景下,如果已经接入可观测监控 Prometheus 版,则优先以可观测监控 Prometheus 版数据作为容器信息的展示。容器环境接入可观测监控 Prometheus 版的操作,请参见容器可观测

容器环境如果未接入可观测监控 Prometheus 版,需要确保应用监控探针版本在4.1.0或以上,对应数据展示容器的基础信息。应用监控探针说明,请参见探针(Java Agent)版本说明

ECS环境

image.png

  • 在快捷筛选区域(图示①),您可以按主机地址对图表、实例列表进行筛选。

  • 在趋势图区域(图示②),您可以查看实例的基础监控、实例GCJVM内存的时序曲线。

    • 基础监控:应用在指定时间范围内CPU、内存和磁盘使用率趋势图。通过图标名称右侧的下拉框可以切换展示各使用率的平均值和最大值。

    • 实例GC:应用在指定时间范围内Full GCYoung GC的趋势图。通过图表名称右侧的下拉框可以切换展示GC的次数和平均耗时。

    • JVM内存:应用在指定时间范围内堆内存已使用和最大值趋势图。通过图标名称右侧的下拉框可以切换展示非堆内存已使用和最大值趋势图。

      说明

      ARMS应用监控采集的数据来自JMX,其中非堆内存所包含的内存区域比Java进程中实际的非堆内存区域少,因此可能会出现监控中堆内存+非堆内存总和与通过top命令看到的RES大小存在一定差值,相关细节请参见JVM监控内存详情说明

    单击image.png图标,可以在弹出的对话框中查看该指标在某个时间段的统计情况或对比不同日期在同一时间段的统计情况,通过选择image.png图标可以切换柱状图、趋势图进行展示。

  • 在实例列表区域(图示③),您可以查看实例IP、CPU利用率、内存利用率、磁盘利用率、负载、Full GC次数、Young GC次数、堆内存使用量、非堆内存使用量、RED三指标(请求数、错误数、平均耗时)等信息。

    在实例列表,您可以执行以下操作:

    • 单击实例IP,可以查看实例详情,更多信息,请参见实例详情

    • 单击操作列的调用链,可以查看该实例的链路详情。更多信息,请参见调用链分析

容器环境(Prometheus版)

image

  • 在快捷筛选区域(图示①),您可以按集群和主机地址对图表、实例列表进行筛选。

  • 在趋势图区域(图示②),您可以查看实例的基础监控、实例GCJVM内存的时序曲线。

    • 基础监控:应用在指定时间范围内CPU用量和内存用量趋势图。

    • 实例GC:应用在指定时间范围内Full GCYoung GC的趋势图。通过图表名称右侧的下拉框可以切换展示GC的次数和平均耗时。

    • JVM内存:应用在指定时间范围内堆内存已使用和最大值趋势图。通过图标名称右侧的下拉框可以切换展示非堆内存已使用和最大值趋势图。

      说明

      ARMS应用监控采集的数据来自JMX,其中非堆内存所包含的内存区域比Java进程中实际的非堆内存区域少,因此可能会出现监控中堆内存+非堆内存总和与通过top命令看到的RES大小存在一定差值,相关细节请参见JVM监控内存详情说明

    单击image.png图标,可以在弹出的对话框中查看该指标在某个时间段的统计情况或对比不同日期在同一时间段的统计情况,通过选择image.png图标可以切换柱状图、趋势图进行展示。

  • 在实例列表区域(图示③),您可以查看实例IP、CPU用量、CPU请求、CPU限制、CPU利用率(未设置CPU限制时,此项展示为-)、内存用量、内存请求、内存限制、内存利用率(未设置内存限制时,此项展示为-)、磁盘用量、磁盘限制、磁盘利用率(未设置磁盘限制时,此项展示为-)、负载、Full GC 次数、Young GC 次数、堆内存使用量、非堆内存使用量、RED三指标(请求数、错误数、平均耗时)等。

    在实例列表,您可以执行以下操作:

    • 单击实例IP操作列的详情,可以查看实例详情,更多信息,请参见实例详情

    • 单击操作列的调用链,可以查看该实例的链路详情。更多信息,请参见调用链分析

容器环境(ARMS自采集版)

image

  • 在快捷筛选区域(图示①),您可以按主机地址对图表、实例列表进行筛选。

  • 在趋势图区域(图示②),您可以查看实例的基础监控、实例GCJVM内存的时序曲线。

    • 基础监控:应用在指定时间范围内CPU用量和内存用量趋势图。

    • 实例GC:应用在指定时间范围内Full GCYoung GC的趋势图。通过图表名称右侧的下拉框可以切换展示GC的次数和平均耗时。

    • JVM内存:应用在指定时间范围内堆内存已使用和最大值趋势图。通过图标名称右侧的下拉框可以切换展示非堆内存已使用和最大值趋势图。

      说明

      ARMS应用监控采集的数据来自JMX,其中非堆内存所包含的内存区域比Java进程中实际的非堆内存区域少,因此可能会出现监控中堆内存+非堆内存总和与通过top命令看到的RES大小存在一定差值,相关细节请参见JVM监控内存详情说明

    单击image.png图标,可以在弹出的对话框中查看该指标在某个时间段的统计情况或对比不同日期在同一时间段的统计情况,通过选择image.png图标可以切换柱状图、趋势图进行展示。

  • 在实例列表区域(图示③),您可以查看实例IP、CPU用量、内存用量、负载、Full GC 次数、Young GC 次数、堆内存使用量、非堆内存使用量、RED三指标(请求数、错误数、平均耗时)等。

    在实例列表,您可以执行以下操作:

    • 单击实例IP操作列的详情,可以查看实例详情,更多信息,请参见实例详情

    • 单击操作列的调用链,可以查看该实例的链路详情。更多信息,请参见调用链分析

实例详情

概览

概览页签可以查看目标接口的请求数、错误数、平均耗时和慢调用信息。

image.png

JVM监控

JVM监控页签可以查看对应实例的GC、内存、线程、文件等信息。

image.png

池化监控

池化监控页签可以查看应用所使用的线程池或连接池的各项指标,包括核心线程数量、当前线程数量、最大线程数量、活跃线程数量、任务队列容量。

image.png

展开查看池化监控支持的框架。

线程池支持的框架

4.1.x及以上探针版本

支持框架:

  • java.util.ThreadPoolExecutor:一般用于Tomcat8~9.1、Dubbo、HSF、Vertx以及用户自定义线程池。

  • org.apache.tomcat.util.threads.ThreadPoolExecutor:一般用于Tomcat9.1+。

  • org.eclipse.jetty.util.thread.QueuedThreadPool:一般用于Jetty。

  • org.xnio.XnioWorker:一般用于Undertow。

采集的指标如下:

指标名

支持框架

指标描述

arms_thread_pool_core_pool_size

  • ThreadPoolExecutor(JDK)

  • ThreadPoolExecutor(Tomcat 9.1+)

  • XnioWorke

  • QueuedThreadPool

核心线程数,一般是静态配置,不会改变。

arms_thread_pool_max_pool_size

  • ThreadPoolExecutor(JDK)

  • ThreadPoolExecutor(Tomcat 9.1+)

  • XnioWorke

  • QueuedThreadPool

最大空闲连接数,一般是静态配置,不会改变。

arms_thread_pool_active_thread_count

  • ThreadPoolExecutor(JDK)

  • ThreadPoolExecutor(Tomcat 9.1+)

  • XnioWorke

  • QueuedThreadPool

活跃线程数,即当前正在执行任务的线程。

arms_thread_pool_current_thread_count

  • ThreadPoolExecutor(JDK)

  • ThreadPoolExecutor(Tomcat 9.1+)

  • QueuedThreadPool

当前线程数,包含活跃线程数和当前正在等待任务的线程数。

arms_thread_pool_max_thread_count

  • ThreadPoolExecutor(JDK)

  • ThreadPoolExecutor(Tomcat 9.1+)

线程池历史最大线程数。

arms_thread_pool_scheduled_task_count

  • ThreadPoolExecutor(JDK)

  • ThreadPoolExecutor(Tomcat 9.1+)

线程池调度任务数。

arms_thread_pool_completed_task_count

  • ThreadPoolExecutor(JDK)

  • ThreadPoolExecutor(Tomcat 9.1+)

线程池执行完成任务数。

arms_thread_pool_rejected_task_count

  • ThreadPoolExecutor(JDK)

  • ThreadPoolExecutor(Tomcat 9.1+)

  • QueuedThreadPool

线程池拒绝任务数。

arms_thread_pool_queue_size

  • ThreadPoolExecutor(JDK)

  • ThreadPoolExecutor(Tomcat 9.1+)

  • XnioWorke

  • QueuedThreadPool

线程池任务队列大小。

4.1.x以下探针版本

线程池监控支持Tomcat、HSF、Dubbo、Vert.xUndertow框架,其中,3.1.x及以下版本探针支持Undertow1.x~Undertow2.0.x版本线程池监控,3.2.x及以上版本探针支持Undertow所有版本线程池监控。

采集的指标如下:

指标名称

指标

线程池核心线程数

arms_threadpool_core_size

线程池最大线程数

arms_threadpool_max_size

线程池活跃线程数

arms_threadpool_active_size

线程池队列大小

arms_threadpool_queue_size

线程池当前大小

arms_threadpool_current_size

线程池监控支持SchedulerX框架,采集的指标如下:

指标名称

指标

线程池活跃线程数

arms_threadpool_active_size

连接池支持的框架

4.1.x及以上探针版本

支持框架:DBCP(>2.0)、Vibur DBCP(>11.0)、c3p0(>0.9.2)、Druid、HikariCP(>3.0)、Jedis(>3.0)、Lettuce(>5.0)、Redisson(>3.0)。

采集的指标如下:

指标名

支持框架

指标描述

arms_connection_pool_connection_count

DBCP、c3p0、Vibur DBCP、Druid、Hikaricp、Jedis、Lettuce、Redisson

连接数,可通过State区分ActiveIdle连接数。

arms_connection_pool_connection_min_idle_count

DBCP、Jedis、Druid、HikariCP、Lettuce

最小空闲连接数,一般是静态配置,不会改变。

arms_connection_pool_connection_max_idle_count

DBCP、Jedis、Druid、Lettuce、

最大空闲连接数,一般是静态配置,不会改变。

arms_connection_pool_connection_max_count

DBCP、Druid、Vibur DBCP、HikariCP

最大连接数,一般是静态配置,不会改变。

arms_connection_pool_pending_request_count

c3p0、HikariCP、Jedis

阻塞的连接请求数。

4.1.x以下探针版本

连接池监控支持okHttp2、okHttp3框架,采集的指标如下:

指标名称

指标

连接池活跃连接数

arms_threadpool_active_size

连接池当前连接数

arms_threadpool_current_size

连接池监控支持Apache HTTPClient框架,采集的指标如下:

指标名称

指标

连接池当前连接数

arms_threadpool_current_size

连接池最大连接数

arms_threadpool_max_size

连接池等待队列数

arms_threadpool_queue_size

连接池监控支持Druid框架,采集的指标如下:

指标名称

指标

连接池活跃连接数

arms_threadpool_active_size

连接池最大连接数

arms_threadpool_max_size

连接池监控支持Hikaricp框架,采集的指标如下:

指标名称

指标

连接池活跃连接数

arms_threadpool_active_size

连接池最大连接数

arms_threadpool_max_size

主机监控

主机监控页签可以查看CPU、内存、Disk(磁盘)、Load(负载)、网络流量和网络数据包的各项指标。

image.png

容器监控

容器环境(Prometheus版)

接入可观测监控 Prometheus 版的操作请参见Prometheus实例 for 容器服务

容器监控页签可以查看容器视角的CPU、内存、Disk(磁盘)、Load(负载)、网络流量和网络数据包的各项指标。

image.png

容器环境(ARMS自采集版)

未接入可观测监控 Prometheus 版的情况下,需要确保ARMS探针版本在4.1.0或以上。探针版本说明请参见探针(Java Agent)版本说明

容器监控页签可以查看容器视角的CPU、内存、网络流量的时序曲线。

image

调用链分析

调用链分析功能基于已存储的全量链路明细数据,通过自由组合筛选条件与聚合维度进行实时分析,可以满足不同场景的自定义诊断需求。更多信息,请参见调用链分析Span数据信息

相关文档

应用监控详细的指标信息,请参见应用监控指标说明

常见问题

应用级别的数据与单机的数据是什么关系

  • RED(请求数、错误数、延迟)指标:

    • 请求数、慢调用次数、HTTP状态码次数:应用级别的数据是单机级别数据的汇总。

    • 响应时间:应用级别的数据是单机级别数据的平均值。

  • JVM指标:

    • GC次数、GC耗时:应用级别的数据是单机级别数据的汇总。

    • 堆内存数据、线程数:应用级别的数据是单机级别数据取最大值。

  • 线程池/连接池指标

    所有指标:应用级别的数据是单机级别数据的平均值。

  • 系统指标

    所有指标:应用级别的数据是单机级别数据取最大值。

  • SQL/NSQL调用:同RED指标,对于次数类指标,应用级别的数据是单机级别数据的汇总;对于其余指标,应用级别的数据是单机级别数据的平均值。

  • 异常指标:应用级别的数据是单机级别数据的汇总。

不同实例之间流量不均匀

3.x版本探针中,如果打开了内存优化开关,可能会导致部分指标统计丢失。该问题已在4.x版本探针中修复。

Undertow一次请求被统计成了两次

3.2.x版本之前探针埋点方法在使用DeferredResult场景下一次调用中会被执行两次。该问题已在3.2.x及以上版本中修复。

容器监控中CPU/内存配额与Pod实际设置不一致

请检查您的Pod中是否定义了多个Container,该指标会统计所有Container加起来的总配额。

系统指标部分缺失、不准或者CPU使用率展示为100%

4.x之前版本探针不支持Windows环境下系统指标采集,4.x及以后版本探针已经修复。

为什么应用刚启动会FullGC

一般是因为用户没有配置元空间大小,默认的元空间大小约为20 MB,应用在刚启动的时候可能会进行元空间的扩容从而触发FullGC,可通过-XX:MetaspaceSize参数和XX:MaxMetaspaceSize参数设置初始元空间和最大元空间大小。

VM Stack指标是如何计算的

该指标是通过线程数×1 MB得到的,其中1 MB是线程堆栈默认大小。如果通过-Xss参数重新指定了线程堆栈大小,则该数据与实际情况会有差异。

JVM指标获取原理

ARMS展示的JVM指标均是通过标准的JDK接口获取的,对应接口如下:

内存相关指标:

  • ManagementFactory.getMemoryPoolMXBeans

  • java.lang.management.MemoryPoolMXBean#getUsage

GC相关指标:

  • ManagementFactory.getGarbageCollectorMXBeans

  • java.lang.management.GarbageCollectorMXBean#getCollectionCount

  • java.lang.management.GarbageCollectorMXBean#getCollectionTime

为什么JVM最大堆内存值为-1

-1代表未设置最大堆内存大小。

为什么JVM堆内存使用总量不等于设置的堆内存最大值

根据JVM内存分配机制,-Xms参数指定初始堆内存分配,当空余堆内存不足后扩容,直到达到-Xmx参数设置的最大值,总量与最大量不一致说明还没触发扩容,使用量是当前实际用量。

JVM GC的频率逐渐加快

可能是使用了JDK 8默认的GC算法ParallelGC,该算法默认开启了-XX:+UseAdaptiveSizePolicy,其作用是自动调整堆的大小,包括新生代大小、SurvivorRatio等参数,为了满足GC的停顿时间,当YounGC比较频繁时,可能会动态缩小Survivor区的大小,这时候Survivor区的对象很容易晋升到Old区,导致Old区空间涨幅过快,从而触发Full GC的频率也加快。更多信息,请参见Java官方文档

线程池、连接池监控没有数据

  1. 自定义配置页面的高级设置区域确认是否已经开启线程池、连接池监控开关。

  2. 检查框架是否在支持的范围内,具体内容,请参见线程池和连接池监控

HikariCP连接池获取的最大连接数与实际不符

3.2.x版本之前的探针获取最大连接数代码有误,3.2.x及以上版本已经修复。

池化监控指标展示数值是小数

探针每隔15s采集一次,因此一分钟会采集4个点的数据,控制台会根据采集信息展示一个时间段的平均值。例如:一分钟采集的4个数据点为0、 0、 1、 0,理论上平均值为0.25。

线程池/连接池明明被打满了,但为什么监控上没有体现出来

如果您的日志或其他记录中确实看到线程池/连接池被打满,但是ARMS控制台却看不到相关指标的增长,有可能是由于指标采样时间点与打满的时间点错开导致的。目前ARMS自动采集线程池/连接池状态指标的时间间隔为15s,发生在这个时间段内的瞬时冲高可能不会被采集到。

线程池监控最大线程数不符合预期或者最大线程数为21亿

ARMS最大线程池是直接调用线程池对象的获取最大线程数方法得到的,一般不会出错。如果不符合用户预期可能是用户设置的最大线程数未生效。

如果最大线程数为21亿一般是调度线程池,在调度线程池中,默认设置的最大线程数是Integer.MAX_VALUE,如下图所示。

image