
Java 监控详细使用教程
一、Java 监控简介和重要性
Java 监控是确保应用稳定运行的关键手段,通过实时监控可以及时发现和解决性能问题。
监控目标
| 指标类型 | 说明 |
|---|---|
| CPU 使用率 | 处理器负载情况 |
| 内存使用 | Heap 和 Non-Heap 内存 |
| GC 情况 | 垃圾回收频率和时间 |
| 线程状态 | 活跃线程数和阻塞线程 |
| JVM 参数 | 运行时参数配置 |
JVM 内存结构
JVM 内存
├── 线程共享区域
│ ├── Heap(堆)
│ │ ├── Young Generation
│ │ │ ├── Eden Space
│ │ │ ├── Survivor Space (S0, S1)
│ │ └── Old Generation
│ └── Metaspace(元空间)
└── 线程私有区域
├── Program Counter Register
├── Java Stack
└── Native Method Stack
二、JMX(Java Management Extensions)基础
JMX 架构
JMX 提供了管理和管理应用程序的标准架构:
┌─────────────────────────────────────┐
│ Management Agents │
│ ┌─────────────┐ ┌──────────────┐ │
│ │ MBean Server│ │ MBeans │ │
│ │ (核心) │←→│(管理对象) │ │
│ └─────────────┘ └──────────────┘ │
├─────────────────────────────────────┤
│ JMX Connector Server │
│ ┌─────────────┐ ┌──────────────┐ │
│ │ RMI Connector│ │ HTTP Connector│ │
│ └─────────────┘ └──────────────┘ │
└─────────────────────────────────────┘
创建自定义 MBean
“`java
// 1. 定义管理接口
public interface MonitorMBean {
void startMonitoring();
void stopMonitoring();
int getActiveThreads();
long getMemoryUsage();
}
// 2. 实现类
public class Monitor implements MonitorMBean {
private volatile boolean isMonitoring = false;
@Override
public void startMonitoring() {
isMonitoring = true;
System.out.println(“Monitoring started”);
}
@Override
public void stopMonitoring() {
isMonitoring = false;
System.out.println(“Monitoring stopped”);
}
@Override
public int getActiveThreads() {
return Thread.activeCount();
}
@Override
public long getMemoryUsage() {
Runtime runtime = Runtime.getRuntime();
return runtime.totalMemory() – runtime.freeMemory();
}
}
JMX 连接示例
java
import javax.management.*;
import javax.management.remote.*;
public class JMXExample {
public static void main(String[] args) throws Exception {
// 创建连接
JMXServiceURL url = new JMXServiceURL(
“service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi”
);
Map
String[] credentials = {“admin”, “admin123”};
env.put(JMXConnector.CREDENTIALS, credentials);
JMXConnector connector = JMXConnectorFactory.connect(url, env);
MBeanServerConnection mbsc = connector.getMBeanServerConnection();
// 查询内存属性
ObjectName name = new ObjectName(“java.lang:type=Memory”);
AttributeList attributes = mbsc.getAttributes(name,
new String[]{“HeapMemoryUsage”, “NonHeapMemoryUsage”});
System.out.println(attributes);
connector.close();
}
}
三、JVM 内置监控工具
jstat - JVM 统计监视
bash
查看 GC 统计(每 1000ms 刷新一次)
jstat -gc
查看完整统计信息
jstat -gcutil
输出说明:
S0C – Survivor 0 区容量
S1C – Survivor 1 区容量
S0U – Survivor 0 区使用
S1U – Survivor 1 区使用
ED – Edenspace 容量
EU – Eden 区使用
OC – Old 区容量
OU – Old 区使用
MC – Metaspace 容量
MU – Metaspace 使用
YGC – Young GC 次数
YGCT – Young GC 时间
FGC – Full GC 次数
FGCT – Full GC 时间
GCT – GC 总时间
jmap - 堆转储分析
bash
查看堆内存使用情况
jmap -heap jmap -dump:format=b,file=heap.hprof jmap -histo jmap -histo:live bash jstack jstack -l jstack -l bash jconsole jconsole bash xml yaml management: java @Component public CustomMetrics(MeterRegistry registry) { this.requestTimer = Timer.builder(“app.requests.duration”) public void recordRequest() { public void recordRequestDuration(long duration, TimeUnit unit) { xml yaml management: xml bash tail -f logs/application.log grep -i “error” logs/application.log grep -o “\-[A-Z]*level” logs/application.log | sort | uniq -c wc -l logs/application.log bash JAVA_OPTS=”-Xms2g -Xmx2g \ yaml groups: rules: expr: jvm_memory_used_bytes / jvm_memory_max_bytes > 0.9 expr: rate(jvm_gc_collection_seconds_sum[5m]) > 10 expr: jvm_threads_current > 500 yaml apiVersion: 1 datasources: type: prometheus type: grafana — 本文涵盖了 Java 监控的: #Java #监控 #JVM #Prometheus #Micrometer #JMX — 文章已完成! 文件路径: `/home/node/.openclaw/agents/creator/workspace/content/Java 监控详细使用教程_20260425_1903.md` 请告诉我下一步操作(配图、发布等)!生成堆转储文件
查看对象统计
查看最终可回收对象
jstack - 线程堆栈分析
查看线程栈信息
导出线程堆栈
查看死锁
jconsole - 图形化监控工具
启动 jconsole
远程连接
连接参数
-J-Dcom.sun.management.jmxremote.port=9999
-J-Dcom.sun.management.jmxremote.ssl=false
-J-Dcom.sun.management.jmxremote.authenticate=false
四、VisualVM 使用指南
安装和启动
使用 JDK 自带的 jvisualvm
或者独立下载
https://visualvm.github.io/
主要功能
| 功能 | 说明 |
|------|------|
| 概览 | 应用基本信息和 CPU、内存监控 |
| 监视 | 实时监控 CPU、内存、类加载 |
| 线程 | 查看线程状态和堆栈 |
| 配置文件 | 分析内存和 CPU 使用 |
| 远程监控 | 监控远程应用 |
五、Prometheus + Grafana 监控
添加 Prometheus 依赖
配置 Spring Boot Actuator
application.yml
endpoints:
web:
exposure:
include: health,info,metrics,prometheus
endpoint:
health:
show-details: always
metrics:
enabled: true
metrics:
export:
prometheus:
enabled: true
step: 60s
tags:
application: ${spring.application.name}
自定义指标
import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.Timer;
import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.stereotype.Component;
public class CustomMetrics {
private final Counter requestCounter;
private final Timer requestTimer;
this.requestCounter = Counter.builder(“app.requests.total”)
.description(“Total number of requests”)
.tag(“service”, “my-service”)
.register(registry);
.description(“Request duration in seconds”)
.publishPercentileHistogram()
.register(registry);
}
requestCounter.increment();
}
requestTimer.record(duration, unit);
}
}
六、Micrometer 和 Actuator 集成
添加依赖
配置 Actuator
application.yml
server:
port: 9090
endpoint:
health:
show-details: always
metrics:
enabled: true
endpoints:
web:
exposure:
include: “*”
metrics:
tags:
application: ${spring.application.name}
export:
prometheus:
enabled: true
七、日志监控
Logback 配置
日志分析工具
实时监控日志
搜索错误日志
统计日志级别分布
分析日志量
八、性能监控最佳实践
JVM 参数优化
生产环境推荐参数
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/var/log/java/heapdump.hprof \
-XX:+PrintGCDetails \
-XX:+PrintGCDateStamps \
-Xloggc:/var/log/java/gc.log”
监控告警规则
Prometheus 告警规则
for: 5m
labels:
severity: warning
annotations:
summary: “High memory usage detected”
for: 10m
labels:
severity: critical
annotations:
summary: “High GC frequency detected”
for: 5m
labels:
severity: warning
annotations:
summary: “Thread count is too high”
监控面板配置
Grafana 数据源配置
access: proxy
url: http://prometheus:9090
isDefault: true
access: proxy
url: http://grafana:3000
“`总结





















暂无评论内容