- - PR -
メソッドとメモリについて
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-05-11 05:37
いつもお世話になっています。
メソッドとメモリに関して分からない事があり、 質問させてもらいました。 例えば、 int a = 10; とした場合、メモリ上では4バイト分のメモリを確保し、 そこに10と言う値を格納していると思うのですが、 void methodA(){ } の様なメソッドの場合、 メモリ上ではどのような事が行われているのでしょうか。 参照型変数の様に、methodA を指し示す アドレスを入れる領域をメモリ上に確保し、 そこにmethodA のアドレスの先頭アドレスを入れて、 methodA(); とする度にその参照を使ってmethodA アクセスする。 と言った感じなのでしょうか。 | ||||||||
|
投稿日時: 2008-05-11 09:01
methodA等はクラスのバイナリ==メモリ上ではテーブル上の番地データに置き換えられ、methodAが呼ばれているところでは実行がその番地へジャンプし、プロセッサのRETURN命令に出会うまでそのメソッドのコードの実行が続きます。簡単なクラスをjavap -cしてみて、そのあたりを理解してください。
| ||||||||
|
投稿日時: 2008-05-11 10:42
ご質問の意図が良くは分かりませんが、オブジェクト指向言語における、いわゆる 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 それとも、オブジェクト指向言語に関わらず、コンピューター一般のメソッド(というかサブルーチン)呼び出しの話でしょうか。一般に、データーとコード(メソッドなどのプログラム)は分離していて、データーは動的に配置されますが、コードは事前に静的に配置済みなので、呼ぶときはダイレクトに呼べますので、変数のようなものを介する必要はないです。 | ||||||||
|
投稿日時: 2008-05-11 23:41
単純にインスタンスを大量に作ると作った数のメソッド領域がメモリに確保されるの?って話を聞きたいようにも思えますね。
そういう話でしたらば、メソッドに関してはstatic/非static関わらずにクラス単位でメモリに展開される為、幾つインスタンスを作ろうが一緒です。 (厳密には色々あるだろうけど、まあ一緒ということで) 各インスタンスから、同じメソッドの領域(参照?)をアクセスしているのか?という話でしたらYESと考えてOKでしょう。 ただし、当然、各メソッドで使用するローカル変数などは呼び出し毎に確保されますけど。 「こう理解している」という書き方ではなく、なにが解らないのか?もしくは何を問題としているのか?(何がしたいのか?)を書くべきかと思います。 | ||||||||
|
投稿日時: 2008-05-12 10:00
こんにちは。
こういうことが知りたいのでしょうか?↓ Java 仮想マシン仕様より: 7.7 Invoking Methods
| ||||||||
|
投稿日時: 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 ] | ||||||||
|
投稿日時: 2008-05-13 07:13
どこにそんなことが書いてあったんですか? | ||||||||
|
投稿日時: 2008-05-13 09:25
大雑把に言うと
・インスタンスはヒープ領域 ・クラスはパーマネント領域 に情報が置かれますね。メソッドはクラスの情報としてロードされるはず。 |