JVM运行时数据区


区别于JAVA线程模型

  1. 5大区域
    程序计数器、jvm栈,本地方法栈,堆,方法区
    前三个线程私有,后两个线程共享

五大区域

程序计数器

执行的是本地方法的话,值为null,没有规定OOM

JVM栈

里面存储着栈帧,一个方法的执行过程就是一个栈帧的入栈和出栈
有OOM 和StackOverFlow

  • 栈帧
  1. 包括局部变量表
    变量槽为最小单位(4字节)
    long和double占2个槽
    可以存放八种基本类型+reference+returnAddress
    编译期确定大小
    完成方法参数的传递,非静态方法的第0个索引位为this
    变量槽可以重用,如果没有发生覆盖,则影响GC回收
  2. 操作数栈
    用于执行运算
  3. 动态链接
    指向常量池中该方法的引用
  4. 方法返回地址
    完成了异常退出,异常处理是采用本方法的异常表中没有搜到异常处理器就会抛出异常 & 退出

本地方法栈

和JVM栈一样,区别是调用的本地方法

大对象存在物理连续的区域,逻辑上连续,物理上不连续
TLAB,每个线程都会申请,用于快速本地分配堆空间
会OOM

方法区

存储类型信息、常量、静态变量、即时编译器编译之后的代码

实现方式从原来的永久代,变为现在的元空间
JDK7把字符串常量池和静态变量移到堆
JDK8之后采用本地内存实现的元空间存储类型信息,运行时常量池
元空间有自己的垃圾手机机制

内存分配 & 对象头

对象创建过程

  1. 定位类的符号引用
  2. 检查这个符号引用是否被加载、解析、初始化
  3. 分配内存(首先在TLAB中分配,没有了则CAS去堆里分配TLAB)
  4. 全都初始化为0
  5. 构造函数

对象头

三部分Mark Word、Klass、数组长度
Mark Word用来实现sync的锁升级过程
MarkWord

Synchronized锁相关

由于讲到了对象头,顺便看看锁优化

锁优化

  • 锁消除
    利用逃逸分析技术得到变量是否会竞争,如果没有则消除
return s1+s2+s3;

1.5之前会转为StringBuffer的append操作,会出现同步(StringBuffer是线程安全的)
1.5之后会转为StringBuilder的append操作
1.5之前需要锁消除

  • 锁粗化
    和锁消除一样,StringBuffer的每个append操作都会加锁,锁粗化会优化至append的开头和结尾加锁、

  • 自旋锁和适应性自旋锁
    占用CPU时间,就是不进行线程切换,一直在那死循环

锁膨胀

(出自https://blog.csdn.net/xueba8/article/details/88753443
在这里插入图片描述

如果对一个处于偏向锁状态的对象求hash码,会使偏向锁升级为重量锁。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值