OO言語における変数のメモリ領域確保のタイミングと変数の寿命

細かいところは間違っているかもしれないが、おおよそ次のとおり。
静的言語はJava動的言語Rubyを基準に記述しているので
それ以外の言語では若干異なります。


1)クラスがメモリ上にロードされるとき
  静的言語の場合、このタイミングでstatic変数(静的変数orクラス変数)の
  初期化が行われ、メモリ上に領域が確保される。
  動的言語の場合、クラス内かつメソッドの外でクラス変数が記述されている
  場合、このタイミングでメモリ上に領域が確保される。
2)クラスがインスタンス化(実体化)されるとき
  静的言語の場合、このタイミングでインスタンス変数の初期化が行われ、
  メモリ上に領域が確保される。
  動的言語の場合、クラス内かつメソッドの外でインスタンス変数が記述
  されている場合、コンストラクタ内にインスタンス変数が記述されている
  場合、このタイミングでメモリ上に領域が確保される。
3)クラス内のメソッドが呼び出されるとき
  静的言語の場合、メソッド内の変数定義(ローカル変数)が参照される
  タイミング(?)でメモリ上に領域が確保される。
  動的言語の場合、ローカル変数ならメソッド内で最初に参照されるタイミング
  でメモリ上に領域が確保される。それ以外の変数なら最初に参照される
  タイミングでメモリ上に領域が確保される、メソッド内かどうかに関係なく
  インスタンス変数かクラス変数かによってスコープが決まる。
4)最初に変数が参照されるとき
  動的言語の場合、このタイミングで主にメモリ上に領域が確保される、
  その変数がローカル変数かインスタンス変数かクラス変数かによって
  その変数のスコープが決まる。
  静的言語の場合、このタイミングでのメモリ上への領域確保はない、
  変数定義の位置でスコープが決定される。


A)クラス変数
  同一クラスであれば、一度確保されたメモリ領域が常に参照され、
  再度メモリ領域が確保されることはない。
  プログラムが終了する、あるいはクラスがアンロードされるまで、
  確保したメモリ領域は解放されない。
B)インスタンス変数
  同一インスタンス(オブジェクト)であれば、一度確保されたメモリ領域が常に
  参照され、再度メモリ領域が確保されることはない。
  VM系の言語の場合、所属するオブジェクトへの参照がなくなるorNULLを代入
  するor格納していたオブジェクトとは異なるオブジェクトを格納すると格納
  されていたオブジェクトがGCの対象となる。
  VM系以外の静的言語の場合、格納されているオブジェクトのメモリ領域の解放
  は自前で行う必要あり。
C)ローカル変数
  メソッドが呼び出される度にメモリ領域の確保が行われる。
  VM系の言語の場合、メソッドが終了する(変数のメモリ領域が解放される)or
  NULLを代入するor格納していたオブジェクトとは異なるオブジェクトを格納
  すると格納されていたオブジェクトがGCの対象となる。
  VM系以外の静的言語の場合、メソッドが終了すると変数のメモリ領域が解放される
  、変数がポインタやリファレンスなら格納されているオブジェクトのメモリ領域の
  解放は自前で行う必要あり。

何の意味もなく、クラス変数・インスタンス変数・ローカル変数がOO言語に
用意されているわけではない、変数に格納するオブジェクトの用途に応じて
適切に使い分けることが必要。


動的言語のほうが静的言語よりもオブジェクト生成等のメモリ領域の確保を含む処理の
処理速度に与える影響がシビア(大きい)。オブジェクトの生成やメモリ領域の確保を
適切に行うようにクラス設計を行わないと性能が出ない。


機械語(アセンブリ)をダイレクトに生成する言語でも基本的には同じ。
上記のような挙動となるように機械語(アセンブリ)が生成されている。


[蛇足]
外部からアクセスする必要のある変数のみインスタンス変数でそれ以外は
全てローカル変数にしているようなクラスをよくみかける。
そんなクラスの設計者がプログラマーとしてビギナーの域を出ていないことは明らか。
そんな設計で処理速度が速いわけがない。