質問

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) {
}

}

通報する

回答 (2件)

アプレット使ったことがないので、参考意見です。

漠然とOut Of Memoryが出るという結果だけわかっているより、どの処理でOut Of Memoryが発生するかを特定すれば、たいていのOOMは解決します。

RuntimeクラスのfreeMemory(),maxMemory(),totalMemory()等を使って、ところどころでログを吐き出してメモリ使用量の推移を見るといいと思います。

余談:たいていのOOMは、永続ループが発生して、スタック切れかメモリ切れになっていたという場合が多いです。

この回答へのお礼

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

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

この回答へのお礼

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

このQ&Aは役に立ちましたか?1 件

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

新しく質問する

新しく質問する

このカテゴリの人気Q&Aランキング

毎日見よう!教えて!gooトゥディ

べんりQ&A特集