Javaでファイルの解析と書き込み処理でOutOfMemoryErrorが発生する理由と対処方法

このQ&Aのポイント
  • Javaでファイルから読み込んだデータを解析し、別ファイルに書き込む処理を作成した際に、OutOfMemoryErrorが発生する問題が発生しています。ファイルサイズが40MB程度の場合に起こります。
  • 実行時のCPU使用率は100%に達しますが、メモリ使用量は最大値の半分程度であり、十分な余裕があるように見えます。しかし、メモリを使いすぎている可能性があります。
  • メモリ使用量を80%程度に制限する方法はありますか?メモリ最大値に関する設定方法や、メモリ使用量の最適化について教えてください。
回答を見る
  • ベストアンサー

メモリが足りないのでしょうか???

javaで、ファイルから読み込んだデータを、解析して、 そのまま、別ファイルにか書く処理をつくりました。 しかし、以下のようなエラーが発生して、途中で終了してしまいます。 ファイルサイズは40MB程度。 20MB程度の時は、うまく行きます。 Exception in thread "main" java.lang.OutOfMemoryError <<no stack trace available>> 実行時、CPU使用率は、100%までいってしまうのですが、 メモリ使用量は、最大値の半分程度で、余裕はありそうなのですが、 メモリを使い過ぎなのでしょうか? メモリ最大値の80%ぐらいまで使いたいのですが 設定方法などありますか?

  • Java
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.1

javaVM で利用できるヒープメモリサイズを指定できます。 java -Xmxサイズ クラスファイル という感じ。利用しているサイズは Runtime#freeMemory() で取得できます。 とはいうものの、処理がまずいんじゃないでしょうか? 巻物のように長いメソッドがあり、山のように変数を使っていて、もう利用される ことのないインスタンスが山のように抱えられている、とか。

pikodon
質問者

お礼

確かに、その場しのぎのプログラムなので、 処理が力ずくというところがあります。 ファイルをあるブロック単位で読み込み、 必要データを取出しているのですが、 なるべく、不要なデータはすぐ、clearするように しているのですが、なにか忘れているのかもしれません。 依然は、200MBぐらいまでは、読み込んでくれたのですが、 別のマシーンに変わって、今回、エラーが出てしまったという次第です。 あっと、今、java -Xmxサイズを指定したら、出来ました。 ありがとうございます。大感謝!

関連するQ&A

  • 最大ヒープサイズに対して、JMVのメモリサイズがありえない程小さいです

    Javaとeclipseを使い始めてまだ2週間程度ですが、よろしくお願いします。 ある簡単なテストプログラムで Exception in thread "main" java.lang.OutOfMemoryError: Java heap space が出ましたので、java.lang.Runtime のメソッドを使って、JVMのメモリサイズを調べてみました。 JVM内の空きメモリを調べる freeMemory() メソッドを随所に入れると、確かにある箇所から激減したので、リークしてるらしきところは発見できました。ただ、JVMメモリの総容量を出力する totalMemory() を入れてみると、プログラム開始直後から、この値が5177344しかありません。API仕様によればbyte単位だそうなので、初めからJVMには4.9MB程度しか割り当てられていないということなのでしょうか。以下に示すように、eclipseで設定している最大ヒープサイズは、512MBにしています。(これ以上大きくとると、eclipseの起動エラーになりました。原因はわかりません。) 実行環境はWindowsXP(メモリ1GB)で、Windowsのタスクマネージャのパフォーマンスタブに表示される利用可能な物理メモリは、350MB~400MBくらいです。この環境でこれだけのJVMサイズしか取られない原因は、何が考えられるでしょうか?あるいは、どこかの設定が間違っていますでしょうか? eclipse.iniの内容は、以下の通りです。 -startup plugins/org.eclipse.equinox.launcher_1.0.201.R35x_v20090715.jar --launcher.library plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.0.200.v20090519 -product org.eclipse.epp.package.jee.product --launcher.XXMaxPermSize 256M -showsplash org.eclipse.platform --launcher.XXMaxPermSize 256m -vmargs -Dosgi.requiredJavaVersion=1.5 -Xms40m -Xmx512m

    • ベストアンサー
    • Java
  • java string 配列の使用メモリ

    String[][][] arg = = new String[x][x][x]; でxが638の時にjava.lang.OutOfMemoryErrorになってしまいます。 VM起動時のヒープ最大値は1GBまで試しましたがダメでした。 このときargオブジェクトはどれだけのメモリを必要とするのでしょうか?

    • ベストアンサー
    • Java
  • Javaが実行されません。

    javacコマンドは正常に動くのですが、 javaコマンドを使用すると Exception in thread "main" java.lang.NoclassDefFoundError:Sample2 と表示されるんですよ。 どのクラスファイルに対してもそうで、 以前実行できたクラスファイルに対しても そのエラーが出るんです。

    • ベストアンサー
    • Java
  • javaの実行エラーです

    Javaのソースファイルをコンパイルまでしました。Classファイルもできています。 実行すると、下記のエラーです。 Exception in thread "main" java.lang.UnsupportedClassVersionError: Hello (Unsupported major.minor version 50.0) よろしくお願いします。

  • java.lang.outofmemoryerror java heap space

    java のクラスファイルをjarにして、実行する時、大きいなファイルを読むと、java.lang.outofmemoryerror java heap spaceのエラーが出できます。 どう解決すればいいですか。

    • ベストアンサー
    • Java
  • Javaが実行されません。

    javacコマンドは正常に動くのですが、javaコマンドを使用すると Exception in thread "main"java.lang.NoclassDefFoundError:Sample2 と表示されるんですよ。 原因を教えてください。

  • VC++におけるメモリ使用量について

    現在VC++6.0を使用して数値解析を行っているのですが、ワークステーションでメモリを1256MBに増設して、500MBくらいのメモリを使用する解析を行ったところ、「トータルイメージサイズが最大値(268435456)を越えています; イメージは動作しない可能性があります」という警告が出ました。しかし実行してみると正常に動作します。 なぜそんな警告がでるのでしょうか?どなたか教えてください、お願いします。 ※OSはWINDOWS2000を使用しています。

  • メインメモリから共用するビデオメモリって?

    よくカタログなどにメインメモリから最大64MB共用するとか書かれているビデオメモリってどういう時にどの程度、使われるのでしょうか? いずれもXPで メイン512MBから最大128MB メイン512MBから最大64MB メイン256MBから最大16MB使用 のPCを使ったことがありますがWMPとか、DVD再生とかで特に差を感じたことがないのですが… この最大値の差によって何が違ってくるのでしょうか? また、どうした時にビデオメモリを大量に使うのでしょうか? 3Dゲームとかでしょうか?

  • Java起動・・・?

    学校でJavaの勉強をしています。 そこで家でもやってみようと思い学校と同じやり方をしたのですが起動?しません。 コマンドプロンプトで実行しているのですが、 Exception in thread "main" java.lang.NoClassDefFoundErrorと出ます。 どのようにすれば出来るようになりますか?

    • ベストアンサー
    • Java
  •  Exception in thread "main" java.la

     Exception in thread "main" java.lang.StackOverflowError というエラーが出ます  moji()にtestという変数をいれてやり、mainから、書かそうとしていますが、  Exception in thread "main" java.lang.StackOverflowError というエラーが出ますが、何故かわかりません。  宜しくお願いします。 ************************************************************ public class ArgsTest2 { public static void main(String args[]) { moji(); } public static void moji() { String[] test = {"abcde","fghij"}; main(test); } }

    • ベストアンサー
    • Java