String[][][] arg = = new String[x][x][x];
でxが638の時にjava.lang.OutOfMemoryErrorになってしまいます。
VM起動時のヒープ最大値は1GBまで試しましたがダメでした。

このときargオブジェクトはどれだけのメモリを必要とするのでしょうか?

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

A 回答 (4件)

このnewで作られるオブジェクトは、配列オブジェクトだけです。

Stringオブジェクト自体は作られません。
なので、オブジェクトのサイズとしては、配列オブジェクトのサイズだけを考えればよいことになります。
(ちなみに、メソッド本体はクラスに1つあるだけで、作成したオブジェクトの数だけできるわけではないですから、オブジェクトを作ると、新たにメソッドの分のメモリが必要になるわけではありません)

さて、argオブジェクトのサイズですが、1つのオブジェクトへの参照を保持するのにまず何バイトが必要か考える必要があります。
32bitのJavaだったら、たぶん32bit=4バイトでしょう。
この配列の要素数はx^3個ですので、1つあたりが4バイトとなると、x^3 * 4 バイトのメモリが最低限必要ということになります。
もちろん、他にも多少メモリが必要でしょうが、xが大きいときのことを考えるわけですし、無視しても問題ないでしょう。

x=638の場合を計算してみると、638^3 * 4 = 1038776288 となります。
これは約990MB で、だいたい1GBです。
ヒープの最大値を1GBで試したということですので、計算と合っているのではないでしょうか。

この回答への補足

回答ありがとうございます。

>32bitのJavaだったら、たぶん32bit=4バイトでしょう。
この回答を示すページ等はありますか?

補足日時:2009/05/12 14:57
    • good
    • 0

論より証拠、ヒープが足りる範囲で実際に測ってみればいいのです。



int n=1000;
Runtime rt = Runtime.getRuntime();
long free1, free2;
System.gc();
free1 = rt.freeMemory();
String[] arg = new String[n];
free2 = rt.freeMemory();
System.out.println("Free diff: " + (free1 - free2));

うちのJava環境では、n=1000のときの結果が4016、n=2000のときが8016でした。このことから、String[]の配列1要素あたり4バイト消費することが分かります。
他のJava環境では違うかもしれません。64ビット環境用のJavaだったら、おそらく1要素あたり8バイトになるでしょう。

なお、上のコードは手抜きです。本当はfreeMemory()だけじゃなくてtotalMemory()の値の変化も確認する必要があるはず。
    • good
    • 0

xが638って、まさかarg[638][638][638]ってことかね?



配列の全要素にStringインスタンスを保管する、ということだな。Stringリテラルではなくて。まぁ、実際にどれだけ使われているかはわからないが、ざっと概算で必要なメモリを計算してみると。

まず、arg[638][638][638]という時点で、259694072個のStringオブジェクトが保管されるだけのメモリが必要になることはわかるだろう。クラスというのは、マジックナンバー、バージョン、コンスタントプール、インターフェイス、フィールド、メソッド、属性リストの各エントリ数などが最低限必要で、全く何も中身がないインスタンスでも既に24byteほどメモリをしめる。完璧に空っぽのインスタンスであったとして、

638×638×638×24 = 6232657728byte = 約5.8GB

と、ざっと6GBほどが必要いうことになる。これは中身が空っぽの状態であって、Stringには実際問題として多数のフィールドとメソッドがあるわけだから、まぁざっとこの10倍として、60GBぐらいか。

これに加えて、個々のString値の保管領域が必要となる。どのぐらいのテキストを保管するかによるが、平均10byte程度の文字列であったとしても数GBは必要になる。実際問題として、100GBぐらいはないと正常に動かすのは難しいかも知れない、という結論になるが。

この回答への補足

回答ありがとうございます。

>全く何も中身がないインスタンスでも既に24byteほどメモリをしめる。
この回答を示すページ等ありますでしょうか?

補足日時:2009/05/12 14:55
    • good
    • 0

>このときargオブジェクトはどれだけのメモリを必要とするのでしょうか?



と言われても・・・

String[][][] arg = = new String[x][x][1];

を実行して消費するリソースの638倍を目安に考えればいいんじゃないですかね(オーバーヘッドや中身については考えていない)
    • good
    • 0

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

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

このQ&Aを見た人はこんなQ&Aも見ています

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

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

QMeはやはりメモリ増設しても意味がないのでしょうか?

現在メモリを192MBに増設したオールインワンノートブックPCをしようしています。積み込んでいるOSはMEです。
私はflashやイラストレーター、フォトショップを頻繁に使うのですが、とにかくよく「メモリ不足」という警告がでてきます。
もう耐えられないので、もっとメモリを増設してやろうかと思っているのですが、たしかMEはメモリをいくら増設しても意味がないようなことを聞いたことがあります。
意味があるのならば、さらに256MBでも無理やり載せてやろうかと思っています。

本当はPCまるごと替えて、思い切ってデスクトップPCを買って、そっちにメモリを1Gぐらい積み込もうかとも思っています。ですが、今はまとまったお金がないので、とりあえず現状でいかにお金をかけずして、難題をクリアーするかということになってしまいます。やっぱりOSがMEじゃ、何をしても無駄になっちゃうんでしょうか・・?
2000に替えたらメモリを増設する意味がありますでしょうか??xpにしたら意味があるとも思うのですが。

ですが、CPUもセレロンの670メガヘルツしかないので、
いまどきのPCの足元にも及びません。
xpに積み替えて、そしてメモリを512MBにしたとして、
このcpuではやはり意味がないでしょうか??

現在メモリを192MBに増設したオールインワンノートブックPCをしようしています。積み込んでいるOSはMEです。
私はflashやイラストレーター、フォトショップを頻繁に使うのですが、とにかくよく「メモリ不足」という警告がでてきます。
もう耐えられないので、もっとメモリを増設してやろうかと思っているのですが、たしかMEはメモリをいくら増設しても意味がないようなことを聞いたことがあります。
意味があるのならば、さらに256MBでも無理やり載せてやろうかと思っています。

本当はPCまるごと替...続きを読む

Aベストアンサー

#3です。
#9でのご質問の回答です。
最近発売されている256MBのメモリーに使用されているメモリーチップは、
新開発である256MbitDRAMを使用しており、対応するチップセットは、インテル社製 intel830以降のチップセットになります。
メモリーの高密度実装によりコストを抑える事が可能なうえ、一つのメモリチップ
が大容量ですから、より小さく、より大容量のメモリーボードの作成が可能に
なりました。
以前のチップセットでは、128MbitDRAMまでしか認識できませんから、
メモリチップの数そのものを増やす事により、大容量化に対応しています。
よって、簡単な見分け方ですが、新しいタイプのものは、片面に4個のメモリー
チップを載せ、両面で8個のメモリーチップを使ったタイプになります。
これは、見た目には、今までのメモリーと何ら変わりがありません。
一方、旧タイプのメモリーチップを使用したものは、上記のものより小型の
メモリーチップを使用することにより、片面に8個、両面で18個のメモリー
チップを載せてあります。
よって、今までのタイプより少しだけ高さが大きくなりますが、MJ700R
への取り付けには支障が無い事が、メモリーメーカーによって確認、及び、
動作検証がなされております。
メモリチップの特殊性と単価の面から、バルク品においては、新型チップを使用
した物しか見つからないのでしょうか?
ちなみに、対応製品である、メルコ社のVN133-H256MYが、私の家の
近所のお店では9000円でした。
メルコ社さまのホームページに写真がありますので参照してください。
http://buffalo.melcoinc.co.jp/download/photo/leaf.php?name=VN133-H256MY

参考URL:http://buffalo.melcoinc.co.jp/download/photo/leaf.php?name=VN133-H256MY

#3です。
#9でのご質問の回答です。
最近発売されている256MBのメモリーに使用されているメモリーチップは、
新開発である256MbitDRAMを使用しており、対応するチップセットは、インテル社製 intel830以降のチップセットになります。
メモリーの高密度実装によりコストを抑える事が可能なうえ、一つのメモリチップ
が大容量ですから、より小さく、より大容量のメモリーボードの作成が可能に
なりました。
以前のチップセットでは、128MbitDRAMまでしか認識できませ...続きを読む

QJAVAの質問です。 ( String args[] )それとも(String[] args) ?

MAINのこの引数ですが、
どちらが正しいのでしょうか?

また、そもそも この[]はなぜ必要なのでしょうか?
配列を意味していますか?

Aベストアンサー

mainに関してだけは (String[] args) が正しい・・・と思いましたが
( String args[] ) でコンパイルも実行も両方通ったのでどちらも正しいようです

配列を意味しています
例えば
String[] hai={"どちらも","正しい","とは","知らなかった"};
String hai[]={"どちらも","正しい","とは","知らなかった"};
ではどちらも配列を宣言した上でhai[0],hai[1],hai[2],hai[3]に文字列を代入しています。

String[] hai=new String[3];
String hai[]=new String[3];
で配列領域を確保してから
hai[0]="どちらも正しい";
のように代入してゆく方法もあります


main(String[] args) のString配列argsの中にはコマンドプロンプトでの実行時にプログラム名の後ろにスペースで分けて入力した文字列が[0]から順に代入されます

実行時に例えばHello.javaを実行するため

java Hello と入力して実行した時はargsには何も入っていませんが

java Hello nyuuryoku shita と入力して実行した時には

Hello.javaが実行された時mainメソッドの中で
args[0]には nyuuryoku が
args[1]には shita が代入された状態になっています

実行と同時に入力した値をプログラム内で使いたい時に用いる変数です

mainに関してだけは (String[] args) が正しい・・・と思いましたが
( String args[] ) でコンパイルも実行も両方通ったのでどちらも正しいようです

配列を意味しています
例えば
String[] hai={"どちらも","正しい","とは","知らなかった"};
String hai[]={"どちらも","正しい","とは","知らなかった"};
ではどちらも配列を宣言した上でhai[0],hai[1],hai[2],hai[3]に文字列を代入しています。

String[] hai=new String[3];
String hai[]=new String[3];
で配列領域を確保してから
hai[0]="どちらも正しい";...続きを読む

Qメモリセルと変数 ( a = b + cの意味)

メモリセルと変数の関係について勉強しています。

動的(non-static)なローカル変数 bとcが宣言されたあと、
次の文が 出現したとします。

int a = b + c;

問題を解いてるのですが、問題によると、
この文章で 変数とメモリセルが結びつく 機会を二つ答えよ。

「変数aの値が aのメモリセルに保存される」というのが、一つだと考えるのですが、もう一つが思いつきません。

変数bは "int a = b + c;" の以前に、宣言されているので、bとbのメモリセルはこの文より前に結びついてます。
同様にcも この文より前にメモリセルと結びついています。

考えられるのは、b + c なのですが、
a = b + c
の意味が
「b+c の計算結果の値を a のメモリセルに 保存する」
という 答えが二つになります。
a = b +c の意味はこれでいいのでしょうか?

文章がわかりにくくてすみません。
要はa = b + cの本質的意味が知りたいのです。

Aベストアンサー

なんとなく、問題文自体が不自然な気がしますが……。

int a = b + c;
の意味そのものは、

1) auto 変数である、a を定義する
2) 値、b + c で、a を初期化する

ということになります。

「変数aの値が aのメモリセルに保存される」
ではなくて、
「変数 a が、メモリセルに確保される(この時点では、値は未定)」
「その 変数 a を、b + c の値で初期化する」
の2段階ですね。

QInteger.parseInt()について public static void main(String[] args) { int a =

初歩的な質問だと思うのですが、、、

public class TestTree {

public static void main(String[] args) {

int a = Integer.parseInt(args[0]);
int b = Integer.parseInt(args[1]);

GreatTree myTree = new GreatTree(a, b);
myTree.makeTree();
myTree.makeGround();
}

}

というプログラムについて、Integer.parseInt()はどういう意味を持つのかがわかりません。ただ適当につけた名前だとは思えないです。教えてもらえたら幸いです。お願いします。

Aベストアンサー

> argsで入力されたものは例え数字でも文字列として扱われているから、それをintにしている。ということですよね?

引数として (String[] args) と設定されていますので、
おっしゃるとおり 引数 args[]配列に入っているものは、文字列です。

ポイントは、 「String[]」でしょうか。。

QCPU使用率とメモリの物理メモリの意味教えてください

CPU使用率とメモリの物理メモリの意味教えてください。
(タスクバマネイジャー、パフォーマンスにあるグラフ変化)
サイドバーにあるメーターは何を注意すれば良いのですか?

Aベストアンサー

ガジェトのメーターは現在のシステム状況を確認できる物の1つと考えてください。大きいメーターはCPUの使用率でプログラムを起動したり
アプリケーションを実行すると動きます。車のメーターと同じでレッドゾーンがありますがCPUの場合は100%使用率になる事は良くありますので一時的に振り切っても心配はありません。
ただあまり振り切った状態が続くのであれば、CPUの負荷がかかりすぎですので、CPUを乗せかえるか、パソコン自体の買い替えが良いかと。
小さいメーターは今搭載しているメモリーの現在の使用率です。
メモリーが1GBとして、30%なら333MB使用中ということです。
こちらは、振り切った状態が起こるようならメモリ不足ですので
早めに増設をお勧めします。

Q「String arr[]」 と「String[] arr」の違いは?

「String[] arr」の方が良い理由も教えてください。

Aベストアンサー

String arr[]
はStringクラスの変数がいっぱい
という解釈ね。

String[] arr
はString[] の変数arrを意味するわ。

内部的な処理は同じだけど見た目が違うの。
Javaでは配列も一つのオブジェクトとして扱っているため
String[]クラスのインスタンスであるarrという表現の方がJavaっぽい
という回答になるかな。

蛇足だけど
表現を統一しておけば何かと便利よね。

Qメモリ増設する意味はあるでしょうか?

メモリ増設する意味はあるでしょうか?

ゲームをしているのですが
3Dの場面になると
ものすごい緩慢です。
少しでも早めたいのですがなんとかなりますでしょうか?

以下が推奨対応スペックで
CPU Pentium III-800以上(Pentium4-1.3G以上推奨)
OS Windows2000/XP/Vista
メモリ 256MB以上(512MB以上推奨)
対応機種 VRAM:64MB以上

自分のノートパソコンのスペックが
メーカー:TOSHIBA
機種:dynabook EX/522CME3
メモリ 768M(最大1GB)
CPU他 モバイルCeleron2.2GHz(256KB)
    Intel® 852GM チップセット
    ビデオRAM 最大64MB(メインメモリと共用)
OS   Windows XP Home

なのですが、メモリ増設で
動きが少しは早くなりますでしょうか?

他に3D場面で動きが早くなる方法ありますでしょうか?

Aベストアンサー

メモリ増設による速度アップはあまり期待できないと思います。
852GMはグラフィック機能内蔵チップセットですが、その描画能力は決して褒められたものではありません。
ゲーム等を快適に行うためには高速なグラフィックカードが必須といえるでしょう。

現状のPCのままで描画を多少でも速くするならば、色数をけちるとか解像度を低く設定する(可能であれば)位しか思いつきません。

Qmain(String[] args) の args ってなに?

JAVA初心者のjavakuraと言う者です。
細かな疑問なのですが、よく使われる main(String[] args) のargsはなんなんでしょうか?
Stringクラスの変数という事なんですよね?

暗黙の了解で args が使われているのなら、なんの略なんでしょうか?

Aベストアンサー

argumentsの短縮とは思いますが、議論とはちょっと違いますね。新しい辞書などには、「【コンピュータ】関数の引き数」というように掲載されていますから、既にそういう意味として定着しているんじゃないかと思いますよ。

mainの引数の変数名がargsである理由はありません。別に、なんの決まりでもありません。main(String[] hoge)だろうが、main(String[] okwave)だろうが、なんでもかまいません。
 なぜargsなのかというと、Javaの開発元であるSun Microsystemsが当初から配布していたドキュメントでそういう変数名を使っていて、初期の頃の解説書の類いがみんなそのスタイルを踏襲していたので、なんとなく「そうするのがマナー」みたいな暗黙の了解ができあがった・・・というようなことなんじゃないでしょうか(想像ですが)。
 また、Javaに限らず、forの繰り返しで使われるカウンタ変数は、未だにi,j,kという名前が使われていたりしますね。これなども、すべて、そうする理由は全くありません。

ただ、実際にコードを書いていると、「暗黙の了解」があったほうがコードは書きやすいんです。「iとあったらforのカウンタ」「argsといえばmainの引数」と、誰もが暗黙の了解としてそう書くのが当たり前ということになると、それだけ「この変数はなんだ?」と悩む必要がなくなるわけです。逆に、argsやiを全く別の場所で使ったりすると、他人がそのコードを読んだ場合、「あれ? このargsってmain引数と思ってたんだけど・・・違うのか?」なんてことになり、勘違いしたりする可能性が出てきます。
 そういうこともあって、あえて暗黙の了解を無視したコードを書く人はあまりいないんでしょう。そうする利点があまりありませんから。

argumentsの短縮とは思いますが、議論とはちょっと違いますね。新しい辞書などには、「【コンピュータ】関数の引き数」というように掲載されていますから、既にそういう意味として定着しているんじゃないかと思いますよ。

mainの引数の変数名がargsである理由はありません。別に、なんの決まりでもありません。main(String[] hoge)だろうが、main(String[] okwave)だろうが、なんでもかまいません。
 なぜargsなのかというと、Javaの開発元であるSun Microsystemsが当初から配布していたドキュメントでそうい...続きを読む

Qタスクマネージャの、メモリの「使用可能容量」と「空きメモリ」の意味を教

タスクマネージャの、メモリの「使用可能容量」と「空きメモリ」の意味を教えてください。(画像の通りです。)

■ windows 64ビットOS(windows7)メモリ搭載6GBです。
問題が発生しているアプリケーションは、FireWorksです。

メモリ不足でアプリケーションが、毎日クラッシュしています。
クラッシュが多いので、頻繁にファイル保存をしています。

また、時々メモリ不足のメッセージが出ます。
(メモリとありますので、メインメモリかと思っています、)

メモリ消費量は、3GBまで到達していません。メモリ不足で問題が発生したときのタスクマネージャーからのメモリ状況画像を添付しています。アプリケーションは、program files(x86)のディレクトリにインストールされた、X86アプリケーションです。

以下が質問内容です。
(1)ひとつのアプリケーションで使用できるメモリの上限は、X86のアプリと、X64アプリで違いますか?X86アプリは4GBまででしょうか?

(2)それぞれX86アプリおよびX64アプリで、1アプリケーションで使用できるメモリの上限は、いかほどですか?


お忙しい中、すみませんが、よろしくお願いいたします。

タスクマネージャの、メモリの「使用可能容量」と「空きメモリ」の意味を教えてください。(画像の通りです。)

■ windows 64ビットOS(windows7)メモリ搭載6GBです。
問題が発生しているアプリケーションは、FireWorksです。

メモリ不足でアプリケーションが、毎日クラッシュしています。
クラッシュが多いので、頻繁にファイル保存をしています。

また、時々メモリ不足のメッセージが出ます。
(メモリとありますので、メインメモリかと思っています、)

メモリ消費量は、3GBまで到達していません。...続きを読む

Aベストアンサー

FireWorksのバージョンは何でしょうか?

あまり古い世代のものだと、プログラム内部のレジスタの有効桁数をオーバーフローして、十分に空きがあるのにメモリ不足のエラーが生じることもあります。

Qpublic static void main (String args[])

基本すぎて申し訳ありませんが、
public static void main (String args[])とはどういう意味を持っていますか?
教えてください。。

Aベストアンサー

staticとかの意味はNo1の方の説明以外にありません。

mainは最初に実行されるメソッドという説明がされますので、「クラスを実行する時の引数とは?」と引っかかっているのかもしれませんね。
これはコマンドライン引数と呼ばれます。

たとえば、次のプログラム

public class ArgsTest{
  public static void main(String[] args){
    System.out.println(args.length);
    for(int i = 0 ; i < args.length ; i++){
      System.out.println(args[i]);
    }
  }
}

これを
>java ArgsTest abcde fghij(エンター)
として実行するとabcdeとfghijが引数となります。

ちなみに、mainはpublicでstaticなメソッドなので、
public class ArgsTest2{
  public static void main(String args[]){
    tamesi();
  }
  void tamesi(){
    String[] test = {"abcde","fghij"};
    ArgsTest.main(test);
  }
}
のように、外部のクラスからクラス名.mainで呼び出せます。(この2つのプログラムは、私が悩んだ時に試しにつくったものです)

ちなみにargsはarguments(=引数)の略で、mainの引数として、よく使われます。
argvのほうはargument valueの略です。C言語を使っていた人の中にはargvを使う人がいるかもしれません。

staticとかの意味はNo1の方の説明以外にありません。

mainは最初に実行されるメソッドという説明がされますので、「クラスを実行する時の引数とは?」と引っかかっているのかもしれませんね。
これはコマンドライン引数と呼ばれます。

たとえば、次のプログラム

public class ArgsTest{
  public static void main(String[] args){
    System.out.println(args.length);
    for(int i = 0 ; i < args.length ; i++){
      System.out.println(args[i]);
    }
  }
}

...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング