Java内存区域

Java内存区域

运行时数据区域

程序计数器

通过改变计数器的值来选取下一条需要执行的指令,分支、循环、跳转、异常处理、线程恢复都需要程序计数器。属于线程私有的内存

Java虚拟机栈

线程私有。生命周期和线程相同。描述的是Java方法执行的内存模型。每个方法在执行的时候都会创建一个帧栈用于存储局部变量表、操作数栈、动态链接和出口信息。其中局部变量表存放基本数据类型和对象的引用。

本地方法栈

和虚拟机栈差不多发挥的作用差不多,主要是为了Naticve 方法服务的。

Java堆

所有线程共享的一块最大的区域。唯一的目的就是存放对象实例。 因为是垃圾收集器主要管理的区域,所以也叫GC堆。优于现在垃圾回收基本上都是分代回收,所以Java堆可以被分为新生代和老年代: 在细致一点可以分为Eden空间、From survivor空间和To survivor空间。

方法区

所有线程共享的区域。存储已经被虚拟机加载的类信息、常量、静态变量和即时编译器编译后的代码数据。

运行时常量池

运行时常量池属于方法区的一部分。保存的是编译期生成的各种字面量和符号引用。

HotSpot虚拟机对象

对象的创建

  • 首先检查,先去常量池中检查这个指令的参数是否能在常量池中定位到类的引用。如果检查到这个符号引用没有被加载、解析或者初始化过。接着执行相应的类加载操作。
  • 类加载通过之后,可以确定类需要多大的内存空间,虚拟机在Java堆中为新生对象划确定的内存大小。划内存有两种方式:
  1. 指针碰撞,内存规整的前提下,指针从当前位置移动一段于对象内存相同大小的位置。

  2. 空闲列表,如果内存不规整,虚拟机需要维护一个列表,记录哪些内存是可用的,就可以分配一个足够大的空间给实例对象。

为了保证虚拟机划分内存操作线程安全。采用CAS配上失败重试方法保证操作原子性。

  • 接下来虚拟