
# JVM监控
JVM监控展示基于Java应用的JVM运行环境的内存和线程指标，您可以实时监控指标趋势进行性能分析。
JVM监控功能提供JVM内存和线程指标，您可以单击"内存"和"线程"两个页签，查看内存和线程指标图，快速分析定位内存泄漏、线程异常等问题。
#### 内存指标图表
如[图1]所示，展示设置的时间段内某个实例的总内存、堆内存、非堆内存等JVM不同内存区域的最大值、分配值和使用情况的趋势，也展示设置的时间段内某个实例的垃圾收集堆的GC时间和GC次数趋势。
图1内存指标图   
![](https://support.huaweicloud.com/usermanual-apm/zh-cn_image_0193932524.png "点击放大")
**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内存区域图解   
![](https://support.huaweicloud.com/usermanual-apm/zh-cn_image_0171729875.png "点击放大")
![](https://support.huaweicloud.com/usermanual-apm/public_sys-resources/note_3.0-zh-cn.png)
新生代共有两个Survivor区，分别用from和to指针指代，其中to指针指向空的Survivor区。
#### 线程指标图表
如[图3]所示，展示设置的时间段内某个实例的New线程数、Runnable线程数、Blocked线程数、Waiting线程数等线程执行情况的趋势。
图3线程指标图   
![](https://support.huaweicloud.com/usermanual-apm/zh-cn_image_0000001079397308.png "点击放大")
表2线程说明 
| 线程名称            | 说明                                                 |
|:---|:---|
| 总数              | 是指总线程数，包含活动线程数和备用线程数。粘滞线程和专用线程在执行完成后变为备用线程。        |
| 死锁              | 是指两个或两个以上的线程在执行过程中，由于竞争资源或彼此通信而造成的阻塞现象，导致系统处于死锁状态。 |
| New线程数          | 新建线程数量。                                            |
| Runnable线程数     | 可运行线程数量。                                           |
| Blocked线程数      | 阻塞线程数量。                                            |
| Waiting线程数      | 等待中线程数量。                                           |
| TimedWaiting线程数 | 限时等待线程数量。                                          |
| Terminated线程数   | 终结线程数量。                                            |
| 最大连接数           | Tomcat可用的最大连接数。                                    |
| 当前连接数           | Tomcat当前已占用的连接数。                                   |
| 最大线程数           | Tomcat最大执行线程数。                                     |
| 当前线程数           | Tomcat当前执行线程数。                                     |
| 繁忙线程数           | Tomcat当前处理任务的执行线程数。                                |
   
#### 添加阈值规则
您可以给JVM内存及线程的各个指标添加阈值规则，当满足规则条件时会触发告警，提醒您关注。
1. 在"JVM监控"界面，先在页面左上角选择应用，再选择服务的具体某个实例。
2. 在右侧的趋势图中可给内存或线程的每个指标设置阈值规则。单击趋势图上的"添加阈值规则"。 
   ![](https://support.huaweicloud.com/usermanual-apm/zh-cn_image_0193933511.png "点击放大")
   
   
3. 填写规则参数，如下图示例，最后单击"确认"。若需要发送告警通知，则"发送通知"需要选择"是"，并选择主题。 
   ![](https://support.huaweicloud.com/usermanual-apm/public_sys-resources/note_3.0-zh-cn.png)
   添加至服务参数说明：
   - 若选择"是"，表示添加阈值规则到整个服务；
   
   - 若选择"否"，表示添加阈值规则到单个实例。
    
   ![](https://support.huaweicloud.com/usermanual-apm/zh-cn_image_0193934181.png "点击放大")
   
   
 
