参考官网链接
https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.5
从官网可以看到,运行时数据分为6个部分
2.5.1. The pc Register 计数器
2.5.2. Java Virtual Machine Stacks Java虚拟机栈
2.5.3. Heap 堆
2.5.4. Method Area 方法区
2.5.5. Run-Time Constant Pool 运行时常量池
2.5.6. Native Method Stacks 本地方法栈
先看方法区
Method Area
The Java Virtual Machine has a method area that is shared among all Java Virtual Machine threads. The method area is analogous to the storage area for compiled code of a conventional language or analogous to the "text" segment in an operating system process. It stores per-class structures such as the run-time constant pool, field and method data, and the code for methods and constructors, including the special methods (§2.9) used in class and instance initialization and interface initialization.
The method area is created on virtual machine start-up. Although the method area is logically part of the heap, simple implementations may choose not to either garbage collect or compact it. This specification does not mandate the location of the method area or the policies used to manage compiled code. The method area may be of a fixed size or may be expanded as required by the computation and may be contracted if a larger method area becomes unnecessary. The memory for the method area does not need to be contiguous.
A Java Virtual Machine implementation may provide the programmer or the user control over the initial size of the method area, as well as, in the case of a varying-size method area, control over the maximum and minimum method area size.
The following exceptional condition is associated with the method area:
- If memory in the method area cannot be made available to satisfy an allocation request, the Java Virtual Machine throws an
OutOfMemoryError
.
方法区是所有虚拟机线程共享的区域,存储了类结构、运行常量、属性和方法数据。在虚拟机创建时开始。. Although the method area is logically part of the heap。逻辑上属于堆。当可用空间不足时会抛出OutOfMemoryError。
Heap
The Java Virtual Machine has a heap that is shared among all Java Virtual Machine threads. The heap is the run-time data area from which memory for all class instances and arrays is allocated.
The heap is created on virtual machine start-up. Heap storage for objects is reclaimed by an automatic storage management system (known as a garbage collector); objects are never explicitly deallocated. The Java Virtual Machine assumes no particular type of automatic storage management system, and the storage management technique may be chosen according to the implementor's system requirements. The heap may be of a fixed size or may be expanded as required by the computation and may be contracted if a larger heap becomes unnecessary. The memory for the heap does not need to be contiguous.
A Java Virtual Machine implementation may provide the programmer or the user control over the initial size of the heap, as well as, if the heap can be dynamically expanded or contracted, control over the maximum and minimum heap size.
The following exceptional condition is associated with the heap:
- If a computation requires more heap than can be made available by the automatic storage management system, the Java Virtual Machine throws an
OutOfMemoryError
.
堆区域在虚拟机启动的时候创建,存放类的实例和数组。内存自动分配管理。堆的大小可以改变。堆内存可以不是连续的.
当程序需要的内存超过虚拟机可以提供的大小,会抛出oom错误
Java Virtual Machine Stacks
Each Java Virtual Machine thread has a private Java Virtual Machine stack, created at the same time as the thread. A Java Virtual Machine stack stores frames (§2.6). A Java Virtual Machine stack is analogous to the stack of a conventional language such as C: it holds local variables and partial results, and plays a part in method invocation and return. Because the Java Virtual Machine stack is never manipulated directly except to push and pop frames, frames may be heap allocated. The memory for a Java Virtual Machine stack does not need to be contiguous.
In the First Edition of The Java® Virtual Machine Specification, the Java Virtual Machine stack was known as the Java stack.
This specification permits Java Virtual Machine stacks either to be of a fixed size or to dynamically expand and contract as required by the computation. If the Java Virtual Machine stacks are of a fixed size, the size of each Java Virtual Machine stack may be chosen independently when that stack is created.
A Java Virtual Machine implementation may provide the programmer or the user control over the initial size of Java Virtual Machine stacks, as well as, in the case of dynamically expanding or contracting Java Virtual Machine stacks, control over the maximum and minimum sizes.
The following exceptional conditions are associated with Java Virtual Machine stacks:
If the computation in a thread requires a larger Java Virtual Machine stack than is permitted, the Java Virtual Machine throws a
StackOverflowError
.If Java Virtual Machine stacks can be dynamically expanded, and expansion is attempted but insufficient memory can be made available to effect the expansion, or if insufficient memory can be made available to create the initial Java Virtual Machine stack for a new thread, the Java Virtual Machine throws an
OutOfMemoryError
.
每个虚拟机线程拥有自己私有的虚拟机栈,和线程同时创建。虚拟机栈存储栈桢。虚拟机栈不直接操作,只是压入和推出栈桢。栈桢可能被堆分配。虚拟机栈的内存空间可以不是连续的。
如果应用程序要求的空间超过虚拟机栈提供的,会抛出StackOverflowError
如果在创建虚拟机栈的时候内存空间不足,会抛出OOM error
The pc
Register
The Java Virtual Machine can support many threads of execution at once (JLS §17). Each Java Virtual Machine thread has its own pc
(program counter) register. At any point, each Java Virtual Machine thread is executing the code of a single method, namely the current method (§2.6) for that thread. If that method is not native
, the pc
register contains the address of the Java Virtual Machine instruction currently being executed. If the method currently being executed by the thread is native
, the value of the Java Virtual Machine's pc
register is undefined. The Java Virtual Machine's pc
register is wide enough to hold a returnAddress
or a native pointer on the specific platform.
程序计数器,线程独有,记录程序指令执行的位置。如果执行的方法不是native的,保存的是正在执行的指令地址。如果是native的,保存的是undefined。
Run-Time Constant Pool
A run-time constant pool is a per-class or per-interface run-time representation of the constant_pool
table in a class
file (§4.4). It contains several kinds of constants, ranging from numeric literals known at compile-time to method and field references that must be resolved at run-time. The run-time constant pool serves a function similar to that of a symbol table for a conventional programming language, although it contains a wider range of data than a typical symbol table.
Each run-time constant pool is allocated from the Java Virtual Machine's method area (§2.5.4). The run-time constant pool for a class or interface is constructed when the class or interface is created (§5.3) by the Java Virtual Machine.
The following exceptional condition is associated with the construction of the run-time constant pool for a class or interface:
- When creating a class or interface, if the construction of the run-time constant pool requires more memory than can be made available in the method area of the Java Virtual Machine, the Java Virtual Machine throws an
OutOfMemoryError
.
See §5 (Loading, Linking, and Initializing) for information about the construction of the run-time constant pool.
运行时常量池是由虚拟机方法区分配的。一个常量池代表一个类或者接口的constant_pool表。在类或者接口创建的时候构建。如果创建的时候内存不足,会抛出oom error。
Native Method Stacks
An implementation of the Java Virtual Machine may use conventional stacks, colloquially called "C stacks," to support native
methods (methods written in a language other than the Java programming language). Native method stacks may also be used by the implementation of an interpreter for the Java Virtual Machine's instruction set in a language such as C. Java Virtual Machine implementations that cannot load native
methods and that do not themselves rely on conventional stacks need not supply native method stacks. If supplied, native method stacks are typically allocated per thread when each thread is created.
This specification permits native method stacks either to be of a fixed size or to dynamically expand and contract as required by the computation. If the native method stacks are of a fixed size, the size of each native method stack may be chosen independently when that stack is created.
A Java Virtual Machine implementation may provide the programmer or the user control over the initial size of the native method stacks, as well as, in the case of varying-size native method stacks, control over the maximum and minimum method stack sizes.
The following exceptional conditions are associated with native method stacks:
If the computation in a thread requires a larger native method stack than is permitted, the Java Virtual Machine throws a
StackOverflowError
.If native method stacks can be dynamically expanded and native method stack expansion is attempted but insufficient memory can be made available, or if insufficient memory can be made available to create the initial native method stack for a new thread, the Java Virtual Machine throws an
OutOfMemoryError
.
本地方法栈是由c语言的栈实现的,运行native方法(用其他语言写的除了java)每个线程独有,会抛出StackOverflow 和oom错误
总结
堆和方法区是所有对象共享的区域
虚拟机栈、本地方法栈、程序计数器是私有的
常量池是由方法区分配的,物理空间上属于方法区的一部分。方法区在逻辑上又属于堆的一部分。
自己的理解:一个类文件加载到虚拟机以后,类结构、常量、属性方法元数据,存储到方法区。new 一个实例以后,在堆中分配内存存放实例。在运行方法时,把方法包装成栈桢压入虚拟机栈依次执行。由于cpu在线程之间切换,所以需要程序计数器记录当前执行到了哪一个指令。