- 程序计数器
- Java虚拟机栈
- 本地方法栈
- 方法区
- 运行时常量池
- 堆
- 直接内存
- 对象的创建流程
- 内存分配机制
记录当前执行字节码行号指示器。字节码解释器工作通过改变计数器的值去读取后续的字节码指令。
在任何一个时刻,一个内核会执行一条指令,为了切换线程后还能继续正确执行,每一个线程都有一个程序计数器
java虚拟机栈为线程私有,每一个线程都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息
虚拟机栈为虚拟机执行字节码服务
为虚拟机执行本地方法服务
方法区用于存放已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。有些虚拟机里叫做永久代
java1.7之后字符串常量池保存在堆中,以及从方法区中移出。
产量池用于存放编译期生成的各种字面量和符号引用,在类加载后这部分被存放于方法区中的常量池中。
堆虚拟机采用分代收集算法回收内存。堆中可以划分为年轻代、老年代。
年轻代中可以有Eden空间、From survivor空间、To survivor空间
直接内存不属于运行时数据区。在java虚拟机调用本地方法时,为了避免在java堆内存和Native堆内存之间来回复制数据。例如需要读取文件时。
对象的创建流程 内存分配机制- 指针碰撞:这种机制适用于内存归整,已使用的内存在一堆,未适用的空闲内存在一堆,有一个指针标记使用内存和空闲内存,分配内存时将指针移动需要分配内存空间大小。
- 空闲列表:如果内存不是归整,则需要维护一个列表,列表存放空闲内存区域和已使用空间,当需要分配内存时,从列表中找到一块合适的内存分配,分配完后更新列表。
具体使用哪种分配算法有垃圾收集器决定。Serial和ParNew等由于带Compact功能,使用的是指针碰撞算法。CMS基于Mark-Sweep算法,采用空闲列表。



