java JVM内存结构


在这里插入图片描述

1、heap堆内存

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

2、方法区

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

3、stack栈内存

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

4、程序计数器

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

5、本地方法栈

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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值