JVM_01_内存区域


JVM内存区域

运行时数据区域

线程独占
  1. 程序计数器
  2. 虚拟机栈
  3. 本地方法栈

*虚拟机栈和本地方法栈中都有可能出现StackOverflowError和OutOfMemoryError

线程共享
  1. Java堆(用于存放对象实例和数组,大部分对象都存放于此)
    • 新生代:Eden, From Survivor, To Survivor
    • 老年代
  2. 方法区(JDK1.8后变成元空间,放在本地内存中)
    • 用于储存类信息、常量、静态变量、JIT编译后的代码等数据
  3. 运行时常量池(属于方法区的一部分)
  4. 直接内存(实际上不属于运行时数据区,但是也会被经常使用)

*堆的细分目的是方便内存分配和垃圾回收

对象创建过程
  1. 类加载检查
    • 检查在常量池中是否可以定位到这个类的符号引用,并检查是否已经加载、解析和初始化过。若没有,则先进行类加载
  2. 为对象分配内存
    • 类加载完成后,便可以确定其对象所需的内存大小,由此对象分配内存。
    • 在分配内存时,根据堆内存是否规整采用指针碰撞(Bump the Pointer)或空闲列表(Free List)方法
    • 为了保证内存分配的原子性,可以采用:CAS(Compare And Swap)+失败重试方式/按照线程在不同空间中分配的方式(采用 本地线程分配缓冲 TLAB)
  3. 初始化零值
  4. 设置对象头
    • 对象头中保存对象相关信息:对象属于哪个类、如何找到类的元数据、对象的哈希值、GC分代年龄等
  5. 执行init方法
    • 根据程序编写者的意愿进行初始化
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值