# OA系统监控详解

位置:登录OA系统管理员后台-系统维护-系统监控

# JVM介绍

1737599404366.png

版本

JVM Version: OpenJDK 64-Bit Server VM (1.8.0_372, 25.372-b07, mixed mode)

1737599895823.png

在 Java 虚拟机(JVM)中,内存分为堆(Heap)和非堆(Non-Heap)两大部分

#

堆内存(Heap Memory)是用于存储所有对象实例和数组的内存区域;是 Java 应用程序的主要内存区域之一,负责动态分配内存以支持对象的生命周期

-Xms: 初始堆内存 -Xmx:最大堆内存

1737599870580.png

堆内存通常分为以下几个区域,以支持不同阶段的对象生命周期管理:

# 新生代(Young Generation):

  • Eden 区:新创建的对象首先分配在 Eden 区。
  • Survivor 区:Eden 区中的对象经过垃圾回收后,如果仍然存活,则移至 Survivor 区。

年轻对象在新生代中快速分配和回收,垃圾回收频率较高。

# 老年代(Old Generation):

长时间存活的对象会从新生代晋升到老年代。 老年代用于存储生命周期较长的对象,垃圾回收频率较低,但回收过程更耗时。

重点关注老年代使用率

1737601510283.png

正常情况下应保持在80%以下,同时没有持续增涨不回收的现象

# 永久代(PermGen)/元空间(Metaspace):

从 Java 8 开始,类元数据存储在元空间(Metaspace),不再属于堆的一部分。

# 非堆

非堆内存用于存储 JVM 自身的类结构和方法,而不是应用程序的对象数据,以下是非堆内存中的几个关键区域

  • Code Cache

当 Java 方法被调用时,JIT 编译器会将字节码编译为本地机器代码,并存储在 Code Cache 中,以提高执行效率。 Code Cache 的大小可以影响应用程序的性能,特别是在需要频繁编译代码的情况下。 可以通过 JVM 参数 -XX:ReservedCodeCacheSize 来调整 Code Cache 的最大大小。

  • Metaspace

从本地内存中分配空间,默认情况下是动态扩展的,受限于可用的系统内存。 可以通过 -XX:MetaspaceSize 和 -XX:MaxMetaspaceSize 参数来设置初始和最大 Metaspace 大小。 增加 Metaspace 的大小可以减少类加载和卸载的频率,从而提高性能。

  • Compressed Class Space

Compressed Class Space 是 Metaspace 中的一个子区域,用于存储类指针的压缩版本。 在 64 位 JVM 中,使用压缩类指针可以减少指针的大小,从而节省内存。 Compressed Class Space 的大小是在 Metaspace 的总大小内计算的,可以通过 -XX:CompressedClassSpaceSize 参数设置

# GC(垃圾回收)

在 Java 虚拟机(JVM)中,垃圾回收(Garbage Collection, GC)是自动管理内存的关键机制。GC 的主要目标是识别和清理不再使用的对象,以释放内存空间。JVM 中的垃圾回收通常分为年轻代(Young Generation)和老年代(Old Generation)两部分

老年代 GC 通常在老年代内存空间不足时触发。当对象在年轻代经过多次垃圾回收后仍然存活,会被晋升到老年代。随着时间的推移,老年代可能会被填满,从而触发老年代 GC,这可能会导致应用程序暂停(Stop-the-World),注意观察老年代gc的时间和次数

Full GC 是一种更全面的垃圾回收过程,通常在以下情况下触发:

  • 老年代空间不足,且无法通过老年代 GC 释放足够的空间。
  • 显式调用 System.gc()(尽管不建议依赖此方法)。
  • Metaspace 或者其他内存区域不足。
  • CMS(Concurrent Mark-Sweep)GC 的失败。

过程: Full GC 会对整个堆内存(包括年轻代和老年代)进行回收。可能还会涉及其他内存区域,如 Metaspace(Java 8 及以上)

1737614707963.png

# 运行模式

运行模式必须是:product

1737616489617.png

# 连接池&线程池

# 连接池

观察数据库连接池的活动连接,可大致判断数据库是否有性能问题 注意最大连接应大于峰值连接数,否则会出现连接池耗尽异常,影响正常业务

1737616583740.png

如果存在大量活动连接堆积,没有及时回收且持续上涨;但活动线程数远低于数据库连接池的活动连接,那么可能存在连接泄露的现象

# 线程池

1737617072989.png

编撰人:wangyxyf