《深入理解java虚拟机》读书笔记一 【java内存区域】

时间:2023-02-15 11:49:35

一、运行时数据区域 Runtime Data Areas

线程私有:线程之间互不影响,彼此独立,生命周期与线程相同。

1. 程序计数器 The pc Register

线程私有

if java方法,value = 正在执行的虚拟机字节码指令的地址

if native方法,value = undefined

2. java虚拟机栈 The Virtual Machine Stacks

线程私有,存储栈帧(Stack Frames), 内存可以不连续,可动态扩展,java方法执行的内存模型

*Error:一个线程请求的栈深度大于虚拟机所允许的深度

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本身不需要被修改 >使用直接指针:速度更快,节省了一次指针定位的时间开销。 《深入理解java虚拟机》读书笔记一 【java内存区域】
《深入理解java虚拟机》读书笔记一 【java内存区域】