很多 Java 应用一上线就会遇到同一个问题:CPU 飙高、内存慢慢涨、接口偶发变慢,但日志里看不出原因。这时常见选择有两类:打开 JMX,或者接入监控 Agent。JMX和Agent有什么区别:Java应用监控的选择与配置方法,关键不在名词,而在你要看到什么、能改动多少应用、是否允许安装探针。
JMX更像 JVM 和应用暴露出来的一组管理接口,适合查看堆内存、线程、GC、类加载、连接池等运行状态,也能调用部分管理操作。Agent更像挂在 Java 进程上的采集器,通常通过 javaagent 参数启动,能自动采集方法调用、链路追踪、SQL、HTTP 请求、错误堆栈等更细的数据。简单说,只看 JVM 和少量组件指标,先用 JMX;要做链路追踪、接口耗时、调用拓扑和自动上报,选择 Agent 更合适。

第一步:先确定你要监控的目标
操作前先把问题写清楚,不要一上来就装工具。如果你只想知道 Java 进程有没有内存泄漏、GC 是否频繁、线程是否堵住,JMX基本够用。如果你要知道“哪个接口慢”“慢在数据库还是远程调用”“某个请求经过了哪些服务”,JMX不够,需要 Agent 或 APM 类工具。
操作方法很简单:列出三个问题,例如“堆内存是否持续上涨”“线程池是否打满”“订单接口为什么超过 2 秒”。前两个可优先用 JMX,第三个优先 Agent。这样做的结果是,后续配置不会走偏,也能避免为了一个 JVM 指标引入整套复杂系统。
第二步:在本机环境用 JMX 先看 JVM 状态
如果应用运行在本机,最轻量的方法是直接使用 JDK 自带工具。启动你的 Java 应用后,在同一台机器上打开 jconsole 或 jvisualvm。不同 JDK 发行包是否自带这些工具可能有差异,若命令不存在,先检查本机 JDK 安装目录的 bin 目录。
操作结果应该是,你能看到本机 Java 进程列表。选中目标进程后,可以进入内存、线程、类、VM 概要、MBean 等页面。内存页面能看到堆和非堆变化,线程页面能看到线程数量和线程状态,MBean 页面能查看更细的管理对象,例如垃圾回收器、内存池、操作系统信息,以及某些框架暴露的指标。
这一步的价值是快速判断问题方向。比如堆使用量每次 GC 后仍然上升,说明需要继续分析对象;线程数持续上涨,可能是线程泄漏或线程池配置异常;某个 MBean 显示连接池活跃连接接近上限,就要查数据库连接释放和池大小。
第三步:给远程 Java 应用开启 JMX
生产或测试服务器上的应用一般不能直接本机图形化连接,需要在启动参数中开启远程 JMX。常见参数包括开启 JMX 远程、指定端口、指定 RMI 端口、设置主机名、开启认证和 SSL。具体参数名属于 JVM 标准能力,但不同运行方式写法不同:如果是 jar 包启动,就加在 java 命令后、-jar 前;如果是 Tomcat,可放到 setenv 脚本或服务启动参数里;如果是容器,要写进启动命令或环境变量。
示例思路是:为 Java 进程增加 JMX remote 开关,指定一个固定端口,并确保防火墙、安全组只允许运维机或监控系统访问。不要为了省事在公网开放无认证 JMX。JMX 具备管理能力,暴露不当会带来很高风险。
配置后重启应用,结果应该是端口处于监听状态,并且 jconsole、VisualVM 或监控系统可以从授权网络连接到该 Java 进程。如果连接失败,优先检查三件事:JMX端口是否监听,RMI返回的主机地址是否可达,防火墙或容器端口映射是否放通。JMX远程连接失败经常不是账号问题,而是 RMI 地址和端口没有固定好。
第四步:用 JMX 建立基础监控项
能连上以后,不要只在出问题时手工打开界面。建议把关键指标接入现有监控系统。你需要采集的基础项包括:堆内存使用率、老年代使用量、Full GC 次数和耗时、线程总数、死锁线程、类加载数量、进程 CPU、文件句柄、连接池活跃连接数、连接池等待数。
操作结果应该是一组可看趋势的图表,而不是单次截图。JMX适合做“状态监控”和“容量预警”:内存涨了、GC变多了、线程池快满了,都能提前发现。但它通常不能直接告诉你某个业务请求为什么慢,也不擅长自动拼出跨服务调用链。
第五步:判断是否需要接入 Agent
当你发现 JMX 指标只能说明“系统不健康”,却不能定位“哪段代码导致不健康”时,就该考虑 Agent。典型场景有四类:接口耗时需要按 URL 统计,数据库 SQL 需要按耗时排名,微服务调用链需要串起来,线上异常需要自动关联请求上下文。
Agent的代价也要提前接受:它会进入应用进程,可能增加少量性能开销;它通常需要重启应用加入启动参数;不同框架、JDK、容器环境的兼容性要以所选 Agent 文档为准。这里不能替你确认某个商业或开源 Agent 的具体版本兼容范围,实际接入前应以你选定产品的官方兼容矩阵为准。
第六步:以 javaagent 方式接入监控 Agent
大多数 Java Agent 的接入方式相似:下载对应的 agent 包,把文件放到服务器固定目录,然后在 Java 启动参数中加入 -javaagent 指向该 jar 文件,再补充服务名、环境名、上报地址、采样率等配置。注意 javaagent 参数要出现在 -jar 前面,否则可能不会生效。
如果是 Spring Boot jar 启动,操作方式通常是在启动脚本中增加 javaagent 参数;如果是 Tomcat 或其他应用服务器,则加到 JVM 启动变量;如果是 Kubernetes,可以通过镜像内置、挂载卷或 init 容器准备 Agent,再在容器启动参数中注入。配置完成后重启应用。
预期结果是,监控平台能出现该服务实例,并开始展示请求量、平均耗时、错误率、慢调用、数据库访问等数据。如果平台没有数据,先看应用启动日志中 Agent 是否加载成功,再看网络是否能访问采集端或上报端,最后检查服务名和环境名是否写错。
第七步:把 JMX 和 Agent 分工用起来
实际生产中不必二选一。更稳妥的做法是:JMX负责 JVM 基础健康,Agent负责业务调用与链路定位。比如报警提示老年代使用率持续升高,这是 JMX 发现的;随后你在 Agent 里查看最近流量、慢接口、异常请求和 SQL 排名,判断是不是某个接口返回大对象、缓存击穿或数据库慢查询导致。
这样配置后的结果是,排障路径更短:先看 JVM 是否异常,再看业务链路是否异常;先确定是资源问题、代码问题还是下游依赖问题,再决定扩容、回滚、限流或修代码。
第八步:按环境选择安全配置
开发环境可以先本机 JMX 加简单 Agent,重点是看得见。测试环境建议按服务统一命名,让压测数据可对比。生产环境必须控制访问范围:JMX端口不要暴露到公网,认证和加密策略按公司安全要求开启;Agent上报地址走内网或受控网络;服务名、实例名、环境名保持统一,否则后续看图会混乱。
配置完成后,至少验证三件事:应用能正常启动,监控数据能持续上报,关闭或重启实例后监控平台状态能正确变化。结果达标后,再把启动参数固化到部署脚本、容器模板或发布平台中,避免下次发布丢配置。
最后给一个选择建议:单体应用、问题集中在内存线程和连接池,先配 JMX;微服务、接口多、调用链长,优先接入 Agent;对稳定性要求高的线上系统,最好两者同时使用。理解 JMX和Agent有什么区别:Java应用监控的选择与配置方法之后,监控就不是“装一个工具”这么简单,而是把 JVM 状态、业务请求和部署环境连起来,形成能真正定位问题的监控链路。
Ai菜鸟网。发布者:aibianjibu,转载请注明出处:https://www.alyyhw.com/10639.html