方法区 | JavaHeap | JavaStack | 程序计数器 | 本地方法区 | |
存储数据 | 用于存储已被虚拟机加载的类信息,常量,静态变量,即使编译器编译后的代码等数据 | 所有的对象实例以及数组都要在堆上分配 | 虚拟机栈描述的是Java方法执行的内存模型 | 当前线程所执行的字节码的行号指示器 | 同JavaStack类似,为虚拟机使用的Native方法服务。 |
生命周期 | Jvm启动时创建 | 同JVM | 1.同线程的创建创建 2.同线程的结束而结束 | 同线程 | 同线程 |
共享 | 所有线程 | 所有线程 | 线程私有 | 线程私有 | 线程私有 |
使用异常 | OutOfMemoryError | OutOfMemoryError | StackOverflowErro OutOfMemoryError | 无 | StackOverflowError OutOfMemoryError |
其他 | 1.可以选择不实现垃圾收集。 2.方法区可以处在物理上不连续的内存空间上,只要逻辑上连续即可。 3.垃圾收集行为在这个区域比较少见。 4.这个区的内存回收目标主要针对常量池的回收,对类型的卸载。 5.RuntimeConstant Pool是方法区的一部分 a.用于存储编译期生成的各种字面量和符号引用。 b.运行时常量池相对于Class文件常量池的另外一个作用是具备动态性。Java语言并不要求常量一定只能在编译期间产生。 c.运行期间也可以将新的常量放入池中。如String类的intern()方法。 | 1.Java堆是垃圾收集器管理的主要区域 2.Java堆还可以细分为新生代,老年代。 3.Java堆可以处在物理上不连续的内存空间上,只要逻辑上连续即可。 | 1.StackFrame:每个方法被执行的时候会同时创建一个StackFrame. 2.StackFrame用来存储局部变量表,操作数栈,动态链接,方法出口等信息。 3.每个方法被调用直至执行完成都对应一个StackFrame从出栈到入栈的过程 4.局部变量表所需要的空间在编译期间完成分配,当进入一个方法,这个方法需要在栈中分配多大的局部变量空间是完全确定的,方法运行期间不会改变局部变量的大小 | 1.正在执行的是native方法,则这个计数器则为空. 2.如果正在执行的是java方法,这个计数器记录的是正在执行的虚拟机虚拟机字节码指令地址。 |
|