web-dev-qa-db-ja.com

Netty-クラスjdk.internal.misc.Unsafeにアクセスできません

Javaを8から11にアップグレードすると、Nettyから"jdk.internal.misc.Unsafe"、詳細は以下のとおりです。

デバッグレベルのメッセージであることを知っていたので、ログのレベルを変更して無視できます。しかし、それを無視すると、パフォーマンスなどの他の問題があるかどうかはわかりません。誰かがこれに対する最善の解決策を知っていますか?

Java.lang.IllegalAccessException: class io.netty.util.internal.PlatformDependent0$6 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$6.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$0(FrameworkLauncher.Java:61) ~[classes/:?]
    at Java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.Java:183) [?:?]
    at Java.util.stream.ReferencePipeline$2$1.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/:?]
14
oarsmanli

Nettyがクラスにアクセスできるようにするには、Javaを次のオプションで開始します。

--add-opens Java.base/jdk.internal.misc=ALL-UNNAMED

これでパッケージが開きますjdk.internal.miscモジュールJava.baseをunamedモジュールに追加します。

Javaコマンド のドキュメント、およびこの Java module system の概要)も参照してください。

編集:Nettyが直接バッファー最適化を使用するには、次の設定も必要です

-Dio.netty.tryReflectionSetAccessible=true

この問題にはいくつかのNettyの問題があります。 netty/issues/7769

9
gjoranv

Java 11でNettyを実行する場合、次のVMオプションを追加して、パフォーマンスの最適化を有効にします。

--add-opens Java.base/jdk.internal.misc=ALL-UNNAMED
-Dio.netty.tryReflectionSetAccessible=true

次に、深い反射がいつ使用されるかを知るために、以下を追加できます。

--illegal-access=warn
7

あなたが言ったように、これは単なるデバッグメッセージであり、無視することができます。基本的に、Nettyはクラスにアクセスできないため、「すべての最適化」を利用できないことを示しています。必要に応じて、アプリケーションの起動時にコマンドラインフラグを使用してアクセスレベルを開くことができます。

1
Norman Maurer