😸

ITスクール DAY16 static

2023/07/31に公開

Static

Javaを勉強しながら、Stack MemoryとHeap Memoryに対しての勉強したことはある。
しかし、static変数、メソッドなどはどこに保存されるか?


https://www.quora.com/How-do-you-see-the-working-of-a-Java-program

そのためには、まずJavaのプログラミング過程を振り返る必要がある。
Javaはコンパイルを通して、bytecodeに変換するコンパイル過程とJVMが変換されたbytecodeをネイティブコードにJITコンパイラを通して通訳し、Runtimeする二回のプロセスがある。

それにより、データーも二回分けて割当たるが、
我々が、注目しているStack MemoryとHeap MemoryはRuntime時の領域で、
Runtimeの際に、リアルタイムでメモリに割当たり、動きも激しいため、
それを動的ローディングだと表現する。

それでは、コンパイル時は、どのようなメモリのどの領域にデーターが割り当たるか。
それは、メソッド領域だ。

プログラムを実行する前に、作成するclass, static methodとstatic fieldはこちらに保存される。一度、事前に保存されるとプログラムの終了まで変更できないところが静的であるため、
staticと表現することもその理由だ。


https://wedul.site/633

我々がプログラムを作成する際に、最初はClass Loaderにより、作成したクラス、コード、staticメンバーが保存され、実行する際にはこちらのデーターを元にStack, Heapメモリにデーターが割当たるのだ。

staticがthisとインスタンスメンバーにアクセスできない理由はこのプロセスと関係がある。
コンパイル時には、インスタンス自体が存在しないため、static memberがinstance memberにアクセスすることはできないのだ。

逆に言えば、new演算子でオブジェクトを生成せずに、publicであれば、自由にstatic memberを使用できるため、活用度が高い。主に、インスタンスが持っている共通的な特性や共有したいフィールド、データーはメモリのため、staticを付ける傾向にある。
instance memberに宣言すれば、オブジェクトを生成するたび、stack memoryとheap memoryに割りたるため、メモリの効率が悪くなる可能性もあるためだ。

一度作成されば、終わりという特性上、メモリ効率が良いところがあるため、定数、汎用データはstaticに宣言される場合が多い。

Math Classは代表的なstatic classだ。

Discussion