Java内存体系

JVM体系结构:

1)(Class Loader)类装载子系统:负责把类从文件系统中装载入内存。

2)(Garbage Collection)垃圾回收子系统:分配内存,自动回收不再被引用对象的内在空间。

3)(Execution Engine)执行引擎子系统:

4)(Runtime Date Area)运行时数据区:

5)(Native Interface)本地接口组件:



 

Java Runtime Date Area:Java 虚拟机定义了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁。另外的一些则是与线程一一对应。与线程对应的数据区会随着线程的开始和结束而创建和销毁。


 

Program Counter Register :Java 虚拟机可以支持多线程同时执行,每一条虚拟机线程都有自己的 PC 寄存器,在任意时候一条 java 虚拟机线程只会执行一个方法的代码,这个正在被线程执行的方法称为该线程的当前方法,如果这个方法不是( native )本地的,那么 PC 寄存器就保存 java 虚拟机正在执行的方法字节码指令的地址,如果这个方法是本地的那 PC 寄存器的值就是 undefiend , pc 寄存器的容量至少应当能保存一个 returnAddress 类型的数据或者一个与平台相关的本地指针的值。


 

Java Virtual Machine Stack:每个 java 虚拟机线程都会自己私有的 java 虚拟机栈( java virtual machine stack )这个栈与线程同时创建,用于存储栈帧( Frames ) .java 虚拟机栈的作用就是用于存储局部变量与一些过程结果的地方。另外它在方法的调用和返回中也扮演了很重要的角色。


 

Heap:Java 虚拟机中堆( heap )是可供各条线程共享的运行时内存区域局,也是供所有类实例和数组对象分配内存的区域。 Java 堆在虚拟机启动时候被创建,它存储了被自动内在管理系统( automatic storage management system )也就是垃圾回收器( garbage collector )所管理的各种对象。这些对象无需也无法显式地被销毁。


Method Area:Java 虚拟机中方法区可供各条线程共享的运行时内在区域。它存储了每一个类的结构信息,例如运行时常量池,字段和方法数据,构造 函数和普通方法的字节码内容,还包括一些在类实例接口初始化时用到的特殊方法。虽然方法区是椎的逻辑组成部分,但是简单的虚拟机实现可以选择在这个区域不 实现垃圾收集。


 

Runtime Constant Pool:运行时候常量池,每个类或者接口的常量池的运行时表示形式,包括若干种不同的常量:从编译期可知的数值字面量到必须运行期解析后才能获得的方法或字段引用。每个常量池都分配在 java 虚拟机的方法区之中,在类和接口被加载到虚拟机后,对应该的运行时常量池被创建出来。


 

Native Method Stack:本地方法栈,用来运行 native 方法的执行,如果 java 虚拟机不支持 native 方法 , 并且自己也不依赖传统栈的话可以不支持本地方法栈。


 

Frame:栈帧,用来存储数据和部分过程结果的数据结构,同时也被用来处理动态链接( Dynamic Linking ),方法返回值和异常分派,栈帧随着方法调用而创建,随着方法结束而销毁(无论方法是正常完成还是异常完成) , 栈帧的存储空间分配在 java 虚拟机栈之中,每一个栈帧都有自己的局部变量表( Local Variables ),操作数栈( Operand stack )和指向当前方法所属的类的运行时常量池的引用。

如果当前方法调用了其他方法,或者当前方法执行结束,那这个方法的栈帧就不再是当前栈帧,当一个新的方法被调用,一个新的栈帧也会随之而创建,并且随着程序控制权移交到新的方法了。


 

Local Variable:局部变量表 ,每个栈帧内部都包含一组称为局部变量表的变量列表,栈帧中局部变量表的长度由编译期决定,并且存储于类和接口的二进制表示之中 。


 

Operand Stack:操作数栈,每一个栈帧内部都包含一个称为操作数栈 的后进先出栈( last in first out ),操作数栈所属的栈帧在刚刚被创建的时候,操作数栈是空的。 Java 虚拟机提供一些字节码指令来从局部变量表或者对象实例的字段中复制常量或者变量值到操作数栈中,也提供了一些指令用于从操作数栈取走数据,操作数据和把操作结果重新入栈。在方法调用的时候,操作数栈也用来准备调用方法的参数以及接收方法返回结果。


 

Dynamic Linking:动态链接,每一个栈帧内部都包含一个指向运行时常量池的引用来支持当前方法的代码实现动态链接 ,在 class 文件中描述一个方法调用了其他方法或者访问其成员变量是通过符号引用( Symbolic Reference )来表示的,动态链接的作用就是将这些符号引用所表示的方法转换为实际方法的直接引用。类加载的过程中将要解析掉尚未被解析的符号引用,并且将变量访问转化为访问这些变量的存储结构所在的运行时内在位置的正确偏移量

 

以下是一个更详细的图:


 

 

以上笔记参考:http://docs.oracle.com/javase/specs/,及java虚拟机规范(java se 7版)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值