如何监控 java程序
监控 Java 程序的方法
使用 JMX(Java Management Extensions)
JMX 是 Java 平台的标准监控和管理工具,允许通过 MBean(Managed Bean)暴露程序内部状态和操作。通过 JConsole 或 VisualVM 等工具可以连接到运行中的 Java 程序,实时查看堆内存、线程、CPU 使用率等指标。
启用 JMX 远程监控需要在启动 Java 程序时添加以下 JVM 参数:
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9010
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
集成 Prometheus 和 Grafana
Prometheus 是一个开源的监控系统,支持通过客户端库(如 micrometer)暴露指标数据。Grafana 用于可视化这些数据。
在 Maven 项目中添加 Micrometer 依赖:
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
<version>1.7.0</version>
</dependency>
在代码中初始化 Prometheus 监控:
import io.micrometer.prometheus.PrometheusMeterRegistry;
import io.micrometer.core.instrument.MeterRegistry;
MeterRegistry registry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT);
使用 APM 工具(如 Elastic APM、SkyWalking)
APM(Application Performance Monitoring)工具提供分布式追踪、错误分析和性能监控功能。例如,Elastic APM 可以通过 Java Agent 或 SDK 集成。

添加 Elastic APM Agent 的方式:
java -javaagent:/path/to/elastic-apm-agent.jar \
-Delastic.apm.service_name=my-java-app \
-Delastic.apm.server_url=http://localhost:8200 \
-jar myapp.jar
日志监控(ELK Stack)
通过 Logback 或 Log4j 将日志发送到 ELK(Elasticsearch + Logstash + Kibana)栈中,实现日志集中分析和告警。
配置 Logback 输出到 Logstash:

<appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>localhost:5000</destination>
<encoder class="net.logstash.logback.encoder.LogstashEncoder"/>
</appender>
健康检查(Spring Boot Actuator)
Spring Boot Actuator 提供内置的健康检查、指标和监控端点。添加依赖后,通过 /actuator/health 等端点获取应用状态。
Maven 依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
自定义监控指标
通过 Micrometer 或 Dropwizard Metrics 定义自定义指标,例如计数器、计时器等。
示例代码:
Counter requestCounter = Counter.builder("api.requests")
.description("Total API requests")
.register(registry);
requestCounter.increment();
关键指标
- JVM 内存:堆/非堆内存使用情况(通过
jstat或 JMX 获取)。 - GC 行为:垃圾回收频率和耗时(通过
-Xlog:gc*参数记录)。 - 线程状态:活跃线程数、死锁检测(通过
jstack或 VisualVM)。 - 响应时间:API 或关键方法的延迟(通过 Micrometer 的
Timer)。






