【问题标题】:Kafka Unrecognized VM option 'PrintGCDateStamps'Kafka 无法识别的 VM 选项“PrintGCDateStamps”
【发布时间】:2016-08-26 12:29:40
【问题描述】:

我在远程服务器上安装了 Kafka,当我尝试运行时

~/kafka/bin/zookeeper-server-start.sh ~/kafka/config/zookeeper.properties

我收到了一个错误

Unrecognized VM option 'PrintGCDateStamps'

并且kafka服务器启动失败。这不是在 vm 中运行,而是直接在正确安装 Java 的 Ubuntu Server 16.04 上运行。有什么方法可以简单地纠正这个问题?

【问题讨论】:

  • GC 日志在 JDK 9 中发生了变化。作为这项工作的一部分被删除的遗留 XX 标志的列表记录在 JDK 9 发行说明中,请参阅:oracle.com/technetwork/java/javase/…

标签: jvm apache-kafka


【解决方案1】:

我使用的是 windows,所以我只运行 bat 文件而不是 shell 脚本

【讨论】:

    【解决方案2】:

    像其他答案一样——我让它在 Java 9 上工作。必须进行以下更改:

    1. 编辑文件bin/kafka-run-class.sh

    2. 在文件末尾附近(第 248 行附近)找到以下块:

    if [ "x$GC_LOG_ENABLED" = "xtrue" ]; then GC_LOG_FILE_NAME=$DAEMON_NAME$GC_FILE_SUFFIX KAFKA_GC_LOG_OPTS="-Xloggc:$LOG_DIR/$GC_LOG_FILE_NAME -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps " fi

    1. 删除 2 个标志:-XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps 并保存文件。

    2. Kafka 在 Java 9 上应该可以正常启动

    【讨论】:

    • 这对我有用,当我做了 nano bin/kafka-run-class.sh Ctrl W 来查找去行
    【解决方案3】:

    我正在使用 java 10 和 kafka_2.11-0.10.1.0,我遇到了同样的问题。我在 kafka-run-class.sh 中没有找到 JAVA_MAJOR_VERSION,所以我查看了错误。它说“Unrecognized VM option 'PrintGCDateStamps'” 这意味着 Java 10 GC 相关的 vm 选项已更改,Kafka 配置尚不兼容。 This 也证实了我的想法。

    所以切换到 Java 版本 KAFKA_GC_LOG_OPTS="-Xloggc:$LOG_DIR/$GC_LOG_FILE_NAME -verbose:gc -XX:+PrintGCDetails " 所以这仍然会打印 GC 详细信息,但不会指定时间戳。 Zookeeper 启动没有任何问题!

    【讨论】:

      【解决方案4】:

      实际上,Kafka 可以与较新版本的 Java 配合使用。我遇到了同样的问题,在kafka/bin/kafka-run-class.sh脚本中发现了一个错误,Java版本被错误地解析了。

      这行抓取了太多的版本字符串:

      JAVA_MAJOR_VERSION=$($JAVA -version 2>&1 | sed -E -n 's/.* version "([^.-]*).*"/\1/p')
      

      这使得if [[ "$JAVA_MAJOR_VERSION" -ge "9" ]] 条件无法识别正确的Java 版本,并添加了一些不支持的GC 选项。

      将上面的行更改为此解决了我的问题:

      JAVA_MAJOR_VERSION=$($JAVA -version 2>&1 | sed -E -n 's/.* version "([^.-]*).*/\1/p')
      

      我已将此报告为 Kafka 的一个问题。可以在这里找到问题:https://issues.apache.org/jira/browse/KAFKA-6855

      编辑:对此有一个已提交的修复:https://github.com/apache/kafka/commit/e9f86c3085fa8b65e77072389e0dd147b744f117

      【讨论】:

      • 我更新了上面的行。仍然对我不起作用。我有带有 Java 版本的 Ubuntu 16.04: java 10.0.1 2018-04-17 Java(TM) SE Runtime Environment 18.3 (build 10.0.1+10) Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10.0.1+ 10、混合模式)。错误是 ::: 类路径为空。请先构建项目,例如通过运行'./gradlew jar -PscalaVersion=2.11.12'
      • 这与原始问题中的错误不同,@NeerajKumar 您的类路径可能还有其他错误。
      • NeerajKumar:看看你的目录路径中是否有空格。尝试移动到没有任何空间的另一条路径。 (希望你下载了二进制文件)。顺便说一句,这个问题与原始问题中提出的问题不同。
      • 谢谢安德斯,这解决了我的Java版本问题。现在 Zookeeper 运行良好。提高了答案。
      • 谢谢你。效果很好:)
      【解决方案5】:

      截至目前,Kafka 的默认包与 Java 9 存在错误。最简单的解决方案是回滚到 java8。

      sudo add-apt-repository ppa:webupd8team/java
      sudo apt update; sudo apt install oracle-java8-installer
      sudo apt install oracle-java8-set-default
      

      【讨论】:

      • Kafka 在 Java 9 和 10 上运行良好。这只是脚本版本检测部分的一个小错误。你绝对不应该仅仅因为这个而回滚你的 Java 版本。
      • 此 PPA 已弃用。
      【解决方案6】:

      我的 $java_home 中有 jdk-9(抢先体验)指向,我遇到了各种错误,Unrecognized VM option 'PrintGCDateStamps', -loggc deprecreated, -cp requires a classpath specified,等等。

      使用命令 (sudo mv jdk1.8.0.jdk ~/Documents) 将 jdk-9 从 $java_home 中移开并重新启动终端,它就像一个魅力!我能够启动 zookeeper-server-start 和 kafka。 我希望这会有所帮助。

      【讨论】:

      • 我现在的 JDK 9 发行版也是如此。您是否在 Kafka 等中创建了问题?
      【解决方案7】:

      在安装了 oracle jdk 9 的 Ubuntu 16.04 上同样的问题,我也尝试了 openjdk 1.9 并得到了同样的错误。但是当我尝试其他版本的jdk时,我发现oracle jdk 8和openjdk 1.8都可以。

      所以只要看看你使用的是什么版本的java,也许你可以通过以下方式安装或切换到其他版本的jdk:

      update-alternatives --display java
      update-alternatives --config java
      java -version
      

      【讨论】:

      • 删除了我的答案以支持这个。谢谢!
      • Kafka 实际上适用于较新版本的 Java。该问题是由于版本检测脚本中的错误导致的,该问题目前正在解决中。看我的回答。
      【解决方案8】:

      所以我找到了答案并想发布它以防其他人遇到此问题。在最底部的 kafka/bin/kafka-run-class.sh 中有一段写着

      exec $JAVA $KAFKA_HEAP_OPTS $KAFKA_JVM_PERFORMANCE_OPTS $KAFKA_GC_LOG_OPTS $KAFKA_JMX_OPTS $KAFKA_LOG4J_OPTS -cp $CLASSPATH $KAFKA_OPTS "$@"
      

      删除 $KAFKA_GC_LOG_OPTS 选项。可能是个 hack,但至少它可以让 kafka zookeeper 服务器启动!

      【讨论】:

      • 您可能不应该删除 $KAFKA_GC_LOG_OPTS 变量,而是找出它的设置位置,然后更改那里的值。 PrintGCDateStamps 可能来自比您安装的更新版本的 Java,但您可能希望启用某种形式的 GC 日志记录。运行 java -XX:+PrintFlagsFinal 以查看您的特定 Java 版本可以理解的所有标志。
      猜你喜欢
      • 2020-10-24
      • 1970-01-01
      • 2020-04-29
      • 1970-01-01
      • 1970-01-01
      • 2016-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多