一、运行时数据区域 Runtime Data Areas
线程私有:线程之间互不影响,彼此独立,生命周期与线程相同。
1. 程序计数器 The pc Register
线程私有
if java方法,value = 正在执行的虚拟机字节码指令的地址
if native方法,value = undefined
2. java虚拟机栈 The Virtual Machine Stacks
线程私有,存储栈帧(Stack Frames), 内存可以不连续,可动态扩展,java方法执行的内存模型
StackOverflowError:一个线程请求的栈深度大于虚拟机所允许的深度
OutOfMemoryError:扩展时无法申请到足够内存,或没有足够内存为新线程初始化虚拟机栈
3. 本地方法栈 Native Method Stacks
和虚拟机栈相似
4. java 堆 Heap
线程共享,存储对象和数组,Garbage Collector管理的主要区域,内存可以不连续,可动态扩展
OutOfMemoryError:the automatic storage management system can't allocate more heap for program apply
5. 方法区 Method Area
线程共享,Permanent Generation永久代,存储已加载的类信息、常量、静态变量、即时编译器编译后的代码,Non-Heap堆的一个逻辑部分,GC回收常量池和类型卸载,内存可以不连续,可动态扩展
OutOfMemoryError:无法满足内存分配需求
6. 运行时常量池 Runtime Constant Pool
方法区的一部分,存储编译期生成的各种字面量和符号引用,动态性
OutOfMemoryError:无法满足内存分配需求
7.直接内存Direct Memory
二、对象访问
Object object = new Object();
代码出现在方法区中
两种对象访问方式:
>使用句柄:reference中存储稳定的句柄地址,在对象被移动时只会改变句柄中的实例数据指针,而reference本身不需要被修改
>使用直接指针:速度更快,节省了一次指针定位的时间开销。