• ベストアンサー

java.lang.OutOfMemoryErrorというエラーがでる。

javaを勉強しています。タイトルのように java.lang.OutOfMemoryErrorというエラーが出てしまいます。少し調べてみたらどうやらメモリーの使いすぎ(?)のようなのですが、プログラムの方に問題があるのでしょうか?それとも使えるメモリーを増やすといった解決策を取ったほうがいいのでしょうか? よろしくお願いします。プログラムはまず画像が表示されて、左クリックすると次の画像へ変わる、といった処理をするアプレットです。 package jibundesukosidutu; import java.applet.Applet; import java.awt.Graphics; import java.awt.MediaTracker; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; public class Main extends Applet implements MouseListener{ File[] imagelist; File image = new File("image"); BufferedImage drawImage; static int i = 0; MediaTracker mt = new MediaTracker(this); public void init(){ imagelist = image.listFiles();//ディレクトリの画像ファイルたちを配列に入れていく。 addMouseListener(this); try { drawImage = ImageIO.read(imagelist[i]);//drawImageメソッドで画像ファイルとして引数を取れるように、型変換しておく。 } catch (IOException e) { e.printStackTrace(); } } public void paint(Graphics g){//drawImageファイルを表示するだけ int w, h; w = getSize().width; h = getSize().height; mt.addImage(drawImage,0); try { mt.waitForID(0); } catch (InterruptedException e) { e.printStackTrace(); } g.drawImage(drawImage,0,0,w,h,this);//imagelist[0]を表示したい。 } public void mouseClicked(MouseEvent e) { int btn = e.getButton(); if(btn == MouseEvent.BUTTON1){//左クリック=進め System.out.println("左クリック"); i++; //searchFile(true); try { drawImage = ImageIO.read(imagelist[i]); } catch (IOException e1) { e1.printStackTrace(); } repaint(); }else if(btn == MouseEvent.BUTTON2){ System.out.println("右クリック"); //searchFile(false); } } public void searchFile(boolean next){ //next→次の画像、false→前の画像 } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } }

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

  • ベストアンサー
  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.1

現状では、OOMEは出ません。たぶん、最初はdrawImageが配列で、大量の画像(巨大な画像)をそこに収めたのではないでしょうか。

nabewari
質問者

お礼

回答ありがとうございます。おっしゃるとおり、画像の容量を縮小(4分の1。もともと一つ2Mno画像が8枚ありました(汗))して試したら、うまくいきました。

その他の回答 (1)

  • ggaogg
  • ベストアンサー率43% (38/88)
回答No.2

アプレット使ったことがないので、参考意見です。 漠然とOut Of Memoryが出るという結果だけわかっているより、どの処理でOut Of Memoryが発生するかを特定すれば、たいていのOOMは解決します。 RuntimeクラスのfreeMemory(),maxMemory(),totalMemory()等を使って、ところどころでログを吐き出してメモリ使用量の推移を見るといいと思います。 余談:たいていのOOMは、永続ループが発生して、スタック切れかメモリ切れになっていたという場合が多いです。

nabewari
質問者

お礼

回答ありがとうございます。それらの解決方法は全く知らなかったので、とても参考になりました。

関連するQ&A