Sharing is only supported for boot loader classes because bootstrap classpath has been appended 原因正解

前言

可能有小伙伴在调试 java 项目时候,如果不是 点击 运行 而是 Debug 项目,则编译控制台可能就会有个警告
Sharing is only supported for boot loader classes because bootstrap classpath has been appended
在这里插入图片描述
出现这个的原因是因为使用了共享类数据,你可能t同时使用了 -Xbootclasspath/aCDS (或者 AppCDS)
这个基本可以忽略,甚至如果你关了的话,可能会失去某些特性。这里记录两个方法,不想看到这条警告的同学可以试试。

方法一

在你的项目的 VM options 添加 -Xshare:off这个参数,在idea 中,依次点击 Run >> Edit configurations… 找到 VM options 配置选项 , 另外解释几个参数的意思,你可以使用命令提示符 java -X来查看更多信息

-Xshare:auto 在可能的情况下使用共享类数据(默认值)
-Xshare:off 不尝试使用共享类数据
-Xshare:on 要求使用共享类数据,否则将失败。这是一个测试选项,可能导致间歇性故障。不应在生产环境中使用它。

在这里插入图片描述

方法二

在 idea 中, 依次选择 File >> Settings >> Build, Excution,Deployment >> Debugger >> Async Stack Trackers,不要勾选
Instrumenting agent(requires debugger restart) 这个选项

在这里插入图片描述

这个警告信息 "Sharing is only supported for boot loader classes because bootstrap classpath has been appended" 出现在 OpenJDK 的 64-bit Server VM 中,通常表示你在试图在启动类路径 (bootstrap classpath) 中共享类,但这是不允许的,因为启动类路径仅包含启动 Java 应用所需的最小核心类。 分享(即类的重载或共享)在启动类路径中不适用,因为这些类是 Java 运行时环境的基础,包括 JVM、Java 类库的根等。当应用启动时,JVM 会自动加载这些类,不支持动态修改。 要解决这个问题,你需要确保你的类路径设置正确。以下是一些可能的解决方案: 1. **检查类加载顺序**:确保你的应用类路径(-Djava.class.path 或 $JAVA_CLASSPATH)不会覆盖或混淆启动类路径($JAVA_HOME/jre/lib/rt.jar)中的类。 2. **避免修改启动类路径**:不要尝试在启动时动态添加或修改启动类路径,这通常是不被推荐的。 3. **清理无效的类引用**:如果你在类加载过程中错误地引用了不应该被共享的类,删除或修正这些引用。 4. **使用 `-XX:+UseSharedClassLoading`**:虽然这不是标准做法,但在某些特殊情况下,你可以尝试这个选项来启用对特定类的共享,但这可能会带来意外的行为和潜在的安全风险。 5. **使用模块化(Modularity, Java 9+)**:如果你的应用是基于 Java 9 及以上版本,可以尝试使用模块系统(Jigsaw),这有助于管理类加载并防止混淆。 如果你在开发一个框架或服务,并且确实需要在运行时动态加载一些类,那么应该考虑使用 ClassLoader 实现私有类加载,而不是直接修改启动类路径。 相关问题: 1. 为何不能在启动类路径中共享类? 2. 如何正确设置类路径以避免这个警告? 3. Java 9以上的模块化能如何帮助解决此类问题?
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值