Netty- 无法访问 class jdk.internal.misc.Unsafe
Netty- cannot access class jdk.internal.misc.Unsafe
当我将 Java 从 8 升级到 11 时,我从 Netty 收到关于 "jdk.internal.misc.Unsafe"
的错误,详细信息如下:
我知道这是一条调试级别的消息,我可以更改日志级别以忽略它。但是我不确定当我忽略它时是否还会有其他问题——比如性能。有谁知道最好的解决方案?
java.lang.IllegalAccessException: class io.netty.util.internal.PlatformDependent0 cannot access class jdk.internal.misc.Unsafe (in module java.base) because module java.base does not export jdk.internal.misc to unnamed module @84b8f0f
at jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:361) ~[?:?]
at java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:591) ~[?:?]
at java.lang.reflect.Method.invoke(Method.java:558) ~[?:?]
at io.netty.util.internal.PlatformDependent0.run(PlatformDependent0.java:334) ~[netty-all-4.1.36.Final.jar:4.1.36.Final]
at java.security.AccessController.doPrivileged(Native Method) ~[?:?]
at io.netty.util.internal.PlatformDependent0.<clinit>(PlatformDependent0.java:325) ~[netty-all-4.1.36.Final.jar:4.1.36.Final]
at io.netty.util.internal.PlatformDependent.isAndroid(PlatformDependent.java:214) ~[netty-all-4.1.36.Final.jar:4.1.36.Final]
at io.netty.util.internal.PlatformDependent.<clinit>(PlatformDependent.java:82) ~[netty-all-4.1.36.Final.jar:4.1.36.Final]
at io.netty.buffer.UnpooledByteBufAllocator.<clinit>(UnpooledByteBufAllocator.java:37) ~[netty-all-4.1.36.Final.jar:4.1.36.Final]
at io.netty.buffer.Unpooled.<clinit>(Unpooled.java:73) ~[netty-all-4.1.36.Final.jar:4.1.36.Final]
at wedo.stream3.framework.base.connector.supplier.DelimiterDecoderSupplier.getDelimiter(DelimiterDecoderSupplier.java:41) ~[classes/:?]
at wedo.stream3.framework.base.connector.supplier.DelimiterDecoderSupplier.<init>(DelimiterDecoderSupplier.java:26) ~[classes/:?]
at wedo.stream3.framework.base.connector.supplier.DelimiterDecoderSupplier.<init>(DelimiterDecoderSupplier.java:20) ~[classes/:?]
at wedo.stream3.framework.base.connector.supplier.CommonChannelHandlerSupplier.<init>(CommonChannelHandlerSupplier.java:37) ~[classes/:?]
at wedo.stream3.framework.base.connector.supplier.CommonChannelHandlerSupplier.<init>(CommonChannelHandlerSupplier.java:25) ~[classes/:?]
at wedo.stream3.framework.base.connector.TcpClientConnector.start(TcpClientConnector.java:39) ~[classes/:?]
at wedo.stream3.framework.bootstrap.FrameworkLauncher.lambda$start[=12=](FrameworkLauncher.java:61) ~[classes/:?]
at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) [?:?]
at java.util.stream.ReferencePipeline.accept(ReferencePipeline.java:177) [?:?]
at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1654) [?:?]
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484) [?:?]
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) [?:?]
at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) [?:?]
at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) [?:?]
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) [?:?]
at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497) [?:?]
at wedo.stream3.framework.bootstrap.FrameworkLauncher.start(FrameworkLauncher.java:58) [classes/:?]
at org.stream3.prototype.mfc.App.launchFramework(App.java:58) [classes/:?]
at org.stream3.prototype.mfc.App.main(App.java:41) [classes/:?]
如您所说,这只是一条调试消息,可以忽略。它基本上告诉你 Netty 不能使用 "all optimisations" 因为它不能访问 class。如果您愿意,可以在启动应用程序时通过命令行标志打开访问级别。
要允许 netty 访问 class,请使用以下选项启动 java:
--add-opens java.base/jdk.internal.misc=ALL-UNNAMED
这会将模块 java.base
中的包 jdk.internal.misc
打开到未命名的模块。
一般情况下,另请参阅 java command, and this intro to the Java module system 的文档。
编辑:Netty 要使用其直接缓冲区优化,您还需要设置
-Dio.netty.tryReflectionSetAccessible=true
关于这个主题有很多 Netty 问题,例如参见netty/issues/7769
当 运行 Netty on Java 11 时,添加这些 VM 选项以启用性能优化:
--add-opens java.base/jdk.internal.misc=ALL-UNNAMED
-Dio.netty.tryReflectionSetAccessible=true
然后,要知道什么时候使用深度反射,你可以添加:
--illegal-access=warn
Netty 需要访问 jdk 模块,因此要允许访问,您需要在启动应用程序时添加 jvm 参数。
--add-opens java.base/jdk.internal.misc=ALL-UNNAMED
此外,如果你想禁用“java.lang.UnsupportedOperationException: Reflective setAccessible(true) disabled.....”警告堆栈跟踪,你还可以包括:
-Dio.netty.tryReflectionSetAccessible=true
如果您使用的是 gradle,您可以将这些添加到 build.gradle,如下所示:
distributions {
applicationDefaultJvmArgs = ["--add-opens",
"java.base/jdk.internal.misc=ALL-UNNAMED", "-Dio.netty.tryReflectionSetAccessible=true"]
mainClassName = 'cl.domain.ServerLauncher'
archivesBaseName = 'your-service'
version = 'latest'
main {
baseName = 'your-service'
}
}
当我将 Java 从 8 升级到 11 时,我从 Netty 收到关于 "jdk.internal.misc.Unsafe"
的错误,详细信息如下:
我知道这是一条调试级别的消息,我可以更改日志级别以忽略它。但是我不确定当我忽略它时是否还会有其他问题——比如性能。有谁知道最好的解决方案?
java.lang.IllegalAccessException: class io.netty.util.internal.PlatformDependent0 cannot access class jdk.internal.misc.Unsafe (in module java.base) because module java.base does not export jdk.internal.misc to unnamed module @84b8f0f
at jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:361) ~[?:?]
at java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:591) ~[?:?]
at java.lang.reflect.Method.invoke(Method.java:558) ~[?:?]
at io.netty.util.internal.PlatformDependent0.run(PlatformDependent0.java:334) ~[netty-all-4.1.36.Final.jar:4.1.36.Final]
at java.security.AccessController.doPrivileged(Native Method) ~[?:?]
at io.netty.util.internal.PlatformDependent0.<clinit>(PlatformDependent0.java:325) ~[netty-all-4.1.36.Final.jar:4.1.36.Final]
at io.netty.util.internal.PlatformDependent.isAndroid(PlatformDependent.java:214) ~[netty-all-4.1.36.Final.jar:4.1.36.Final]
at io.netty.util.internal.PlatformDependent.<clinit>(PlatformDependent.java:82) ~[netty-all-4.1.36.Final.jar:4.1.36.Final]
at io.netty.buffer.UnpooledByteBufAllocator.<clinit>(UnpooledByteBufAllocator.java:37) ~[netty-all-4.1.36.Final.jar:4.1.36.Final]
at io.netty.buffer.Unpooled.<clinit>(Unpooled.java:73) ~[netty-all-4.1.36.Final.jar:4.1.36.Final]
at wedo.stream3.framework.base.connector.supplier.DelimiterDecoderSupplier.getDelimiter(DelimiterDecoderSupplier.java:41) ~[classes/:?]
at wedo.stream3.framework.base.connector.supplier.DelimiterDecoderSupplier.<init>(DelimiterDecoderSupplier.java:26) ~[classes/:?]
at wedo.stream3.framework.base.connector.supplier.DelimiterDecoderSupplier.<init>(DelimiterDecoderSupplier.java:20) ~[classes/:?]
at wedo.stream3.framework.base.connector.supplier.CommonChannelHandlerSupplier.<init>(CommonChannelHandlerSupplier.java:37) ~[classes/:?]
at wedo.stream3.framework.base.connector.supplier.CommonChannelHandlerSupplier.<init>(CommonChannelHandlerSupplier.java:25) ~[classes/:?]
at wedo.stream3.framework.base.connector.TcpClientConnector.start(TcpClientConnector.java:39) ~[classes/:?]
at wedo.stream3.framework.bootstrap.FrameworkLauncher.lambda$start[=12=](FrameworkLauncher.java:61) ~[classes/:?]
at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) [?:?]
at java.util.stream.ReferencePipeline.accept(ReferencePipeline.java:177) [?:?]
at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1654) [?:?]
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484) [?:?]
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) [?:?]
at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) [?:?]
at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) [?:?]
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) [?:?]
at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497) [?:?]
at wedo.stream3.framework.bootstrap.FrameworkLauncher.start(FrameworkLauncher.java:58) [classes/:?]
at org.stream3.prototype.mfc.App.launchFramework(App.java:58) [classes/:?]
at org.stream3.prototype.mfc.App.main(App.java:41) [classes/:?]
如您所说,这只是一条调试消息,可以忽略。它基本上告诉你 Netty 不能使用 "all optimisations" 因为它不能访问 class。如果您愿意,可以在启动应用程序时通过命令行标志打开访问级别。
要允许 netty 访问 class,请使用以下选项启动 java:
--add-opens java.base/jdk.internal.misc=ALL-UNNAMED
这会将模块 java.base
中的包 jdk.internal.misc
打开到未命名的模块。
一般情况下,另请参阅 java command, and this intro to the Java module system 的文档。
编辑:Netty 要使用其直接缓冲区优化,您还需要设置
-Dio.netty.tryReflectionSetAccessible=true
关于这个主题有很多 Netty 问题,例如参见netty/issues/7769
当 运行 Netty on Java 11 时,添加这些 VM 选项以启用性能优化:
--add-opens java.base/jdk.internal.misc=ALL-UNNAMED
-Dio.netty.tryReflectionSetAccessible=true
然后,要知道什么时候使用深度反射,你可以添加:
--illegal-access=warn
Netty 需要访问 jdk 模块,因此要允许访问,您需要在启动应用程序时添加 jvm 参数。
--add-opens java.base/jdk.internal.misc=ALL-UNNAMED
此外,如果你想禁用“java.lang.UnsupportedOperationException: Reflective setAccessible(true) disabled.....”警告堆栈跟踪,你还可以包括:
-Dio.netty.tryReflectionSetAccessible=true
如果您使用的是 gradle,您可以将这些添加到 build.gradle,如下所示:
distributions {
applicationDefaultJvmArgs = ["--add-opens",
"java.base/jdk.internal.misc=ALL-UNNAMED", "-Dio.netty.tryReflectionSetAccessible=true"]
mainClassName = 'cl.domain.ServerLauncher'
archivesBaseName = 'your-service'
version = 'latest'
main {
baseName = 'your-service'
}
}