在使用Java 11进行调试期间,如何避免出现“仅由于引导加载程序类附加了引导加载程序类才支持共享”的警告?

Dmi*_*kiy 39 java intellij-idea classloader java-11

最近,我切换到Java 11并开始调试应用程序,并看到以下消息:

OpenJDK 64位服务器VM警告:引导加载程序类仅支持共享,因为已附加了引导程序类路径

仅找到此提交故障单,但并不能告诉我太多。

我需要担心吗?

Dav*_*ave 32

jdk-12.0.1_windows-x64_bin.zip尝试将调试器与IntelliJ IDEA一起使用时,安装后我也遇到了这个问题。我收到(Java HotSpot(TM)64位服务器VM警告:由于引导程序类路径已附加,仅支持引导加载程序类共享)。我也发现,进入“设置”并搜索“异步”并取消选中“检测代理”框。为我工作! ASYNC设置

  • 在关闭此功能之前,请阅读异步堆栈跟踪功能,看看它是否对您没有用:https://www.jetbrains.com/help/idea/async-stacktraces.html (14认同)
  • 如果没有 GUI,您可以通过 VM 选项“-Xshare:off”禁用它。 (6认同)
  • 简而言之:当父线程启动子线程或进程(某些“捕获点”)时,会生成线程转储。当您中断子线程时,其堆栈跟踪的一部分将来自父线程。 (5认同)
  • 如何在没有 GUI 界面的 CI 上禁用相同的设置? (2认同)

Mar*_*tin 12

您可以忽略此警告。这只是意味着对于未由引导类加载器加载的类禁用类数据共享。

改善启动时间 [...] 与应用程序类数据共享

JVM 使用引导类加载器加载一些 JDK 类,使用系统类加载器加载其余的类,但将所有这些类都包含在其默认存档中。当 IntelliJ 执行您的项目时,它会告诉 JVM 通过附加到该类路径(消息的第二部分)使用引导类加载器加载一些代码。现在,这意味着包含系统类加载器加载的类的归档部分可能无效,因此 JVM 部分停用共享(消息的第一部分)。

您可以使用 完全禁用类数据共享-Xshare:off,但会损失一些性能。

  • 使用 Gradle,CLI 仍然生成它们。将 org.gradle.jvmargs=-Xshare:off 添加到 gradle.properties 解决了大部分问题。但是,我还必须通过添加 `test { jvmArgs "-Xshare:off"; 来修改测试任务。/* ... */ }` 到测试 (Junit 5),以便从命令行中完全删除它们。 (3认同)
  • 当[使用 Azure Monitor Application Insights 检测我的代码](https://learn.microsoft.com/en-us/azure/azure-monitor/app/java-in-process-agent#quickstart) 时,我收到此警告,即。将 `-javaagent:path/to/applicationinsights-agent-3.0.3.jar` 添加到我的应用程序的 JVM 参数时。添加 `-Xshare:off` 可以消除警告(更改 IntelliJ 设置不会)。谢谢! (2认同)

小智 10

尝试将调试器与Intellij Idea结合使用时,在安装Java12之后遇到了这个问题。我找到的解决方案是进入“设置”并搜索“异步”,然后取消选中“检测代理”框。


小智 9

鉴于 IntelliJ 中的此警告是无害的(请参阅/sf/answers/4056992201/),您可以通过右键单击该行并选择“像这样折叠行”来从控制台视图中隐藏该行

完成此操作后,您将看到:

"C:\Program Files\Java\jdk-17.0.2\bin\java.exe" ... <1 internal line>
Run Code Online (Sandbox Code Playgroud)


JJ *_*kar 8

对我来说,这个问题只发生在我在 Docker 中运行时,以及当我使用像 DataDog APM 代理 ( -javaagent:/dd-java-agent.jar)这样的 java 命令行代理时。当我在我的 JDK11 运行时环境(没有代理)中运行时,我没有收到警告。