2

実行時にjarファイルからマニフェストファイルを読み取る必要があります。

コード:

JarFile someJar = new JarFile(jarFile);
manifest = someJar.getManifest();

ただし、上記のコードは OutOfMemoryError 例外をスローする場合があります。

java.lang.OutOfMemoryError
    at java.util.zip.Inflater.init(Native Method)
    at java.util.zip.Inflater.<init>(Inflater.java:83)
    at java.util.zip.ZipFile.getInflater(ZipFile.java:278)
    at java.util.zip.ZipFile.getInputStream(ZipFile.java:224)
    at java.util.zip.ZipFile.getInputStream(ZipFile.java:192)
    at java.util.jar.JarFile.getBytes(JarFile.java:361)

この例外を回避する方法をいつか教えてもらえますか (実行時にマニフェストを取得する別の方法かもしれません)。

ところで、Java ヒープ サイズを変更する権限がありません。

4

3 に答える 3

0

これは、実行しているZIPファイルとは関係がない可能性があります。

JDK 1.7コードを見ると、Inflaterコンストラクターは、という名前のネイティブメソッドを呼び出しinitて、ブール引数を提供することになります。ZIPファイルへの参照への兆候はありません。

使用しているJREにバグがあるか、システムのヒープメモリが非常に制限されているようです(ほとんどのZIP機能を含むネイティブZIPライブラリは非常に小さいです)。

JREは、時にヒープダンプを発行しますOutOfMemoryErrorか?もしそうなら、あなたはそこを見たいかもしれません。

于 2012-11-26T06:15:21.123 に答える
0

これは、 に関する既知の問題のようですjava.util.zip.Inflater

Inflater は init 中にヒープ メモリを割り当てます。ルーティング後に end() を呼び出さない場合、メモリは GC が finalize 関数を呼び出すまで存在します。ヒープが巨大な場合、すべてのメモリを使い果たす前に finalize() は呼び出されません。

この質問を参照してください: java による過度のメモリ使用
またはこの JDK バグ レポート: http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4797189

JDK8までは、次のコードで確認していますが、まだ存在しています。

public static void main( String args[] ) throws InterruptedException {
    while ( true ) {
        //final Deflater deflater = new Deflater( 9, true );
        final Inflater inflater = new Inflater( true );
        // ....
        // if not call end() after using inflater, it will OOM
        // inflater.end();
        Thread.sleep(10);
    }
}

解決策はとてもシンプルで、end()*インフレータの使用が終了した後に呼び出すだけです。

于 2016-07-18T10:58:06.660 に答える
0

巨大な量のメモリを割り当てる必要があるとインフレータを混乱させているのは、破損した jar ファイルではありませんか?

そうであれば、実際に OutOfMemoryError をキャッチできることがわかるでしょう。(通常、これらをキャッチできない、またはキャッチすべきではありませんが、利用できない大量のメモリを割り当てようとする特定のケースでは、実際には一般的に安全です。)

于 2012-11-26T05:57:44.393 に答える