Java 监控详细使用教程:JVM 性能监控与诊断完全指南

Java 监控详细使用教程:JVM 性能监控与诊断完全指南

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 env = new HashMap<>();
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 1000

查看完整统计信息

jstat -gcutil 1000

输出说明:

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 | head -30

查看最终可回收对象

jmap -histo:live | head -30


jstack - 线程堆栈分析

bash

查看线程栈信息

jstack

导出线程堆栈

jstack -l > thread_dump.txt

查看死锁

jstack -l | grep -A 10 “Found one Java-level deadlock”


jconsole - 图形化监控工具

bash

启动 jconsole

jconsole

远程连接

jconsole :

连接参数

-J-Dcom.sun.management.jmxremote.port=9999

-J-Dcom.sun.management.jmxremote.ssl=false

-J-Dcom.sun.management.jmxremote.authenticate=false


四、VisualVM 使用指南

安装和启动

bash

使用 JDK 自带的 jvisualvm

/bin/jvisualvm

或者独立下载

https://visualvm.github.io/


主要功能

| 功能 | 说明 | |------|------| | 概览 | 应用基本信息和 CPU、内存监控 | | 监视 | 实时监控 CPU、内存、类加载 | | 线程 | 查看线程状态和堆栈 | | 配置文件 | 分析内存和 CPU 使用 | | 远程监控 | 监控远程应用 |

五、Prometheus + Grafana 监控

添加 Prometheus 依赖

xml


io.micrometer
micrometer-registry-prometheus


io.micrometer
micrometer-core


配置 Spring Boot Actuator

yaml

application.yml

management:
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}


自定义指标

java
import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.Timer;
import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.stereotype.Component;

@Component
public class CustomMetrics {
private final Counter requestCounter;
private final Timer requestTimer;

public CustomMetrics(MeterRegistry registry) {
this.requestCounter = Counter.builder(“app.requests.total”)
.description(“Total number of requests”)
.tag(“service”, “my-service”)
.register(registry);

this.requestTimer = Timer.builder(“app.requests.duration”)
.description(“Request duration in seconds”)
.publishPercentileHistogram()
.register(registry);
}

public void recordRequest() {
requestCounter.increment();
}

public void recordRequestDuration(long duration, TimeUnit unit) {
requestTimer.record(duration, unit);
}
}


六、Micrometer 和 Actuator 集成

添加依赖

xml



org.springframework.boot
spring-boot-starter-actuator



io.micrometer
micrometer-registry-prometheus


配置 Actuator

yaml

application.yml

management:
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 配置

xml



%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} – %msg%n


logs/application.log

logs/application.%d{yyyy-MM-dd}.%i.log
100MB
30

%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} – %msg%n






日志分析工具

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


八、性能监控最佳实践

JVM 参数优化

bash

生产环境推荐参数

JAVA_OPTS=”-Xms2g -Xmx2g \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/var/log/java/heapdump.hprof \
-XX:+PrintGCDetails \
-XX:+PrintGCDateStamps \
-Xloggc:/var/log/java/gc.log”


监控告警规则

yaml

Prometheus 告警规则

groups:

  • name: jvm-alerts

rules:

  • alert: HighMemoryUsage

expr: jvm_memory_used_bytes / jvm_memory_max_bytes > 0.9
for: 5m
labels:
severity: warning
annotations:
summary: “High memory usage detected”

  • alert: HighGCFrequency

expr: rate(jvm_gc_collection_seconds_sum[5m]) > 10
for: 10m
labels:
severity: critical
annotations:
summary: “High GC frequency detected”

  • alert: ThreadCountHigh

expr: jvm_threads_current > 500
for: 5m
labels:
severity: warning
annotations:
summary: “Thread count is too high”


监控面板配置

yaml

Grafana 数据源配置

apiVersion: 1

datasources:

  • name: Prometheus

type: prometheus
access: proxy
url: http://prometheus:9090
isDefault: true

  • name: Grafana

type: grafana
access: proxy
url: http://grafana:3000
“`

总结

本文涵盖了 Java 监控的:

  • 监控概述 – 监控目标和 JVM 内存结构
  • JMX 基础 – 自定义 MBean 和连接示例
  • JVM 工具 – jstat、jmap、jstack、jconsole
  • VisualVM – 安装和主要功能
  • Prometheus – 集成和自定义指标
  • Micrometer – Actuator 配置
  • 日志监控 – Logback 配置和分析
  • 最佳实践 – JVM 参数和告警规则

#Java #监控 #JVM #Prometheus #Micrometer #JMX

文章已完成!

文件路径: `/home/node/.openclaw/agents/creator/workspace/content/Java 监控详细使用教程_20260425_1903.md`

请告诉我下一步操作(配图、发布等)!

© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容