问题背景:相比其他服务,此服务未上云原生,不可自动扩缩容,程序总是宕机,但应用日志application.log无任何错误信息
排查步骤

  • 应用不可用了,查看进程是否存在:ps -ef | grep java,发现进程确实不存在了。
  • 查看应用日志application.log、error.log等是否有错误信息,未发现OutOfMemoryError等任何错误信息。
  • 查看hs_err_pid*.log,可以根据通过命令find / -type f -iname 'hs_err_pid*.log'搜索文件具体位置,使用命令ll -rt对文件进行排序,方便查看,找到对应宕机时间点的那个日志,在里面看到是OOM的问题。

JVM在崩溃或遇到致命错误时,会自动生成一个名为hs_err_pid<pid>.log的文本文件。里面记录了崩溃瞬间的详细现场信息,常用来定位"进程突然消失"的根本原因。

  • 好了,现在知道是内存的问题了,继续排查。查看总体内存使用情况:free -h。发现不对劲,剩余内存极少。
  • 查看详细内存使用占比,按内存排序:top -o %MEM,发现有一个守护进程rsyslogd内存使用占比达到76%。

rsyslogd是Linux/Unix系统里最常用的日志守护进程,负责把系统或应用程序产生的日志集中收集、过滤、归档,甚至转发到远程日志服务器。

  • rsyslogd进程内存暴涨原因分析:df -h,发现/var/磁盘使用率显著提升,是GSE Agent产生了大量日志

GSE Agent是嘉为蓝鲸全栈智能可观测中心的核心采集组件,定位为单一、轻量、多功能的主机级"数据探针"。它直接部署在目标服务器或虚拟机上,负责把CPU、内存、磁盘IO、网络、进程、日志、应用调用链等各类可观测数据统一收集并上报到GSE Server,从而实现从硬件到业务的全栈监控。

  • 重启rsyslogd进程:systemctl restart rsyslog,重新查看内存使用情况,发现内存已经释放,也可继续利用systemd给rsyslogd设置内存上限。
  • 把/etc/rsyslog.conf或/etc/rsyslog.d/*.conf中不必要的*.debug改为*.info,或直接注释掉无用的输入模块。
  • 关闭journal存储:在/etc/systemd/journald.conf中设置Storage=none,让日志仅由rsyslogd处理,避免双重存储。
  • 内存问题已经解决,启动java程序
  • 之前有另一个问题,一个解压缩的步骤特别慢,但另一个环境就没这个问题,比较后发现慢的环境多了IAST,所以很多问题,可以往Agent上联想。

IAST(Interactive Application Security Testing)是一种在应用运行时进行安全检测的技术,它通过在应用程序内部部署探针(Agent),实时监控代码执行、数据流和控制流,从而发现安全漏洞。与传统的SAST(静态分析)和DAST(动态扫描)相比,IAST结合了两者的优势:既能像SAST一样深入代码,又能像DAST一样观察运行时行为,因此具有检出率高、误报率低的特点。

  1. 语言与探针开销
    Java、Python、Go 等主流语言都有较好的插桩支持,但探针本身会在方法入口/出口插入额外字节码,导致方法调用变慢。实测 Java 场景 100 并发下响应时间增加约 39 %,CPU 占用上升 10 % 左右。
  2. 数据采集与上报
    探针需要收集请求、响应、调用栈、污点传播等信息并发送到分析端,网络带宽和序列化反序列化会带来额外延迟。流量越大,延迟越明显。
  3. 部署环境差异
    测试环境与生产环境的硬件、网络、依赖服务不同,可能导致探针行为不一致,进而放大性能损耗。复杂部署(如容器、Service Mesh)还会因探针注入不完整而出现“漏检”或“误报”。

IAST 不是“一个” Java Agent,而是“一类”基于 Java Agent 技术的交互式应用安全测试方案。
洞态 IAST(DongTai IAST)就是典型的 Java Agent 实现:它通过 -javaagent 启动参数把探针注入到目标 JVM 中,利用 ASM 字节码插桩来收集运行时数据,再结合污点追踪算法完成漏洞检测。
因此,可以把 IAST 理解为“使用 Java Agent 做安全监控”的技术路线,而不是单一的 Agent 程序。

Java Agent 是 JVM 提供的一种“外挂”机制,能在不改动源码的前提下,对正在运行的 Java 程序进行监控、修改或增强。
它本质是一个特殊的 JAR 包,通过 JVM 的 Instrumentation API 在类加载时或运行时修改字节码,从而实现无侵入的动态能力注入。
核心能力

  • 字节码增强:在方法前后插入监控、日志、安全检查等逻辑。
  • 性能剖析:统计方法耗时、内存占用、GC 情况,用于 APM 工具。
  • 热更新:线上修复 Bug 而无需重启进程。
  • 故障诊断:动态追踪方法调用链、参数与返回值,帮助排查线上问题。
    两种加载方式
  1. 静态加载:启动时通过 -javaagent:xxx.jar 挂载,优先级高,可拦截所有类加载。
  2. 动态加载:运行时通过 VirtualMachine.attach(pid).loadAgent(“xxx.jar”) 附加,像 Arthas 那样随时“钻进”线上进程。
    典型使用场景
  • APM:SkyWalking、Pinpoint 自动埋点。
  • 诊断工具:Arthas、Bistoury 实现线上 debug。
  • 安全防护:在 JDBC 执行前拦截 SQL 注入。
  • 测试增强:代码覆盖率、Mock 测试、日志增强。
    一句话总结:Java Agent 让你拥有“上帝视角”,在不停机、不改代码的情况下,随时给 Java 应用装上监控、调试、安全等各类“外挂模块”。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐