更新时间:2022-04-13 GMT+08:00

JVM监控

JVM监控展示基于Java应用的JVM运行环境的内存和线程指标,您可以实时监控指标趋势进行性能分析。

JVM监控功能提供JVM内存和线程指标,您可以单击“内存”和“线程”两个页签,查看内存和线程指标图,快速分析定位内存泄漏、线程异常等问题。

内存指标图表

图1所示,展示设置的时间段内某个实例的总内存、堆内存、非堆内存等JVM不同内存区域的最大值、分配值和使用情况的趋势,也展示设置的时间段内某个实例的垃圾收集堆的GC时间和GC次数趋势。

图1 内存指标图

JVM内存介绍

JVM区域总体分为Heap memory和Non-Heap memory。

  • Heap memory:堆是Java 虚拟机运行时数据区域,分配所有实例和数组的内存。对象的堆内存由称为垃圾回收器的自动内存管理系统回收。Heap区分为Eden Space、Survivor Space和Tenured Space。
  • Non-Heap memory:Java 虚拟机管理堆之外的内存。Non-Heap区分为Code Cache、Permanent Space或Meta Space。

Java堆是垃圾收集器管理的主要区域,又称为Garbage Collection Heap,GC方式包括Full GC和Minor GC。

表1 内存区域说明

区域名称

说明

Eden Space

用于最初从线程池分配内存给大部分对象。

Survivor Space

用于保存在Eden区内存池中经过垃圾回收后没有被回收的对象。

Tenured Space

用于保持已经在Survivor区内存池中存在了一段时间的对象。

Code Cache

用于编译和保存本地代码的内存。

Permanent Space

用于保存虚拟机的静态数据,例如,类和方法对象。

Meta Space

用于保存本地化内存中类的元数据。Java 8之后Meta Space替代Permanent Space。

Direct Buffer

监控直接缓冲区的使用情况。

Full GC

当内存回收之后仍无法满足内存空间分配需求时, 对整个堆空间(新生代、老年代和永久代)进行垃圾收集。

Minor GC

当分配对象遇到内存不足时,对新生代空间(Eden区和Survivor区)进行垃圾收集。

JVM采用分代垃圾回收。在JVM的内存空间中把堆空间分为老年代和新生代。将大量(90%以上)创建后短期消亡的对象存储在新生代,而老年代中存放生命周期长久的实例对象。新生代空间分为Eden区和两个Survivor区。新对象首先分配在Eden区,Survivor区作为Eden区和Tenured区的缓冲,在Survivor区的对象经历若干次收集仍然存活的,就会被转移到老年区,如图2所示。

图2 内存区域图解

新生代共有两个Survivor区,分别用from和to指针指代,其中to指针指向空的Survivor区。

线程指标图表

图3所示,展示设置的时间段内某个实例的New线程数、Runnable线程数、Blocked线程数、Waiting线程数等线程执行情况的趋势。

图3 线程指标图

表2 线程说明

线程名称

说明

总数

是指总线程数,包含活动线程数和备用线程数。粘滞线程和专用线程在执行完成后变为备用线程。

死锁

是指两个或两个以上的线程在执行过程中,由于竞争资源或彼此通信而造成的阻塞现象,导致系统处于死锁状态。

New线程数

新建线程数量。

Runnable线程数

可运行线程数量。

Blocked线程数

阻塞线程数量。

Waiting线程数

等待中线程数量。

TimedWaiting线程数

限时等待线程数量。

Terminated线程数

终结线程数量。

最大连接数

Tomcat可用的最大连接数。

当前连接数

Tomcat当前已占用的连接数。

最大线程数

Tomcat最大执行线程数。

当前线程数

Tomcat当前执行线程数。

繁忙线程数

Tomcat当前处理任务的执行线程数。

添加阈值规则

您可以给JVM内存及线程的各个指标添加阈值规则,当满足规则条件时会触发告警,提醒您关注。

  1. 在“JVM监控”界面,先在页面左上角选择应用,再选择服务的具体某个实例。
  2. 在右侧的趋势图中可给内存或线程的每个指标设置阈值规则。单击趋势图上的“添加阈值规则”。

  3. 填写规则参数,如下图示例,最后单击“确认”。若需要发送告警通知,则“发送通知”需要选择“是”,并选择主题。

    添加至服务参数说明:

    • 若选择“是”,表示添加阈值规则到整个服务;
    • 若选择“否”,表示添加阈值规则到单个实例。