「夫を成功」へ導く妻の秘訣 座談会

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

このQ&Aに関連する最新のQ&A

A 回答 (1件)

そのテストプログラムを動かすときに使うJVMはEclipseを動かしているJVMとは別のプロセスなので、eclipse.iniのヒープサイズは関係ありません。


テストプログラムのRun Configurationsの画面で、ArgumentsタブのVM argumentsのフィールドに-Xmxなどのオプションを指定してください。
    • good
    • 0
この回答へのお礼

早速のご回答、どうもありがとうございました。JVMの概念を理解していませんでした。eclipseについても参考になりました。

お礼日時:2010/02/13 12:39

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QJavaVMの最大占有メモリ

こんにちは

今度、常駐するJavaプロセスでファイルリソースをONメモリにして
処理速度向上の施策を考えているのですが、ファイルリソースが全部
で2GBくらいあります。

2GBから4GB増強しており、すべてメモリ展開しても十分な要領
ではあるので、VM起動オプションで上限を十分な要領3GBくらいに
設定しようと思うのですが、JavaVMで使えるメモリ上限がないか心配
です。

大丈夫でしょうか。

Aベストアンサー

先ほど書いたmanの内容の2000Mの表記ですが、あまりあてにならないようです。

WindowsVistaでは1500Mが限界、自宅のDebian(物理メモリは512M)では2600Mまでいけました。

やはり4Gが成功したのは、あくまでも私の経験として参考にしてもらうのがいいと思います。
もしもソフトだけではなくハードによっても左右されるとしたら、ブレードサーバで、めちゃくちゃ性能がよかったから可能だったのかもしれませんし。。

環境によって大きく左右されるようなので、質問者さんの環境で実際に試してしてみるのが一番早いと思います。

答えられることは以上です。。

Qjavaで大量のファイルを読み込む方法

javaプログラミングについて質問です。

例えば、a1.txt~a100.txtの100個のテキストファイルがある
として、これをループか何かを使って順番に読み込みたいのですが、
そのような方法はあるのでしょうか。

// ファイル入力ストリームを取得
BufferedReader br = new BufferedReader(new FileReader("a1.txt"));
BufferedReader br2 = new BufferedReader(new FileReader("a2.txt"));
BufferedReader br3 = new BufferedReader(new FileReader("a3.txt"));
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
BufferedReader br100 = new BufferedReader(new FileReader("a100.txt"));
という風に書くのが面倒に思っています。

宜しくお願いします。

javaプログラミングについて質問です。

例えば、a1.txt~a100.txtの100個のテキストファイルがある
として、これをループか何かを使って順番に読み込みたいのですが、
そのような方法はあるのでしょうか。

// ファイル入力ストリームを取得
BufferedReader br = new BufferedReader(new FileReader("a1.txt"));
BufferedReader br2 = new BufferedReader(new FileReader("a2.txt"));
BufferedReader br3 = new BufferedReader(new FileReader("a3.txt"));
・・・・・・・・・・・...続きを読む

Aベストアンサー

順番を無視していいのと同じディレクトリの中なら

String dirString = "C:/data";
File dir = new File(dirString);
File files[] = dir.listFiles();
for (int i = 0; i < files.length; i++) {
 if (!files[i].isDirectory()) {
  BufferedReader br = new BufferedReader(new FileReader(files[i].getName()));
  // 何かの処理
  // .....
 }
}
と、言った感じですかねぇ。

QJSPの処理の途中で、JavaScriptの処理をしたい

プログラムをJSPで記述している(<% %>タグ)のですが、
JavaScriptのalertやconfirmなどのポップアップするダイアログを
表示したいのです。それは可能なのでしょうか?

Aベストアンサー

No.2の回答に対する回答(変な日本語ですが)です。

JSPとJavaScriptの処理の行われる順番について考えていないと
エラーになることがありますよ。
大まかな流れは、
 JSPのソースをサーバ側で解釈、実行する(HTMLのソースを吐き出す)
  ↓
 クライアントに生成したソースを送信する
  ↓
 クライアント側のブラウザがソースを解釈する
  ↓
 ソースの中のJavaScriptを、ソースの上のほうから順次実行する
  ↓
 同時に、通常の表示(HTMLの解釈)も実行される

 と、こういう流れですので、例えば、JavaScriptで値を入力し、
JSPでその値を使おうとすると、エラーとなります。

 具体的にやりたいこと(やろうとしていること)を書いていただいたほうが
適切に回答できますが、上記が今考えられるエラーの原因です。

Qjava.lang.outofmemoryerror java heap space

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

Aベストアンサー

多分、JVM に設定したメモリサイズの上限値を超えてしまったのだと思われます。
Xms や Xmx オプションなどをつけて実行してみたらどうでしょう。

以下のサイトなどを参考にしてみて下さい。

参考URL:http://www.intra-mart.jp/download/doc/OutOfMemoryError.html

QIOException ってどういうときに起こるのでしょうか?

IOException ってどういうときに起こるのでしょうか?

http://www.atmarkit.co.jp/fjava/rensai2/javaent12/javaent12.html
を見て勉強しています。

  catch ( IOException e) {
    System.out.println( "キーボードが故障しているのかもしれません" );
  }

と書いてあります。
ハード(キーボード)が故障しているのを Java のプログラムのレベル(ソフトウェア)で感知できるというのがよくわかりません。「

NumberFormatException の方はわかるのですが・・・

Aベストアンサー

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接続だったりするわけですけど、
InputStreamは、その入力元の情報を持っていないので、
データを読み取る際は常に
IOExceptionをキャッチするコードを書かなくてはいけません。
たとえ、絶対にIOエラーが発生しないストリームだとしても。

さらに付け加えるなら、
そもそも「標準入力=キーボード」であるとは限りません。
(一般的にはキーボードであることが多いですが。)
Javaでは、
System.setIn(InputStream)
を呼び出して、標準入力を変えてしまうことができますし、
標準入力を指定してプログラムを実行することができるOSもあります。

追伸1:
例外をキャッチしたときは、
スタックトレースをプリントすることをおすすめします。
catch (IOException e) {
e.printStackTrace();
}

追伸2:
そのプログラムでIOExceptionを発生させる最も簡単な方法は、
readLine()を呼び出す前に
標準入力(System.in)を閉じてしまうことです。
System.in.close();

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接...続きを読む

QJUnitのテストメソッドごとのメモリの確保とかの話

JUnit関連の少しコアな話になります。
JUnitではデフォルトでは、実行する際初期処理としてまずテストクラス内のテストメソッドの数だけテストクラスをインスタンス化し、その後各テストメソッドを実行していく、という仕様になっているようです。そしてかつ、各インスタンスはテストクラス内のすべてのテストメソッドが終了するまでインスタンスの破棄は行わないようです。

上記の仕様であるはずだと言う根拠は、テストクラスにコンストラクタを作成し、そこにsysoutを記述することにより確認をしました。

上記の仕様であることが主原因で、Out of Memoryが発生してしまいます。
他にそうなってしまう原因はいくつかあって
・Springを利用していて初期化にメモリを結構使う
・テスト対象のクラスが複雑でテストメソッドの数が多くなる
・パソコンの物理メモリに限界がある
・DJUnitでカバレッジを調査することもあり、またテスティングペアの名前は統一したいので、テスト対象クラスとテストクラスを1対1に対応させたい。
などが挙げられます。VMの実行メモリを大きくしたり、テストクラスを分割してしまうなどの対処療法を行ってきましたが、何とか主原因をつぶす方法は無いものかと質問をした次第です。

(その他、使用しなくなったオブジェクトにnullをセットしたり明示的にgcの実行を指示する等の苦肉の策を行いましたが、ほとんど影響しませんでした)


前置きが長くなりましたが質問は、JUnitでテストを行う際、テストクラス内のテストメソッドの数だけインスタンス化しているものを、あるテストメソッドを実行する直前にインスタンス化し、そのテストメソッドが終了したらそのインスタンスを破棄するような設定はないのか、あればその方法を教えてほしい、ということになします。

だいぶ分かりにくい説明かもしれませんが…。
以上よろしくお願いします。

JUnit関連の少しコアな話になります。
JUnitではデフォルトでは、実行する際初期処理としてまずテストクラス内のテストメソッドの数だけテストクラスをインスタンス化し、その後各テストメソッドを実行していく、という仕様になっているようです。そしてかつ、各インスタンスはテストクラス内のすべてのテストメソッドが終了するまでインスタンスの破棄は行わないようです。

上記の仕様であるはずだと言う根拠は、テストクラスにコンストラクタを作成し、そこにsysoutを記述することにより確認をしました。

...続きを読む

Aベストアンサー

やっつけで試してみたら成功しました。

JUnitのソースを変更します。

変更するソースは「junit.framework.TestSuite」です。

1.クラスに内部クラス「LazyInstance 」を追加

static class LazyInstance implements Test {
 Class clazz;
 String name;
 Test instance;

 LazyInstance(Class clazz, String name) {
  this.clazz = clazz;
  this.name = name;
 }

 public int countTestCases() {
  return 1;
 }

 public void run(TestResult result) {
  if (instance == null) {
   instance = realCreateTest(clazz,name);
  }
  instance.run(result);
 }
}

2.メソッドcreateTestの中身をコピーしたstaticメソッド「realCreateTest」を追加
(長いので略しますが、createTestメソッドを丸々コピーしてメソッド名だけ「realCreateTest」に変えたものです)

3.メソッドcreateTestを以下のように修正

static public Test createTest(Class theClass,String name) {

 LazyInstance li = new lazyInstance(theClass,name);
 return li;
 }

やっつけで試してみたら成功しました。

JUnitのソースを変更します。

変更するソースは「junit.framework.TestSuite」です。

1.クラスに内部クラス「LazyInstance 」を追加

static class LazyInstance implements Test {
 Class clazz;
 String name;
 Test instance;

 LazyInstance(Class clazz, String name) {
  this.clazz = clazz;
  this.name = name;
 }

 public int countTestCases() {
  return 1;
 }

 public void run(TestResult result) {
  if (ins...続きを読む

QEclipse>ant deployでOutOfMemory(コマンドラインからはOK)

----------環境---------
WindowsXP professional sp2
Eclipse version : 3.2.0
Eclipse build ID: M20060629-1905
jdk:1.4.2_08
-----------------------
コマンドラインからant deployを実行すると
BUILD SUCCESSFUL になるのですが、
同じものをEclipseからキックすると、
コンパイルの途中でout of memory エラーとなります。
ヒープサイズを設定することで回避できるとのことなので、
ant.bat には以下の記述をしてあるのですが。。。
java.exe -XX:MaxPermSize=128m -Xmx512m -classpath "%ANT_HOME%\lib\ant-launcher.jar" "-Dant.home=%ANT_HOME%" org.apache.tools.ant.launch.Launcher %ANT_ARGS% %ANT_CMD_LINE_ARGS%

これだけでは情報が少ないかもしれませんが、
コマンドラインではOKで、EclipseからはNGという部分で
なにかアドバイスが頂けたらと思います。

----------環境---------
WindowsXP professional sp2
Eclipse version : 3.2.0
Eclipse build ID: M20060629-1905
jdk:1.4.2_08
-----------------------
コマンドラインからant deployを実行すると
BUILD SUCCESSFUL になるのですが、
同じものをEclipseからキックすると、
コンパイルの途中でout of memory エラーとなります。
ヒープサイズを設定することで回避できるとのことなので、
ant.bat には以下の記述をしてあるのですが。。。
java.exe -XX:MaxPermSize=128m -Xmx512m -classpath "%ANT_...続きを読む

Aベストアンサー

eclipse.exeがおいてあるフォルダにあるEclipse.iniの-Xmxの設定を変えてみては?
あとは javac -verbose してみるとか。

QEclipseでのJDBCドライバについて

Eclipse3.1でデータベース(mysql)にアクセスするプログラムを作ったのですが下記のエラーが出ます。

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

これはJDBCドライバのセットアップがうまく出来ていないからなのでしょうか?
またEclipseでは、~.jarというファイルをプロジェクトのWEB-INFのlibフォルダに入れれば使える印象があるのですが、参考書(EclipseのではなくJAVAなどの)などにあるようにTomcatのインストールフォルダ以下common/libに入れて環境変数を変更しないといけないのでしょうか?

ご存知の方教えてください、よろしくお願いします。

Aベストアンサー

WEB-INF以下に入れると実行はできるのですが、エクリプスが.javaファイルをコンパイルすることができません。projectの一覧を右クリックしてpropertyを選択し、ダイアログ右側からJava Build Pathを選択し、タグからLibrariesを選び、Add JARsボタンをおして.jarファイルを登録して下さい。
たぶんこれでコンパイルできるはずです。

Qダブルクォーテーション(””)を出力する方法(java)

javaでダブルクォーテーション(””)を出力する方法を教えて下さい。

ダブルクォーテーションが含まれたテキストを出力しようと、
fout.print("○○○");
のようにして○○○の中にダブルクォーテーションが含まれたテキストを入力するとエラーが起こります。
○○○の中の一つ目のダブルクォーテーションが閉じるダブルクォーテーションと認識されてしまっているようなのです。

どうしたらダブルクォーテーションを出力することができるか教えて下さい。
よろしくお願いします。

Aベストアンサー

こんにちは、

今ひとつ、意味解りませんが、下記のようなことですか??

System.out.println("\"ssss\"");

出力結果
"ssss"

Qエクセルで、頭に0をつけて数字の桁を揃える方法

エクセルで、必ず5桁の数字を入れる列があるとします。
ところが、数値データとして最初に作っているので、0が頭になく桁が足りない場合があります。
任意文字として5桁の数字にしたいのですが、

何かいい方法はありませんでしょうか?

例)
A列 A列
50      00050
1000  ⇒  01000
11111    11111

どうぞよろしくお願いいたします。

Aベストアンサー

次の方法は如何でしょうか。
(1)表示だけで良いのならば、セルの書式設定→表示形式→ユーザ定義で00000を設定
(2)データとして必要ならば、空き列(仮にB列)B1に=TEXT(A1,"00000")を入力、下方向にコピー→B列をコピー→A列に形式を選択して貼り付けで「値」を選択→OK、B列を削除


人気Q&Aランキング