Docker Compose中Kafdrop启动失败报StackOverflowError问题求助
Kafdrop启动失败抛出StackOverflowError排查求助
按照教程搭建Kafka与FastAPI环境,但Kafdrop的Web UI启动失败,日志中抛出java.lang.StackOverflowError,相关信息如下:
Kafdrop日志
docker-compose logs kafdrop Attaching to kafdrop kafdrop | kafdrop | ::: ::: ::: :::::::::: ::::::::: ::::::::: :::::::: ::::::::: ::: kafdrop | :+: :+: :+: :+: :+: :+: :+: :+: :+: :+: :+: :+: :+: :+: kafdrop | +:+ +:+ +:+ +:+ +:+ +:+ +:+ +:+ +:+ +:+ +:+ +:+ +:+ +:+ +:+ kafdrop | +#++:++ +#++:++#++: :#::+::# +#+ +:+ +#++:++#: +#+ +:+ +#++:++#+ +#+ +:+ kafdrop | +#+ +#+ +#+ +#+ +#+ +#+ +#+ +#+ +#+ +#+ +#+ +#+ +#+#+#+#+#+ kafdrop | #+# #+# #+# #+# #+# #+# #+# #+# #+# #+# #+# #+# #+# kafdrop | ### ### ### ### ### ######### ### ### ######## ### ### kafdrop | kafdrop | OpenJDK 64-Bit Server VM warning: Options -Xverify:none and -noverify were deprecated in JDK 13 and will likely be removed in a future release. kafdrop | 2024-11-24 19:31:48.371 INFO ${sys:PID} [ main] k.Kafdrop$EnvironmentSetupListener : Initializing JAAS config kafdrop | 2024-11-24 19:31:48.457 INFO ${sys:PID} [ main] k.Kafdrop$EnvironmentSetupListener : Env: null kafdrop | 2024-11-24 19:31:49.168 INFO 1 [kground-preinit] o.h.v.i.u.Version : HV000001: Hibernate Validator 8.0.1.Final kafdrop | 2024-11-24 19:31:49.434 INFO 1 [ main] o.s.b.StartupInfoLogger : Starting Kafdrop v4.0.2 using Java 17.0.11 with PID 1 (/kafdrop-4.0.2/kafdrop-4.0.2.jar started by root in /) kafdrop | 2024-11-24 19:31:49.458 INFO 1 [ main] o.s.b.SpringApplication : No active profile set, falling back to 1 default profile: "default" kafdrop | 2024-11-24 19:31:55.540 WARN 1 [ main] o.s.c.s.AbstractApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: java.lang.StackOverflowError kafdrop | 2024-11-24 19:31:55.606 INFO 1 [ main] .s.b.a.l.ConditionEvaluationReportLogger : kafdrop | kafdrop | Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled. kafdrop | 2024-11-24 19:31:55.672 ERROR 1 [ main] o.s.b.SpringApplication : Application run failed kafdrop | kafdrop | java.lang.StackOverflowError kafdrop | at java.base/java.lang.ClassLoader.defineClass1(Native Method) kafdrop | at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1017) kafdrop | at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150) kafdrop | at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:862) kafdrop | at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760) kafdrop | at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681) kafdrop | at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639) kafdrop | at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) kafdrop | at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525) kafdrop | at java.base/java.lang.ClassLoader.defineClass1(Native Method)
docker-compose.yaml配置
version: '3.3' services: zookeeper: image: 'bitnami/zookeeper:3.7.0' container_name: zookeeper ports: - '2181:2181' environment: - ALLOW_ANONYMOUS_LOGIN=true volumes: - ./bitnami/zookeeper:/bitnami/zookeeper kafka: image: 'bitnami/kafka:2.8.0' container_name: kafka ports: - "9092:9092" - "9093:9093" expose: - "9092" - "9093" environment: - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 - KAFKA_CREATE_TOPICS="kafka_capstone_event_bus:1:1" - KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=true - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CLIENT:PLAINTEXT,EXTERNAL:PLAINTEXT - KAFKA_CFG_LISTENERS=CLIENT://:9092,EXTERNAL://:9093 - KAFKA_CFG_ADVERTISED_LISTENERS=CLIENT://kafka:9092,EXTERNAL://localhost:9093 - KAFKA_INTER_BROKER_LISTENER_NAME=CLIENT - ALLOW_PLAINTEXT_LISTENER=yes depends_on: - zookeeper volumes: - ./bitnami/kafka:/bitnami/kafka kafdrop: image: obsidiandynamics/kafdrop container_name: kafdrop ports: - "9000:9000" environment: KAFKA_BROKERCONNECT: "kafka:9092" JVM_OPTS: "-Xms16M -Xmx48M -Xss180K -XX:-TieredCompilation -XX:+UseStringDeduplication -noverify" depends_on: - kafka
排查方向与解决方法
1. 调整JVM栈内存大小
日志中的StackOverflowError核心原因大概率是栈内存过小,当前配置的-Xss180K远低于Java 17默认的1M栈大小,不足以支撑Spring上下文初始化时的类加载调用栈。
修改方案:
更新Kafdrop的JVM_OPTS配置,增大栈内存并移除废弃参数:
JVM_OPTS: "-Xms16M -Xmx48M -Xss1M -XX:-TieredCompilation -XX:+UseStringDeduplication"
修改后重新启动容器:
docker-compose up -d --force-recreate kafdrop
2. 验证版本兼容性
Kafdrop v4.0.2与Kafka 2.8.0的组合可能存在隐性兼容问题,引发初始化时的递归类加载异常。
解决方法:
- 升级Kafdrop至最新稳定版,将镜像改为
obsidiandynamics/kafdrop:4.0.7 - 或者降级Kafdrop到更适配Kafka 2.8.0的版本(比如v3.30.0)
3. 确保Kafka服务就绪后启动Kafdrop
depends_on仅保证容器启动顺序,不代表Kafka服务已完全初始化。Kafdrop启动时连接未就绪的Kafka,可能触发异常逻辑导致栈溢出。
解决方法:
添加启动等待逻辑,比如使用wait-for-it脚本延迟启动Kafdrop:
kafdrop: image: obsidiandynamics/kafdrop container_name: kafdrop ports: - "9000:9000" environment: KAFKA_BROKERCONNECT: "kafka:9092" JVM_OPTS: "-Xms16M -Xmx48M -Xss1M -XX:-TieredCompilation -XX:+UseStringDeduplication" command: ["./wait-for-it.sh", "kafka:9092", "--timeout=60", "--", "java", "-jar", "/kafdrop.jar"] depends_on: - kafka
注:需确保容器内包含wait-for-it.sh脚本,可自行挂载或使用预安装该工具的镜像。
4. 修复损坏的Docker镜像
本地缓存的Kafdrop镜像可能损坏,导致类加载异常。
解决方法:
清理并重新拉取镜像:
docker rmi obsidiandynamics/kafdrop docker pull obsidiandynamics/kafdrop docker-compose up -d kafdrop
内容的提问来源于stack exchange,提问作者ERJAN
相关产品推荐
相关产品推荐

