You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 02:35:57