# OA系统监控详解
位置:登录OA系统管理员后台-系统维护-系统监控
# JVM介绍
版本
JVM Version: OpenJDK 64-Bit Server VM (1.8.0_372, 25.372-b07, mixed mode)
在 Java 虚拟机(JVM)中,内存分为堆(Heap)和非堆(Non-Heap)两大部分
# 堆
堆内存(Heap Memory)是用于存储所有对象实例和数组的内存区域;是 Java 应用程序的主要内存区域之一,负责动态分配内存以支持对象的生命周期
-Xms: 初始堆内存 -Xmx:最大堆内存
堆内存通常分为以下几个区域,以支持不同阶段的对象生命周期管理:
# 新生代(Young Generation):
- Eden 区:新创建的对象首先分配在 Eden 区。
- Survivor 区:Eden 区中的对象经过垃圾回收后,如果仍然存活,则移至 Survivor 区。
年轻对象在新生代中快速分配和回收,垃圾回收频率较高。
# 老年代(Old Generation):
长时间存活的对象会从新生代晋升到老年代。 老年代用于存储生命周期较长的对象,垃圾回收频率较低,但回收过程更耗时。
重点关注老年代使用率
正常情况下应保持在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 及以上)
# 运行模式
运行模式必须是:product
# 连接池&线程池
# 连接池
观察数据库连接池的活动连接,可大致判断数据库是否有性能问题 注意最大连接应大于峰值连接数,否则会出现连接池耗尽异常,影响正常业务
如果存在大量活动连接堆积,没有及时回收且持续上涨;但活动线程数远低于数据库连接池的活动连接,那么可能存在连接泄露的现象
# 线程池
快速跳转
← 手动抓取ThreadDump 关于数据字典 →
