- content
功能说明
JvmMemoryUtil 是一个 JVM 内存管理和监控工具,提供内存状态检测、内存清理、内存不足处理等功能,帮助应用程序在内存紧张时采取相应措施。
内存状态检测
import cn.sybn.singleutil.sys.JvmMemoryUtil;
// 检测当前内存是否充足
boolean isFree = JvmMemoryUtil.isMemoryFree();
// 等待指定毫秒数,如果内存仍然不足则返回 false
boolean hasMemory = JvmMemoryUtil.waitMemoryFree(1000); // 等待1秒
// 检测 CPU 负载是否低于阈值(0.8 = 80%)
boolean isCpuIdle = JvmMemoryUtil.isCpuIdle(0.8);
// 获取系统CPU全核总负载
double cpuLoad = JvmMemoryUtil.getSystemCpuLoad();
内存使用情况获取
// 获取内存使用情况字符串,如 "1.5GB/4GB"
String memoryStr = JvmMemoryUtil.getUseMemoryStr();
// 获取包含 CPU 使用率的内存信息,如 "1.5GB/4GB CPU:10%"
String memoryCpuStr = JvmMemoryUtil.getUseMemoryCPUStr();
// 获取最大内存(格式化输出)
String maxMemory = JvmMemoryUtil.getMaxMemory();
// 获取已用内存(格式化输出)
String usedMemory = JvmMemoryUtil.getTotalUseMemory();
// 格式化指定字节数为易读格式
String formattedMemory = JvmMemoryUtil.formatMemory(1048576); // 输出 1M
// 获取已用内存(KB单位)
long usedMemoryK = JvmMemoryUtil.getTotalUseMemoryK();
// 获取已用内存(MB单位)
long usedMemoryM = JvmMemoryUtil.getTotalUseMemoryM();
内存检查和异常处理
// 检查内存,如果不足则根据配置决定是否中断线程
try {
JvmMemoryUtil.checkMemory();
} catch (InterruptedException e) {
// 处理内存不足异常
}
// 带等待时间的内存检查
try {
JvmMemoryUtil.checkMemory(2000); // 等待2秒
} catch (InterruptedException e) {
// 处理内存不足异常
}
// 检查内存并在不足时执行特定操作
try {
JvmMemoryUtil.checkMemory(() -> {
// 内存不足时执行的操作
System.out.println("内存不足,执行清理操作");
});
} catch (InterruptedException e) {
// 处理内存不足异常
}
详细内存信息获取
// 获取完整的 JVM 内存信息
Map<String, Object> vmMemoryInfo = JvmMemoryUtil.getVmMemory();
// 获取特定内存池信息
// 包含 server_time, server_pid, jvm_runtime, jvm_heapMemoryUsage 等信息
内存清理功能
// 手动触发内存清理
JvmMemoryUtil.clearMemory();
// 注册自定义内存清理函数
JvmMemoryUtil.clearMemoryFunctions.add(() -> {
// 自定义清理逻辑
});
// 获取上次清理内存的时间
long lastClearTime = JvmMemoryUtil.clearMemoryTime.get();
配置选项
内存不足时的行为控制
// 设置当内存不足时是否中断当前线程(默认为 true)
JvmMemoryUtil.threadInterrupted = false; // 适用于 ETL 等独占任务
// true = [默认] 内存不足时中断当前线程,防止整个 JVM 出错,适用于 Java Web 项目
// false = 内存不足时只告警,不做额外处理,适用于 ETL 等独占任务
应用场景
- Web 应用: 在内存不足时安全地中断请求处理线程,避免影响整个应用
- 批处理任务: 在长时间运行的任务中定期检查内存使用情况
- 性能监控: 实时监控应用内存使用状况并记录日志
- 资源密集型应用: 在内存紧张时自动清理缓存和其他临时数据
内存充足判断标准
- 老年代内存: 如果
PS Old Gen的使用量小于提交内存的 95%,则认为内存充足 - 堆内存: 如果堆使用量小于最大堆内存的 80%,则认为内存充足
- 总内存: 如果已分配内存小于最大内存的 95%,则认为内存充足
- 可用内存: 如果可用内存大于最大内存的 15%,则认为内存充足