java JVM内存结构

jvm内存结构释义

  • 1、heap堆内存
  • 2、方法区
  • 3、stack栈内存
  • 4、程序计数器
  • 5、本地方法栈

java JVM内存结构_第1张图片

1、heap堆内存

heap是java所有线程共享的内存区域,其存放的是基本是java所有的对象实例及数组(当然逃逸分析+标量替换技术会根据场景在线程栈上存放对象信息),对象存储信息主要包含三部分(mark word、实例数据、对齐填充),从垃圾回收角度看,heap堆也是其垃圾回收(gc)的主要内存区域,其堆内存基于分代理论进行划分,主要划分为:新生代(eden、s1、s2区)、老年代(old区)。从对象内存分配的角度看,其有指针碰撞、空闲列表两种方法。
指针碰撞(Bump the Pointer)(虚拟机默认):若堆内存是比较完整,正在使用的内存放在一边,未使用的内存放在一边,使用的内存和未使用的内存中间存放指标标识器,当要加入一个新对象,则指针根据新对象的大小向未使用的内存空间移动指定的距离;
java JVM内存结构_第2张图片
空闲列表(Free List):如果堆内存的使用内存和未使用内存是交叉的,则无法使用指针碰撞方式,虚拟机会维护一个空闲列表,根据新加入对象的大小放入指定的内存空间中,并及时更新空闲列表信息。
java JVM内存结构_第3张图片当然为了解决并发出现了cas(compare and swap)比较与替换方案和TLAB(Thread Local Allocation Buffer)本地线程分配缓冲方案。

2、方法区

方法区也是各个线程共享的内存区域,主要存储加载类的类元信息、常量、静态变量等数据。

3、stack栈内存

栈是线程私有的,每个线程都会划分独立的一块内存,各个线程是隔离的,故此内存也叫线程栈,其生命周期是与线程的生命周期一致的,主要存储局部变量表、操作数栈、动态连接、方法出口等信息。
局部变量表:主要存放数据的基本类型(八大基本数据类型),对象引用(指向对象的地址指针)、returnAddress类型即指向的是指令地址;
操作数栈:用于存放执行变量计算或赋值的中间内存栈,LIFO后入先出规则;
方法出口:其实简单理解为每个方法执行结束,也就是栈帧出栈,返回到方法被调用的位置。
动态连接:其跟静态解析中的内容是类似的,在常量池中有大量的符号引用,这些符号引用在类加载阶段会有一部分转为直接引用,这就是静态解析,动态连接就是在每一次运行期间转为直接引用。

4、程序计数器

程序计数器也是每个线程独有,互相隔离,其占用很小的一块内存空间,可以忽略不计,主要存储的是线程执行的位置,或者叫线程的执行的标识器、指示器,。因为java多线程是通过线程轮流切换、分配处理器执行时间来实现,在任一时刻,一个处理器都只能执行一个线程。故在线程不断切换的过程中,需要准确记录线程的执行位置。在线程异常处理、线程恢复等功能都需要依赖这个程序计数器来完成。

5、本地方法栈

本地方法栈也是每个线程独有,Javahostpot虚拟机是基于c++语言实现的,有很多c++语言实现的方法(Native),故本地方法栈主要为执行这些本地方法服务。

你可能感兴趣的:(jvm)