我在互联网上搜索过,但没有发现与我的完全匹配的问题。所以,我决定在这里发帖。
最近,我们的 ANT 大楼间歇性地抛出以下异常。而且它变得越来越频繁。
该问题看起来与以下内容有关:
- http://bugs.java.com/view_bug.do?bug_id=7003462
- http://hg.openjdk.java.net/jdk7/jdk7/jdk/rev/1740ad242f56
但是,测试用例在我们的 JVM(IBM Java 7.1)上运行良好。因此,上面提到的错误应该不再是原因。
我查看了编译器的源代码,虽然我不太擅长它。
ZipFileIndex.class
public class ZipFileIndex
{
.......
private SoftReference<Inflater> inflaterRef;
......
private int inflate(byte[] paramArrayOfByte1, byte[] paramArrayOfByte2)
{
Inflater localInflater = this.inflaterRef == null ? null : (Inflater)this.inflaterRef.get();
if (localInflater == null) {
this.inflaterRef = new SoftReference(localInflater = new Inflater(true));
}
localInflater.reset();
localInflater.setInput(paramArrayOfByte1);
try {
return localInflater.inflate(paramArrayOfByte2); } catch (DataFormatException localDataFormatException) {
}
return -1;
}
......
}
充气机类
......
public void reset() {
synchronized (zsRef) {
ensureOpen();
reset(zsRef.address());
buf = defaultBuf;
finished = false;
needDict = false;
off = len = 0;
}
}
......
public void end() {
synchronized (zsRef) {
long addr = zsRef.address();
zsRef.clear();
if (addr != 0) {
end(addr);
buf = null;
}
}
}
/**
* Closes the decompressor when garbage is collected.
*/
protected void finalize() {
end();
}
private void ensureOpen () {
assert Thread.holdsLock(zsRef);
if (zsRef.address() == 0)
throw new NullPointerException("Inflater has been closed");
}
......
“SoftReference”非常可疑。我们的 ANT 大楼可以轻松达到 1024m 以上,我在设置 MAX HeapSize 为 1024m 时仍然可以看到异常。(现在我已将其更改为 2048m,手指交叉)。
如果 this.inflaterRef 在初始化后立即被收集:
- Inflater.finalized() 调用
- zsRef 被清除,所以 zsRef.address() 设置为 0
- 然后调用 Inflater.ensureOpen()
- 抛出异常。
以下是我的问题:
- 有没有人见过这个异常?如果是这样,是否有任何好的解决方案。
- 我的分析正确吗?
- 有没有将一些日志记录代码插入到 tools.jar 的好方法?所以,我们可以知道这个异常前后究竟发生了什么。反编译再编译?
- 有什么想法让这个例外总是发生吗?
这是堆栈跟踪*
编译器(1.7.0-internal)发生异常。请在 Java Developer Connection ( http://java.sun.com/webapps/bugreport ) 提交错误) 在检查 Bug Parade 是否有重复项之后。在报告中包含您的程序和以下诊断。谢谢你。java.lang.NullPointerException: Inflater 已在 java.util.zip.Inflater.reset(Inflater.java:375) 在 com.sun.tools 的 java.util.zip.Inflater.ensureOpen(Inflater.java:413) 关闭.javac.file.ZipFileIndex.inflate(ZipFileIndex.java:467) 在 com.sun.tools.javac.file.ZipFileIndex.readBytes(ZipFileIndex.java:403) 在 com.sun.tools.javac.file.ZipFileIndex.read (ZipFileIndex.java:372) 在 com.sun.tools.javac.file.ZipFileIndex.read(ZipFileIndex.java:372) 在 com.sun.tools.javac.file.ZipFileIndexArchive$ZipFileIndexFileObject.openInputStream(ZipFileIndexArchive.java:163 )在 com.sun.tools.javac.jvm.ClassReader.fillIn(ClassReader.java:2219) 在 com.sun.tools.javac.jvm.ClassReader.complete(ClassReader.java: