解码netty通道缓冲区时遇到java.lang.CompatibleClassChangeError:vtable存根
在我们的应用程序中,我们看到“java.lang.CompatibleClassChangeError:vtable存根”随机出现,而且很少出现。我们进行了干净的重建,因此构建环境中的nettyjar文件与运行环境中的文件相同 代码是:解码netty通道缓冲区时遇到java.lang.CompatibleClassChangeError:vtable存根,java,jvm,netty,Java,Jvm,Netty,在我们的应用程序中,我们看到“java.lang.CompatibleClassChangeError:vtable存根”随机出现,而且很少出现。我们进行了干净的重建,因此构建环境中的nettyjar文件与运行环境中的文件相同 代码是: @Override protected Object decode(ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer) throws CorruptedFrameExcept
@Override
protected Object decode(ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer)
throws CorruptedFrameException
{
...
buffer.readShort();
int subLength = buffer.readShort();
...
}
第一个buffer.readShort()工作正常,但第二个buffer.readShort()可能会随机抛出此错误。问题类似于。它使用JDK1.6.0_16运行,看起来还没有解决
- 我们使用的是ARMV7CPU
- Netty版本是3.5.4
- java版本是
0101C2:~ # java -version java version "1.8.0_65" Java(TM) SE Embedded Runtime Environment (build 1.8.0_65-b17, headless) Java HotSpot(TM) Embedded Client VM (build 25.65-b01, mixed mode)
- 它与-Xint选项配合使用效果很好:我测试了很多次,不兼容的ClassChangeError在没有-Xint的情况下发生了20多次,而在使用-Xint的情况下则从未发生过。每次测试我用-Xint重启应用程序3次,然后不用-Xint重启应用程序3次
-Xint
中重现?@Ferrybig I使用JDK 1.8.065在X86 Linux操作系统中从源代码构建Netty和我们的应用程序,并将所有jar文件复制到使用JRE 1.8.0的arm Linux操作系统中_65@apangin使用-Xint,问题不会重现。奇怪的是,如果我添加logger.debug(“buffer:+buffer”),问题也不会重现;在buffer.readShort()之前。