JVM——》内存模型

38 篇文章 3 订阅

线程共享:堆、方法区(非堆)
线程私有:虚拟机栈、本地方法栈、程序计数器

Q:JVM运行时数据区 和 JVM内存模型 有什么关系 ?
A:
JVM运行时数据区是一种规范,重点存储数据的是堆和方法区(非堆)
JVM内存模式是对该规范的实现

在这里插入图片描述

一、JVM内存模型

JVM内存 = 非堆(方法区) + 堆

堆 = Old + Young
堆 = Old + Eden + Survior(S0和S1一样大,也叫From和To)

二、对象创建过程

参考链接:
  JVM——》Java对象创建过程

三、常见问题

1、如何理解Minor/Major/FullGC

MinorGC:新生代
MajorGC:老年代
FullGC:新生代 + 老年代

2、为什么需要Survivor区?只有Eden区不行吗?

1)如果没有Survivor区

Eden区每进行一次MinorGC,存活的对象就会被送到老年代。
这样一来,老年代很快被填满,就会触发MajorGC。
Major GC一般伴随着Minor GC,也可以看做触发了Full GC。
老年代的内存空间远大于新生代,进行一次FullGC消耗的时间比Minor GC长得多。
FullGC消耗的时间很长,会影响大型程序的执行和响应速度。

可能你会说,那就对老年代的空间进行增加或者较少咯。

2)如果增加老年代空间

虽然能降低Full GC的频率,但是更多存活对象才能填满老年代,一旦发生Full GC,执行所需要的时间更长。

3)如果减少老年代空间

虽然Full GC所需时间减少,但是老年代很快被存活对象填满,Full GC的频率增加。

4)总结

所以Survivor区存在的意义,就是减少被送到老年代的对象,进而减少Full GC的发生。
Survivor的预筛选保证,只有经历16次的Minor GC还能在新生代中存活的对象,才会被送到老年代。

3、为什么需要2个Survivor区?

最大的好处就是解决了碎片化。

1)如果只有1个survivor区

刚刚新建的对象在Eden区,一旦Eden区满了,就会触发一次Minor GC,Eden中的存活对象就会被移动到Survivor区。这样继续循环下去,下一次Eden满了的时候 ,问题来了,此时进行Minor GC,Eden和Survivor各有一些存活对象,如果此时把Eden区的存活对象硬放到Survior区,很明显这两部分对象所占有的内存是不连续的,也就导致了内存碎片化。

2)如果有2个Survivor区

一个是空的,一个是非空且无碎片的。

4、新生代中Eden:S1:S2为什么是8:1:1?

5、堆内存中都是线程共享的区域吗?

TLAB:Thread Local Allocation Buffer,TLAB空间通常会比较小

JVM默认为每个线程在Eden上开辟一个buffer区域,用来加速对象的分配

如果对象比较小,会优先在TLAB上分配
如果对象比较大,会在共享区域分配

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值