-1

java.lang.OutOfMemoryError: Java heap spaceに関連する多くのリンクと同様の質問を 調べましたが、解決策のどれも私の問題を解決しませんでした。ここに私の質問があります。ユーザーが約 2500 のレコードを持つ Excel ファイルをアップロードする Web アプリケーションがあります。アプリケーションはこのファイルの内容を読み取り、データベースに挿入します。しかし、700 レコードを挿入した後、throwable オブジェクトが catch= java.lang.OutOfMemoryError: Java heap spaceとして例外を取得しています

ファイルに含まれるレコードが 500 個または 500 個未満の場合、同じコードが機能します。以下は、catalina.batファイルのJAVA_OPTSおよびCATALINA_OPTS変数です

    JAVA_OPTS=-Xmx1536m -XX:MaxPermSize=128m
    CATALINA_OPTS=-Xms512m -Xmx512m

この問題を解決するために何ができるか教えてください。

4

4 に答える 4

0

おそらく Hibernate を使用してレコードを挿入しています。Hibernate は保存されたすべてのオブジェクトのセッション キャッシュを維持し、トランザクションがコミットされるまで実際の挿入を延期します。100 レコードごとにセッション キャッシュをフラッシュする必要があります。大規模な挿入を行う間は、2 次キャッシュを無効にすることもお勧めします。

Hibernate でのバッチ挿入に関連する問題は他にもいくつかあります。公式ドキュメントは、それを実装するすべての人にとって必読です。

于 2013-05-23T09:14:03.543 に答える
0

おそらく、ファイル全体をメモリにロードしています。Excel ファイルをプレーンテキストの CSV に変換してから、Java クラスを使用して 1 行ずつ読み取ることができますScannerか?

Scanner scanner = new Scanner("yourCsvFile.csv");

while (scanner.hasNextLine()) {
    String line = scanner.nextLine();

    //process your line
}
于 2013-05-23T09:09:55.130 に答える
0

この問題を解決するために何ができるか教えてください。

アプリケーションにメモリ リーク (つまりバグ) があるように思えます。コードを見なければ、どこにあるのかわかりません。ただし、これらの質問に対する回答は、Java プログラムでメモリ リークを見つける方法を説明しています。


JAVA_OPTS 変数と CATALINA_OPTS 変数で、ヒープ サイズに 2 つの異なる値を指定したことを指摘しておく必要があります。このうち 1 つだけが有効になりますが、どれが Tomcat の起動に使用されるスクリプトの詳細に依存します。

ただし、適切に作成されたアプリケーションは、スプレッドシートからデータをアップロードする際にメモリ不足になることはありません。512Mb のヒープ サイズで十分です。

于 2013-05-23T09:12:01.673 に答える
0

ファイル ストリームを閉じましたか?ファイル ストリームを閉じなかった場合、ヒープ サイズが非常に大きくなります。その場合、OutOfMemoryError 例外がスローされます。そのため、ファイル ストリームを閉じる場合は確認してください。

于 2013-05-23T09:17:56.037 に答える