我使用Netty 3.3.1.Final来满足我们对自定义服务器的需求。 我们的执行被阻塞在无限循环: org.jboss.netty.buffer.DynamicChannelBuffer.ensureWritableBytes(DynamicChannelBuffer.java:75)Java Netty 3.3.1.Final,DynamicChannelBuffer.java:75,无限循环,一个bug?
走进与debuger代码将显示一个无限循环开始于初始值: minNewCapacity = 2147483647 newCapacity = 256
(二进制1111111111111111111111111111111)
(二进制0000000000000000000000100000000)
原因是< < =操作者将引起newCapacity达到100000000000000000最大值0000000000000,并在下一步newCapacity将永远变为0。
这部分代码缺少文档,所以我不能深入分析,但我想知道这是否是已知问题,如果我可以使用其他版本的netty?
@Override
public void ensureWritableBytes(int minWritableBytes) {
if (minWritableBytes <= writableBytes()) {
return;
}
int newCapacity;
if (capacity() == 0) {
newCapacity = 1;
} else {
newCapacity = capacity();
}
int minNewCapacity = writerIndex() + minWritableBytes;
//INFINITE LOOP HERE
while (newCapacity < minNewCapacity) {
newCapacity <<= 1;
}
ChannelBuffer newBuffer = factory().getBuffer(order(), newCapacity);
newBuffer.writeBytes(buffer, 0, writerIndex());
buffer = newBuffer;
}
感谢您的帮助,
雷诺
添加的注释:
这是方法导致minNewCapacity那么高至极似乎并不好,因为它会导致一个巨大的内存缓冲区... org.jboss.netty.ReplayingDecoderBuffer.readableBytes(ReplayingDecoderBuffer.java:301)
public int readableBytes() {
if (terminated) {
return buffer.readableBytes();
} else {
return Integer.MAX_VALUE - buffer.readerIndex();
}
}
添加评论2012/04/13
我终于决定,因为它会导致一些非常奇怪的行为不使用ReplayingDecoder。 特别是,在decode()方法中使用ChannelBuffer参数的mark()和reset()方法看起来不安全。 当我尝试使用buffer.slice()将ChannelBuffer封装在“私有”容器中时,出现异常,例如“Slice不是可重放方法...”。 它不是很复杂,如何扩展FrameDecoder并重新实现检查点逻辑......
这应该作为一个问题记录在github https://github.com/netty/netty/issues这是很容易创建一个。 – Abe 2012-04-03 03:25:07
您能否请开一个错误报告或更好地提供修复;) – 2012-04-04 05:46:05
谢谢我会尝试添加一张票到github。我不确定我是否已经在Netty的代码中做得足够深入......也许有时候! – RenaudBlue 2012-04-13 09:56:27