
No.3ベストアンサー
- 回答日時:
この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バイトでしょう。
この回答を示すページ等はありますか?
No.4
- 回答日時:
論より証拠、ヒープが足りる範囲で実際に測ってみればいいのです。
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()の値の変化も確認する必要があるはず。
No.2
- 回答日時:
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ほどメモリをしめる。
この回答を示すページ等ありますでしょうか?
No.1
- 回答日時:
>このときargオブジェクトはどれだけのメモリを必要とするのでしょうか?
と言われても・・・
String[][][] arg = = new String[x][x][1];
を実行して消費するリソースの638倍を目安に考えればいいんじゃないですかね(オーバーヘッドや中身については考えていない)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Java javaのクラスの分け方について質問です。 APIの内部用と外部用でクラスを分けたいのですがインター 2 2022/04/26 16:06
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- Visual Basic(VBA) Excel VBAについて、 フォルダ内のファイルを全て開きたい場合、 FSOを使えば、Dirは使わ 1 2023/01/27 13:18
- C言語・C++・C# C# で、あるフォルダー内にあるすべてのテキストファイルを別のフォルダーにコピーする。 4 2022/11/21 13:23
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Java java final 1 2022/06/10 22:49
- Visual Basic(VBA) Vbaで数式をポーランド記法に変換するコードを作って実行しようとするとフリーズします。 1 2022/05/24 17:53
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EXCEL VBAにて動的にCheckBOXを...
-
EXCELのドロップダウンリストに...
-
bmp画像をjpegやpng画像に圧縮...
-
int + Integer
-
インスタンスとオブジェクト 生成
-
デザインパターンとは?
-
パワーポイントのVBAでテキスト...
-
複数シートの選択
-
オブジェクトの参照とは
-
ページのソースを動的に書き換...
-
CFileDialogでフォルダだけを選...
-
C++で*thisは何を指しているの...
-
java.io.Serializableとは何で...
-
Object型からDouble型へのキャスト
-
ワイルドカード<?>と型パラメー...
-
C言語の「->」の意味
-
クラスと構造体
-
ATL CWorkerThread
-
XAMLの動的生成について
-
COMコンポーネントって何?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
Excelで =EMBED("Acrobat Docu...
-
VBA 同じ名前のオブジェクトを...
-
EXCEL VBAにて動的にCheckBOXを...
-
VBAのWindowオブジェクトとWork...
-
C#でフォームのオブジェクト名...
-
ビジュアルC++でボタンの有...
-
COMコンポーネントって何?
-
Object型からDouble型へのキャスト
-
時間帯判定をする。
-
newは明示的にした方が良いのか?
-
戻り値がクラスオブジェクト
-
ワイルドカード<?>と型パラメー...
-
error C2712: オブジェクト ア...
-
Accessの連結・非連結オブジェ...
-
CoCreateInstanceでエラーになる。
-
オブジェクトレベルとメタレベル
-
多人数のじゃんけんプログラム
-
Rangeオブジェクトを一時的に作...
-
ワードで画像をドロップすると...
おすすめ情報