- PR -

メソッドとメモリについて

投稿者投稿内容
ヒデサク
会議室デビュー日: 2008/04/30
投稿数: 9
投稿日時: 2008-05-11 05:37
いつもお世話になっています。
メソッドとメモリに関して分からない事があり、
質問させてもらいました。

例えば、

 int a = 10;

とした場合、メモリ上では4バイト分のメモリを確保し、
そこに10と言う値を格納していると思うのですが、

 void methodA(){
 }

の様なメソッドの場合、
メモリ上ではどのような事が行われているのでしょうか。

参照型変数の様に、methodA を指し示す
アドレスを入れる領域をメモリ上に確保し、
そこにmethodA のアドレスの先頭アドレスを入れて、
 methodA();
とする度にその参照を使ってmethodA アクセスする。

と言った感じなのでしょうか。
ranco
大ベテラン
会議室デビュー日: 2007/11/02
投稿数: 112
投稿日時: 2008-05-11 09:01
methodA等はクラスのバイナリ==メモリ上ではテーブル上の番地データに置き換えられ、methodAが呼ばれているところでは実行がその番地へジャンプし、プロセッサのRETURN命令に出会うまでそのメソッドのコードの実行が続きます。簡単なクラスをjavap -cしてみて、そのあたりを理解してください。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2008-05-11 10:42
引用:

ヒデサクさんの書き込み (2008-05-11 05:37) より:
参照型変数の様に、methodA を指し示す
アドレスを入れる領域をメモリ上に確保し、
そこにmethodA のアドレスの先頭アドレスを入れて、
 methodA();
とする度にその参照を使ってmethodA アクセスする。


ご質問の意図が良くは分かりませんが、オブジェクト指向言語における、いわゆる vtable のことを言われているのでしょうか?
http://ja.wikipedia.org/wiki/%E4%BB%AE%E6%83%B3%E9%96%A2%E6%95%B0%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB

それとも、オブジェクト指向言語に関わらず、コンピューター一般のメソッド(というかサブルーチン)呼び出しの話でしょうか。一般に、データーとコード(メソッドなどのプログラム)は分離していて、データーは動的に配置されますが、コードは事前に静的に配置済みなので、呼ぶときはダイレクトに呼べますので、変数のようなものを介する必要はないです。
わたなべ
大ベテラン
会議室デビュー日: 2007/12/09
投稿数: 123
お住まい・勤務地: 札幌
投稿日時: 2008-05-11 23:41
単純にインスタンスを大量に作ると作った数のメソッド領域がメモリに確保されるの?って話を聞きたいようにも思えますね。
そういう話でしたらば、メソッドに関してはstatic/非static関わらずにクラス単位でメモリに展開される為、幾つインスタンスを作ろうが一緒です。
(厳密には色々あるだろうけど、まあ一緒ということで)
各インスタンスから、同じメソッドの領域(参照?)をアクセスしているのか?という話でしたらYESと考えてOKでしょう。
ただし、当然、各メソッドで使用するローカル変数などは呼び出し毎に確保されますけど。

「こう理解している」という書き方ではなく、なにが解らないのか?もしくは何を問題としているのか?(何がしたいのか?)を書くべきかと思います。
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2008-05-12 10:00
こんにちは。

引用:

ヒデサクさんの書き込み (2008-05-11 05:37) より:
参照型変数の様に、methodA を指し示す
アドレスを入れる領域をメモリ上に確保し、
そこにmethodA のアドレスの先頭アドレスを入れて、
 methodA();
とする度にその参照を使ってmethodA アクセスする。
と言った感じなのでしょうか。



こういうことが知りたいのでしょうか?↓

Java 仮想マシン仕様より:

7.7 Invoking Methods

引用:

The normal method invocation for a instance method dispatches on the runtime type of the object. (They are virtual, in C++ terms.) Such an invocation is implemented using the invokevirtual instruction, which takes as its argument an index to a runtime constant pool entry giving the fully qualified name of the class type of the object, the name of the method to invoke, and that method's descriptor (§4.3.3).


ヒデサク
会議室デビュー日: 2008/04/30
投稿数: 9
投稿日時: 2008-05-13 00:43
みなさん、お返事ありがとうございます。
質問が下手で申し訳ありません。。。

僕が知りたかった事は、

 class A{
  int a = 10;
  void methodA(){}
 }

とした場合、
変数のaはメモリ上のとある4バイトの場所に格納されると思うのですが、
メソッドのmethodA()はメモリ上にどの用に配置されるのかが知りたかったのでし。

色々調べてみたところ、
『JVMメモリ構造』と言う物に出会いました。
http://www.nextindex.net/java/perform/storage.html

そこで僕の理解した事をまとめてみました。

 class A{
  int a = 10;
  void methodA(){}
 }

上記のようなクラスがあった場合、
まず、A a = new A(); で
クラスの情報をメソッドエリアにロードし、
ロードしたクラス情報からヒープ領域にインスタンスを生成。

そして、a.methodA(); で
Javaスタック内にメソッド( methodA )用のフレームを確保し、
そこにローカル変数の情報やメソッドへの参照などを保管する。
そしてメソッドが呼び出されるとコンピュータ制御がヒープ領域のメソッドに移り、
メソッドを抜けると呼び出し元のコードに制御が戻る。

つまり、メソッドはnewした時点でヒープ領域に配置され、
スタック領域にそのメソッドへの参照が格納される。
参照が切れたらそのメドッドはgcにより破棄される。


と言う具合に理解したのですが、
これは正しい解釈になっていますでしょうか。
とんちんかんな事言ってる様でしたら、
どなたか今一度ご指摘頂けないでしょうか。
宜しくお願いいたします。

[ メッセージ編集済み 編集者: ヒデサク 編集日時 2008-05-13 00:45 ]
otf
ベテラン
会議室デビュー日: 2006/08/04
投稿数: 91
投稿日時: 2008-05-13 07:13
引用:

ヒデサクさんの書き込み (2008-05-13 00:43) より:
つまり、メソッドはnewした時点でヒープ領域に配置され、


どこにそんなことが書いてあったんですか?
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2008-05-13 09:25
大雑把に言うと
・インスタンスはヒープ領域
・クラスはパーマネント領域
に情報が置かれますね。メソッドはクラスの情報としてロードされるはず。

スキルアップ/キャリアアップ(JOB@IT)