java编译器与java.lang.NullPointerException:Inflater已关闭

时间:2015-02-23 12:15:06

标签: java compiler-construction tools.jar

我已经在互联网上搜索了一下,但是没有找到与我完全匹配的问题。所以,我决定在这里发帖。

最近,我们的ANT大楼间歇性地抛出以下异常。而且它变得越来越频繁。

该问题与以下内容相关:

但是,测试用例在我们的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;
    }

......
}

Inflater.class

......

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");
}

......

&#34; SoftReference&#34;非常可疑。我们的ANT建筑很容易达到1024米以上,当我将MAX HeapSize设置为1024米时,我仍然可以看到异常。 (现在我把它改成了2048米,手指交叉)。

如果在初始化后立即收集this.inflaterRef:

  1. Inflater.finalized()调用
  2. zsRef被清除,因此zsRef.address()设置为0
  3. 然后调用Inflater.ensureOpen()
  4. 抛出异常。
  5. 以下是我的问题:

    1. 之前有没有人见过这个例外?如果是这样,有什么好的解决方案。
    2. 我的分析是否正确?
    3. 有没有一种方法可以将一些日志代码插入tools.jar?因此,我们可以知道此异常之前和之后究竟发生了什么。反编译和重新编译?
    4. 任何想出这个例外的想法总会发生吗?
    5. 这是堆栈跟踪*

        

      编译器发生异常(1.7.0内部)。请   在Java Developer Connection上提交一个错误   (http://java.sun.com/webapps/bugreport)检查Bug后   游行重复。包括您的计划和以下内容   报告中的诊断。谢谢。显示java.lang.NullPointerException:   Inflater已关闭   java.util.zip.Inflater.ensureOpen(Inflater.java:413)at   java.util.zip.Inflater.reset(Inflater.java:375)at   com.sun.tools.javac.file.ZipFileIndex.inflate(ZipFileIndex.java:467)   在   com.sun.tools.javac.file.ZipFileIndex.readBytes(ZipFileIndex.java:403)   at com.sun.tools.javac.file.ZipFileIndex.read(ZipFileIndex.java:372)   at com.sun.tools.javac.file.ZipFileIndex.read(ZipFileIndex.java:372)   在   com.sun.tools.javac.file.ZipFileIndexArchive $ ZipFileIndexFileObject.openInputStream(ZipFileIndexArchive.java:163)   at com.sun.tools.javac.jvm.ClassReader.fillIn(ClassReader.java:2219)   at com.sun.tools.javac.jvm.ClassReader.complete(ClassReader.java:2151)   在com.sun.tools.javac.code.Symbol.complete(Symbol.java:433)at   com.sun.tools.javac.code.Symbol $ ClassSymbol.complete(Symbol.java:833)   在   com.sun.tools.javac.jvm.ClassReader.loadClass(ClassReader.java:2332)   在com.sun.tools.javac.comp.Resolve.loadClass(Resolve.java:1074)at at   com.sun.tools.javac.comp.Resolve.findIdentInPackage(Resolve.java:1239)   在com.sun.tools.javac.comp.Attr.selectSym(Attr.java:2404)at at   com.sun.tools.javac.comp.Attr.visitSelect(Attr.java:2295)at at   com.sun.tools.javac.tree.JCTree $ JCFieldAccess.accept(JCTree.java:1689)

1 个答案:

答案 0 :(得分:0)

在过去一周,ANT_OPTS设置为-Xms512m -Xmx2048m,问题再次没有发生。

顺便说一下,当ANT将JAVA_OPTS设置为-Xms512m -Xmx2048m时,它不起作用。