Java是在JVM上運行的,那麼JVM運時是什麼樣子?
對於JVM運行時的數據區的理解用一個圖來顯示很形象,下面的圖顯示JVM運行時的數據區。
每個線程的數據區
從圖中可以看出,每個線程有programcounter register(程序計數器),JVM Stack(JVM棧),和NativeMethod Stack(本地方法棧)。 這三個區域都是基於每一個線程的,當一個線程創建的時候生成。
程序計數器: 每一條JVM線程都有自己的PC寄存器,用來控制線程的執行。
JVM Stack(JVM棧): Stack裏存放的是Frame(幀)(如下圖所示)。
Native Method Stack(本地方法棧): 用來支持native methods (非Java語言method)。
所有的線程共享數據區
所有的線程共享數據區有Heap和Method Area.
Heap(堆)是與我們平時編程最直接打交道的區域。它存放所有的對象和數組。在JVM啓動時劃分生成。常說的Garbage Collector垃圾回收器就是對這個區域工作的。
Method Area(方法區)存儲類的結構信息,包括 run-time constant pool, fieldand method data, 和methodsand constructors代碼。
Runtime Constant Pool(運行時常量池)存放編譯時可知的數值字面量和運行期解析後才能獲得的method或field的引用。
Stack中的包含一些Frame,這些Frame在method調動的時候生成。每一個Frame包括:local variable array, OperandStack, Reference to Constant Pool.
Reference:JVMSpecification – Run-Time Data Areas
Related posts:
2. What can we learn from JavaHelloWorld?
3. What does a Java array look like inmemory?
4. Get variable name by usingFieldDeclaration