Java虚拟机的内存模型

Java虚拟机的内存模型

java虚拟机的内存模型

内存区域名称英文名称作用批注可能的异常线程共享与否
程序计数器Program Counter Register当前线程锁执行的字节码的行号指示器对于Java方法,记录的是正在执行的虚拟机字节码指令的地址,对于Natice方法,计数器值为空线程私有,对于每一个线程都具有自己的一个计数器用于在线程切换情况下的恢复
Java虚拟机栈Java Virtual Machine StacksJava方法的执行内存模型每个java方法会对应一个栈帧,存放局部变量表,操作数栈,动态链接,方法出口StackOverflowError:如果申请的栈深度大于虚拟机所允许的深度,OutOfMemoryError:如果动态拓展时无法申请到足够的内存线程私有,与线程生命周期相同
本地方法栈Native Method StacksNative方法执行的内存模型同上同上同上
Java堆Java Heap用于存放对象实例1.数组也是在堆上进行分配的2.Java8中字符串常量池被放入堆中3.分为新生代和老生代OutOfMemoryError:堆中没有内存进行实例分配并且不能在进行动态拓展时所有线程共享
方法区Method Area存储虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码1所谓的永久代2可以不进行垃圾收集的区域,垃圾回收效果一般不好OutOfMemoryError:堆中没有内存进行实例分配并且不能在进行动态拓展时所有线程共享
运行时常量池Runtime Constant Pool方法区的一部分,用于存放编译期生成的各种字面量和符号引用OutOfMemoryError:堆中没有内存进行实例分配并且不能在进行动态拓展时所有线程共享
直接内存Direct Memory不是java虚拟机运行时数据区的一部分,称为堆外内存OutOfMemoryError:各个内存区域总和大于物理内存限制

解决对象分配时并发问题的两种方法

  1. 对分配内存空间的动作进行同步处理,可采用CAS配上失败重试的方式保证更新的原子性
  2. 使用TLAB(Thread Local Allocation Buffer)本地线程分配缓冲来进行分配

HotSpot虚拟机对象中包含的内容

名称英文名称作用包含内容
对象头Header包含有关该对象的属性信息1.MarkWord:自身运行时数据:哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳。2.类型指针:该对象指向其类元数据的指针,用于表示该对象是哪个类的实例。3.如果是数组,则还包含数组的长度
实例数据Instance Data即对象中实际存放的数据对象中的实例数据
对齐填充Padding用于进行2K或者4K对齐的填充部分无实际意义的空白填充
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值