监控的核心指标
在开始写代码或配置工具之前,首先要明确需要监控哪些指标,这些指标通常可以分为以下几类:

JVM 监控
这是最核心的部分,直接关系到应用的内存和线程健康。
- 堆内存: Eden, Survivor, Old (Tenured) 区的使用率和分配情况,重点关注
GC频率和耗时,频繁的 Full GC 会导致应用卡顿。 - 非堆内存: 包括方法区(元空间 Metaspace)、线程栈、JIT 编译缓存等,元空间溢出是常见的 OOM 原因。
- 线程:
- 活动线程数
- 守护线程数
- 线程状态(特别是
BLOCKED和WAITING的线程) - 线程转储(Thread Dump)用于分析死锁或长时间运行的线程。
- 类加载: 已加载、已卸载的类数量,检查是否存在类内存泄漏。
服务器与应用监控
- 运行时状态: 服务器是否处于
RUNNING状态。 - 应用部署状态: 应用是否成功部署且处于
ACTIVE状态。 - JDBC 连接池:
- 连接数:总连接数、活跃连接数、可用连接数。
- 连接等待时间:等待获取连接的线程数和平均等待时间。
- 连接泄漏检测。
- JMS 队列/主题:
- 消息数量:当前队列中的消息数。
- 消息生产/消费速率。
- 消息积压情况。
- JTA 事务: 活跃事务数、超时事务数。
性能监控
- 请求处理:
- HTTP 请求数量(吞吐量)。
- 平均/最大/最小请求响应时间。
- HTTP 状态码分布(如 2xx, 3xx, 4xx, 5xx)。
- 工作管理器:
- 各线程队列的长度和等待时间。
- 被拒绝的请求数量。
操作系统监控
- CPU 使用率: WebLogic 进程和系统的整体 CPU 负载。
- 内存使用: 物理内存和交换空间的使用情况。
- 磁盘 I/O: 读写速率和 I/O 延迟。
- 网络 I/O: 网络流量。
如何在 Java 中实现监控
实现监控主要有以下几种方式,从简单到复杂,从侵入式到非侵入式。
使用 WebLogic Server 内置的 MBean (推荐)
WebLogic 基于 JMX (Java Management Extensions) 暴露了大量的管理 Bean (MBean),这是最标准、最强大、也是官方推荐的方式,你可以通过 Java 代码连接到 WebLogic 的 MBean Server 来获取所有上述的监控指标。
核心步骤:

- 获取 MBean Server: 连接到 WebLogic 服务器,获取其 MBean Server 的引用。
- 构建 MBean Object Name: 每个MBean都有一个唯一的
ObjectName,它是一个类似域名的字符串,用于定位MBean。com.bea:Name=JDBCConnectionPoolRuntime,Type=JDBCConnectionPoolRuntime,Server=myserver。 - 调用 MBean 方法: 通过
MBeanServerConnection接口,你可以调用MBean的方法(如getActiveConnectionsCount())或获取其属性(如HeapSizeCurrent)。
示例代码:
import javax.management.*;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import java.util.HashMap;
import java.util.Map;
public class WebLogicJMXMonitor {
public static void main(String[] args) {
String host = "localhost";
int port = 9002; // WebLogic Admin Server 的 JMX 端口,默认为 7001 或 9002
String username = "weblogic";
String password = "weblogic123";
// JMX 连接 URL
String jmxUrl = "service:jmx:t3://" + host + ":" + port;
JMXServiceURL url = new JMXServiceURL(jmxUrl);
Map<String, Object> env = new HashMap<>();
env.put(JMXConnector.CREDENTIALS, new String[]{username, password});
try (JMXConnector jmxc = JMXConnectorFactory.connect(url, env)) {
MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
// 1. 监控 JVM 堆内存
ObjectName heapMBeanName = new ObjectName(
"com.bea:Name=MemoryRuntime,Type=MemoryRuntime,Server=myserver" // 替换为你的服务器名
);
Long heapSizeCurrent = (Long) mbsc.getAttribute(heapMBeanName, "HeapSizeCurrent");
Long heapSizeMax = (Long) mbsc.getAttribute(heapMBeanName, "HeapSizeMax");
double heapUsagePercent = (heapSizeCurrent * 100.0) / heapSizeMax;
System.out.printf("JVM Heap Usage: %.2f%% (%s / %s MB)%n",
heapUsagePercent,
bytesToMB(heapSizeCurrent),
bytesToMB(heapSizeMax));
// 2. 监控 JDBC 连接池
ObjectName jdbcPoolMBeanName = new ObjectName(
"com.bea:Name=MyJDBCConnectionPool,Type=JDBCConnectionPoolRuntime,Server=myserver" // 替换为你的连接池名
);
Integer activeConnections = (Integer) mbsc.getAttribute(jdbcPoolMBeanName, "ActiveConnectionsCurrentCount");
Integer waitingForConnection = (Integer) mbsc.getAttribute(jdbcPoolMBeanName, "WaitingForCurrentCount");
System.out.printf("JDBC Pool - Active Connections: %d, Waiting Threads: %d%n",
activeConnections, waitingForConnection);
// 3. 获取 Thread Dump (这是一个操作,不是属性)
ObjectName serverMBeanName = new ObjectName(
"com.bea:Name=Runtime,Type=ServerRuntime,Server=myserver" // 替换为你的服务器名
);
String threadDump = (String) mbsc.invoke(serverMBeanName, "dumpThreads", null, null);
System.out.println("\n--- Thread Dump ---");
System.out.println(threadDump.substring(0, 500) + "..."); // 只打印部分
} catch (Exception e) {
e.printStackTrace();
}
}
private static String bytesToMB(long bytes) {
return String.format("%.2f", bytes / (1024.0 * 1024.0));
}
}
优点:
- 功能最全面,可以获取 WebLogic 所有内部状态。
- 官方支持,稳定可靠。
- 非侵入式,无需修改业务应用代码。
缺点:
- 需要了解 WebLogic MBean 的结构,学习曲线较陡峭。
- 需要配置 WebLogic 的 JMX 网络访问(安全、防火墙等)。
使用 Micrometer + Prometheus + Grafana (现代云原生方案)
这是目前业界非常流行的监控方案,尤其适合微服务架构和云原生环境,它通过在应用内部埋点来暴露指标,然后由 Prometheus 采集,最后在 Grafana 中可视化。

核心组件:
- Micrometer: 一个在 Java 应用中收集、聚合和发布指标的门面类库,它为各种监控系统(如 Prometheus, InfluxDB, JMX)提供了统一的 API。
- Prometheus: 一个开源的监控和告警系统,它会定期从你的应用中拉取指标数据并存入时序数据库。
- Grafana: 一个开源的可视化工具,可以从 Prometheus 数据源查询数据并创建炫酷的仪表盘。
实现步骤:
-
在项目中添加依赖:
<!-- Micrometer Core --> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-core</artifactId> <version>1.10.5</version> </dependency> <!-- Micrometer Prometheus Registry --> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> <version>1.10.5</version> </dependency> <!-- 如果你使用 Spring Boot, Actuator 会自动提供 Prometheus 端点 --> -
在代码中创建和记录指标:
import io.micrometer.core.instrument.Gauge; import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.core.instrument.binder.jvm.JvmMemoryMetrics; import io.micrometer.prometheus.PrometheusConfig; import io.micrometer.prometheus.PrometheusMeterRegistry; public class MetricsService { private final MeterRegistry registry; public MetricsService() { this.registry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT); // 自动绑定 JVM 指标 new JvmMemoryMetrics().bindTo(registry); } // 注册一个自定义的业务指标,比如当前处理的请求数 public void registerActiveRequestsGauge() { Gauge.builder("app.active.requests", () -> getCurrentActiveRequestCount()) .description("Number of currently active requests") .baseUnit("requests") .register(registry); } // 模拟获取当前请求数的方法 private long getCurrentActiveRequestCount() { // 你的业务逻辑 return Thread.activeCount(); // 这是一个简单的示例 } // 提供 Prometheus 格式的指标数据 public String scrape() { return registry.scrape(); } } -
暴露指标端点: 在 WebLogic 应用中,你需要创建一个 Servlet 或 JAX-RS 端点,当 Prometheus 访问时,返回
scrape()方法的输出。 -
配置 Prometheus: 在
prometheus.yml中配置抓取你的应用端点。 -
配置 Grafana: 连接 Prometheus 数据源,创建仪表盘。
优点:
- 标准化,生态强大,是云原生的事实标准。
- 适合分布式系统,可以统一收集多个应用的指标。
- 拥有强大的告警规则和灵活的图表功能。
缺点:
- 需要额外搭建和维护 Prometheus 和 Grafana 服务。
- 需要在应用代码中显式地定义和埋点指标。
使用 APM 工具 (如 SkyWalking, Pinpoint)
APM (Application Performance Monitoring) 工具不仅提供指标监控,还提供链路追踪,能帮你定位到具体的慢查询或慢方法。
核心思想: 通过字节码增强或 Java Agent 的方式,在应用启动时自动探针,无需修改业务代码即可收集调用链、方法耗时、SQL 执行时间、JVM 等信息。
实现步骤:
- 下载 APM Agent: SkyWalking 的 Java Agent。
- 启动 WebLogic 时挂载 Agent: 在 WebLogic 的启动脚本(
setDomainEnv.sh/cmd)中添加 JVM 参数:-javaagent:/path/to/skywalking-agent.jar -Dskywalking.agent.service_name=my-weblogic-app -Dskywalking.collector.backend_service=grpc://localhost:11800
- 部署 APM 后端: 启动 SkyWalking OAP (Observability Analysis Platform) 服务器和 UI。
- 访问 UI: 查看拓扑图、服务/实例指标、慢事务追踪等。
优点:
- 功能极其强大,性能分析和问题排查能力一流。
- 非侵入式(代码级),无需修改业务逻辑。
- 提供端到端的分布式链路追踪。
缺点:
- APM 后端系统相对复杂,需要专门部署和维护。
- 可能会引入微小的性能开销(通常可接受)。
推荐方案
| 场景 | 推荐方案 | 原因 |
|---|---|---|
| 常规运维监控 | WebLogic JMX + Zabbix/Prometheus/Grafana | JMX 是 WebLogic 的“官方语言”,数据最全面、最权威,使用 Zabbix 或 Prometheus 来采集 JMX 数据,Grafana 进行可视化,是传统企业最成熟稳定的方案。 |
| 现代化/云原生应用 | Micrometer + Prometheus + Grafana | 如果你的应用正在向微服务或云原生架构演进,这套方案是行业标准,它与你的技术栈能更好地集成,并且社区活跃,生态完善。 |
| 深度性能分析与问题排查 | APM 工具 (如 SkyWalking) | 当你遇到线上性能瓶颈、慢请求,需要知道“哪个方法慢”、“哪个SQL慢”时,APM 工具是无可替代的,它能提供代码级别的洞察力。 |
| 快速、简单的脚本化检查 | 独立的 Java JMX 监控脚本 | 如果你只是想写一个简单的脚本,定时检查服务器状态、内存使用率,并在异常时发送邮件告警,那么方式一的独立脚本就足够了。 |
对于 Java 监控 WebLogic,没有唯一的“最佳”答案,取决于你的具体需求。
- 如果你是 WebLogic 运维人员,请优先掌握和使用 JMX,它是你与 WebLogic 沟通的核心桥梁。
- 如果你在构建新的云原生应用,Micrometer + Prometheus 是一个非常好的选择。
- 如果你被性能问题困扰,果断引入 APM 工具。
在实际项目中,常常会将这些方案组合使用,用 APM 做深度分析,用 JMX + Prometheus 做宏观的运维监控和告警。
