1

マップされたバイト バッファーを使用してファイルを読み込もうとしていますが、行buffer.position(position);でOutOfMemoryError:JavaHeapSpaceを取得しています。.. コードの何が問題なのかわかりません.. エラーの原因は何ですか?

private void readFile()
{
    int lastPos = buffer.getInt();

    int dirLen = buffer.getInt();
    byte[] dirBytes = new byte[dirLen];
    buffer.get(dirBytes);
    this.dir = new String(dirBytes);

    int filePatternLen = buffer.getInt();
    byte[] filePatternBytes = new byte[filePatternLen];
    buffer.get(filePatternBytes);
    this.filePattern = new String(filePatternBytes);

    int numFileMetaDatas = 0;
    while (buffer.position() < lastPos)
    {
        numFileMetaDatas++;
        int position = buffer.position();
        //Size is needed as we are reserving some extra bytes
        int size = buffer.getInt();
        buffer.position(position + ByteUtil.SIZE_OF_INT + ByteUtil.SIZE_OF_BYTE + ByteUtil.SIZE_OF_LONG + ByteUtil.SIZE_OF_LONG + ByteUtil.SIZE_OF_LONG);
        int fileNameLen = buffer.getInt();
        byte[] fileNameBytes = new byte[fileNameLen];
        buffer.get(fileNameBytes);

        FileMetaData fileMetaData = new FileMetaData(buffer, size, position);
        UniqueID uniqID = fileMetaData.getUniqueID();

        uniqIdVsFileMetaData.put(uniqID, fileMetaData);

        position = position + size;
        buffer.position(position);
    }
    nextMetaStartPos = lastPos;
}
4

2 に答える 2

0

Java で OutOfMemoryError を解決する簡単な方法は、JVM オプション「-Xmx512M」を使用して最大ヒープ サイズを増やすことです。これにより、すぐに OutOfMemoryError が解決されます。これは、プロジェクトのビルド中に Eclipse、Maven、または ANT で OutOfMemoryError が発生した場合の私の推奨ソリューションです。これは、プロジェクトのサイズに基づいてメモリが簡単に不足する可能性があるためです。これは、JVM の最大ヒープ サイズを増やす例です。 Java アプリケーションでヒープ サイズを設定している場合、Xmx と -Xms の比率は 1:1 または 1:1.5 のいずれか

export JVM_ARGS="-Xms1024m -Xmx1024m"

2) Java で OutOfMemoryError を解決する 2 番目の方法はかなり難しく、多くのメモリがなく、最大ヒープ サイズを増やした後でもまだ java.lang.OutOfMemoryError が発生している場合に発生します。この場合、おそらくアプリケーションをプロファイルし、メモリリークを探します。Eclipse Memory Analyzer を使用してヒープ ダンプを調べるか、Netbeans や JProbe などの任意のプロファイラーを使用できます。これは困難な解決策であり、メモリ リークの分析と発見に時間がかかります。

    -vm
C:/Program Files (x86)/Java/jdk1.6.0/bin/javaw.exe
-startup
plugins/org.eclipse.equinox.launcher_1.2.0.v20110502.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.100.v20110502
-product
com.springsource.sts.ide
--launcher.defaultAction
openFile
--launcher.XXMaxPermSize
384M//incease to 512 mb
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xmn128m
-Xms256m
-Xmx768m
-Xss1m
-XX:PermSize=128m// increase to 512 mb 
-XX:MaxPermSize=384m//increase to 512 mb
于 2015-01-30T11:53:47.040 に答える
-2

Eclipse構成設定ファイル、つまりiniファイルに移動し
ますコメントの下のpermサイズを変更しますpermsizeをインクリメントするように指示します

-vm
C:/Program Files (x86)/Java/jdk1.6.0/bin/javaw.exe
-startup
plugins/org.eclipse.equinox.launcher_1.2.0.v20110502.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.100.v20110502
-product
com.springsource.sts.ide
--launcher.defaultAction
openFile
--launcher.XXMaxPermSize
384M//incease to 512 mb
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xmn128m
-Xms256m
-Xmx768m
-Xss1m
-XX:PermSize=128m// increase to 512 mb 
-XX:MaxPermSize=384m//increase to 512 mb
于 2015-01-30T11:35:12.687 に答える