java内存区域,java栈,堆,方法区,常量池

聊聊java的内存区域,各个内存区域之间的协同关系

经常有人将java内存区分为堆内存,和栈内存,期初我也是这么粗糙的去划分的,java内存区域的划分实际上远比这来的复杂。

1.java运行时数据区域

  1. 程序计数器
            当前线程所执行字节码的行号指示器,字节码解释器工作时,考改变计数器值来选择下一条需要执行的字节码指令。分支,循环,跳转,异常处理,线程恢复等基础功能都需要依赖计数器进行完成。
            由于java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时间,一个处理器都只会执行一条线程中的指令,因此每条线程都有一个独立的程序计数器,各个线程之间相互不影响,独立储存,称这类内存区域为“线程私有”的内存。
  2. java虚拟机栈(java栈)
            java栈的生命周期与当前线程相同,每个方法执行时都会创建一个栈帧,储存局部变量,操作数栈,动态链接,方法出口信息等。
            java栈中局部变量部分:所需要的空间在编译期间完成分配,即,进入一个方法时,这个方法需要在栈帧中分配的局部变量空间大小是确定的。
  3. 本地方法栈(栈:数据存储结构—先进后出)
            与java虚拟机栈一样,只不过本地方法栈为虚拟机使用到的非Java方法服务,而Java栈为虚拟机使用java方法服务
  4. java堆(通常而言,堆数据存储结构是二叉树,存取不受限)
            Java堆是所有线程共享的内存区域,虚拟机启动时创建。Java堆唯一目的是存放对象,几乎所有的对象实例都是在Java堆分配内存
            java堆细分,又可分新生代,老年代。再往下又可分:Eden空间, from survivor空间,to survivor空间
  5. 方法区 (又称:Non-Heap 非堆)
            各个线程共享的内存区域,用于存储已被虚拟机加载的类信息,常量,静态变量,编译器编译后的代码文件数据。
            注:早期HotSpot虚拟机设计团队,使用永久代来实现方法区,在JDK1.7后的版本,已将原来放在永久区的常量池移除。
            方法区也并非进入后就可以永久存在,方法区的回收主要是针对常量池,和类型的卸载。

        运行时的常量池: (方法区的一部分,有的厂商已经提出单独区域)
                用于储存编译期生成的各种字面量,和引用的符号。这部分内容在类加载后进入方法区的运行常量池中存放。

2.java对象构建-内存分配

  1. 对象的创建
    A、首先在常量池中定位检测类符号,检查类是否有被加载,解析或初始化
    B、java堆-虚拟机为新生对象分配内存(两种分配方式:指针碰撞,空闲列表分配方式)
    C、对对象头进行设定,对象的GC分代年龄,对象的哈希码,如何寻找对象元数据等
    以下为个人理解在这里插入图片描述

  2. 对象内存布局
            对象头:
                     一部分储存对象运行时的数据,如哈希码,GC分代年龄,锁状态标志,线程持有锁,偏向时间戳等。
                     另一部分是类型指针,指向它的类元数据,虚拟机通过指针确定是哪个类的实例(虚拟机寻找方式之一)
            实例数据:程序代码所定义的各种类型字段内容
            对其填充内容:占位符的作用

  3. 对象访问定位
    Java程序需要通过栈上的reference数据操作堆上的具体对象,由于reference类型在Java虚拟机规范中只规定了一个指向对象的引用,并没有定义这个引用该用何种方式去定位,访问堆中的具体位置,所以访问方式取决于虚拟机实现而定,目前主流访问方式为句柄访问和直接指针两种。

    1、通过句柄访问
    在这里插入图片描述
    2、指针直接访问
    在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值