更新时间:2022-02-21 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。

Full GC

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

Minor GC

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

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

图2 内存区域图解

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

线程指标图表

图3所示,展示设置的时间段内某个实例的线程数、粘滞线程、专用线程等线程执行情况的趋势。

图3 线程指标图
表2 线程说明

线程名称

说明

总数

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

死锁

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

粘滞线程

如果执行线程处理某个请求的粘滞时间超过配置的粘滞线程最长时间 ,则该线程标记为粘滞线程。

专用线程

如果某个请求独占执行线程的时间超过正常执行时间且不超过粘滞线程最长时间,则该线程标记为专用线程。

执行总数

是指正在执行的线程数,包含活动执行和空闲执行的线程数。

活动执行

是指活动的线程数,包含粘滞线程数、专用线程数和正在执行的线程数。

空闲执行

是指处于空闲状态的线程数。 当没有任务时线程处于空闲状态,收到请求时,线程池给此请求分配一个空闲线程,任务完成后回到线程池中等待下次任务。

添加阈值规则

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

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

  3. 填写规则参数,如下图示例,最后单击“确认”。