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) {
}
}
No.1ベストアンサー
- 回答日時:
現状では、OOMEは出ません。
たぶん、最初はdrawImageが配列で、大量の画像(巨大な画像)をそこに収めたのではないでしょうか。回答ありがとうございます。おっしゃるとおり、画像の容量を縮小(4分の1。もともと一つ2Mno画像が8枚ありました(汗))して試したら、うまくいきました。
No.2
- 回答日時:
アプレット使ったことがないので、参考意見です。
漠然とOut Of Memoryが出るという結果だけわかっているより、どの処理でOut Of Memoryが発生するかを特定すれば、たいていのOOMは解決します。
RuntimeクラスのfreeMemory(),maxMemory(),totalMemory()等を使って、ところどころでログを吐き出してメモリ使用量の推移を見るといいと思います。
余談:たいていのOOMは、永続ループが発生して、スタック切れかメモリ切れになっていたという場合が多いです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
<forEach> 内で供給された "ite...
-
【java】検索フォームの検索結...
-
Javaを説明するには
-
アプレットを実行すると、×が表...
-
itextの日本語のエラー(バージ...
-
JAVA 乱数で同じ数字を出さな...
-
Java配列でNullPointerExceptio...
-
JSPやサーブレットでSystem.out...
-
csv出力について
-
C言語のポインターに関する警告
-
ダブルクォーテーションのrepla...
-
IF関数でEmpty値を設定する方法。
-
System.err. printlnとSystem.o...
-
ResultSetの内部構造(Java)
-
ループ処理の際、最後だけ","を...
-
ORA-01858: 数値を指定する箇所...
-
実数からの小数部の取得
-
ダブルクォーテーションを含む...
-
Java Struts ~に対するゲッタ...
-
パソコンキーボードで時分秒を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
eclipseに記述したjavaファイル...
-
「例外 *** は対応する try 文...
-
Selenium IDEでexportしたコー...
-
ColabでのPytorchのエラー
-
setAttribute(String, int)は適...
-
Javaを使ってデジタル時計を作...
-
<forEach> 内で供給された "ite...
-
importするには java.io.*; imp...
-
importとextendsの用い方の違い...
-
do while文のエラー??
-
javaで警告音
-
ActionForm form にnullが入っ...
-
(急募) Java (CSVをしよう)一...
-
文字サイズが可変のラベル
-
JavaアプリでWWWサーバにアクセ...
-
生年月日と今日の日付から年齢...
-
正規表現について
-
import 文
-
Androidで画面遷移ができません.
-
【JAVAエラー】互換性のない型...
おすすめ情報