java虚拟机运行时数据区
java虚拟机在执行java程序时会将其管理的内存划分为若干不同的数据区域:
- 程序计数器(Program Counter Register)
- java虚拟机栈(Java Virtual Machine Stacks)
- 本地方法栈(Native Method Stack)
- java堆(Java Heap)
- 方法区(Method Area)
程序计数器
程序计数器,作用类似于当前线程所执行的字节码的行号指示器。每个线程都有一个独立的程序计数器(线程私有)。
java虚拟机栈
每个线程都有一个java虚拟机栈,用于存放栈帧(Stack Frame),每个栈帧是一个java方法调用在内存中的映射,也就是说一个java方法调用对应着java虚拟机栈中的一个栈帧,栈帧存放方法的局部变量表,操作数表,方法出口等信息。
本地方法栈
该栈的作用和java虚拟机栈非常类似,只不过它服务的是Native方法。虚拟机规范对本地方法栈没有强制规定,Sun Hotspot虚拟机将本地方法栈和java虚拟机栈合二为一。
java堆
java堆是所有线程共享的一块内存,也是java虚拟机管理的最大的一块内存。所有的对象和数组都是在堆上分配的。
方法区
方法区也是所有线程共享的一块内存区域。用来存放虚拟机加载的类信息、常量、静态变量、编译器编译后的代码等数据。
运行时常量池
属于方法区。用于存放编译器生成的各种字面量和符号引用。
直接内存
直接内存独立于java虚拟机内存,在NIO库中有用到。
对象的创建过程
- 类的加载,解析和初始化。
- 从java堆上分配一块确定大小的内存。
- 为分配到的内存空间初始化零值。
- 对象进行必要的设置,设置对象头(Object Header)。
- 执行对象的方法,也就是初始化方法。
对象访问定位
两种对象访问定位方式:
1. 句柄访问:java堆中划分独立的空间存放句柄,reference指向句柄。句柄中包含对象实例数据和类型数据各自的地址信息。
2. 直接指针访问:reference指向对象存储的地址,对象中包含指向类型信息的引用。