1

Excel を読み込んで電子メールを送信する小さなユーティリティを作成しようとしました。そのためにApachePOIライブラリを使用しています。Eclipse からコードを実行すると、最初はjava.lang.OutOfMemoryError: GC overhead limit exceededエラーが発生しました。次に、Eclipse の VM 引数を追加-Xms1024mすると、プログラムは Eclipse で正常に動作しました。

次に、一連の Java プログラムとライブラリを RunnableJar にエクスポートし、依存ライブラリをバンドルしました。

コマンドを実行すると、コマンドラインから

java -Xms1024m -jar AutomateProcesses.jar

私はまだ同じエラーが発生しています。私は問題を理解することができません。誰かがこの点で助けてもらえますか?

4

3 に答える 3

1

最大ヒープサイズを設定し、Java VMがより多くのメモリを割り当てられるようにするには、コマンド-Xmx1024M(または-Xmx1G)を使用する必要があります。

-Xmsは、初期ヒープサイズの最小値をそれぞれ設定します。

于 2013-02-27T13:05:05.697 に答える
1

あなたは試すことができます

java -Xms512m -Xmx2048 -jar AutomateProcesses.jar

これがこのVMで起こっていることである場合、これは私が期待していることです。Javaプロセスのライブラリが別のプロセスを生成している場合、ライブラリはそれを構成するために他のいくつかのオプションを必要とする場合があります。


編集:

この質問への回答は、このエラーは、GCがメモリの回復に多くの時間を費やしているためにメモリを取得できないためであることを示しています。私はAppachePOIにあまり精通していませんが、JavaからExcelと通信している場合は、ExcelDLLへのCOM呼び出しを使用している可能性があります。ライブラリまたはその使用方法にバグがあり、オブジェクトがガベージコレクションからロックアウトされている可能性があります。そのため、GCはほとんど進行せずに非常にハードに動作します。

この問題のあるコードをより小さなテストケースに分離してみてください。

この投稿にも同様の問題があり、Excelでセルを処理する方法を書き直して、多数のcellStyleオブジェクトが作成されないようにしました。

同様に、この人はあきらめてデータをCSV形式で書き込みました。

于 2013-02-27T13:05:27.597 に答える
0

java.lang.OutOfMemoryError: GC オーバーヘッド制限の超過は、JVM ガベージ コレクションの問題 (GC に費やされた時間が長すぎる) の兆候です。このエラーは、実際には JVM 全体がハング状態になるのを妨げているため、追加の統計を収集できます。

Excel シートの読み取りは、ファイルの大きさによってはメモリを大量に消費する可能性があり、GC プロセスに圧力がかかります。

verbose:gc を有効にして分析すると、間違いなく役に立ちます。また、 JVM ヒープ ダンプを生成して、そのメモリが Java ユーティリティ プログラムのどこに保持されているかを判断することもできます。Java ヒープ サイズを調整するか、問題のあるメモリ保持を解決する必要があります。

于 2013-08-26T11:14:06.953 に答える