JVM内存模型

图片引用他人,如有侵权,告知即删。

运行时内存

1.程序计数器:

1.线程私有。
2.在jvm文档中没有定义OOM。
3.用户代码推进器,不作用于native源码。
4.用来分支,循环,跳转,异常处理等代码流程结构。

2.虚拟机栈(方法栈)

1.线程私有。
2.StackOverFlowError&&OutOfMemoryError。
3.一个方法就是一个栈帧,栈帧的出入栈表示方法的执行。
4.栈帧上包含局部变量表,动态链接,操作数栈,方法出口信息。
5.逃逸分析的介入,对象也可能分配到栈帧上,跟随方法的生命周期。
6.只作用于用户代码(程序员写的代码)
7.操作数栈使用来传递变量,计算表达式等

3.本地虚拟机栈(本地方法栈)

1.线程私有。
2.StackOverFlowError&&OutOfMemoryError。
3.只作用于native代码。
4.其他类似
5.Sun hot spot合二为一。

4.堆:

1.线程共享
2. OutOfMemoryError。
3.分配对象的位置。
4.垃圾回收的主要区域。
5.物理不连续,逻辑连续即可。
###5.方法区:
1.线程共享
2. OutOfMemoryError。
3.存放类信息,常量池,静态变量,即时编译的代码。
4.垃圾回收效率最低的地方。
5.物理不连续,逻辑连续即可。
6.常量池(方法区的一部分)
1>.存放字面量和符合引用
2>.动态改变的,比如String.intern.

6.对象的访问方式:

1.句柄
将java堆划分为句柄池和对象数据池,句柄池中句柄由对象数据的指针和对象类型数据的指针组成。

2.直接指针
没有对象数据池,引用就是对象数据的指针,对象类型数据的指针仍然存在,并指向方法区。

3.why?
句柄的方式当垃圾回收不需要进行对象的移动时,只需要修改句柄的指针既好,但是句柄方式也增加了转换的开销,直接指针就没有这样的开销。

image

image
如果这个对象类型还需要保留,比如重新new一个对象赋值给已经存在的对象引用,然后如果是直接指针的方式就需要去移动上图中的对象实例数据。而句柄的方式就不需要,只需要改变下指针的指向就ok.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值