java堆的内存模型介绍(java,编程语言)

时间:2024-05-07 23:12:52 作者 : 石家庄SEO 分类 : 编程语言
  • TAG :

    java%E5%A0%86%E7%9A%84%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8B%E4%BB%8B%E7%BB%8D

  根据对象存活的特点以及使垃圾回收产生算法产生最大的收益,将堆区分为两大块,一个是Old区,一个是Young区。Young区分为两大块,一个是Survivor区(S0+S1),一块是Eden区。S0和S1一样大,也可以叫From和To。

  一般情况下,新创建的对象都会被分配到Eden区,一些特殊的大的对象会直接分配到Old区。

  比如有对象A,B,C等创建在Eden区,但是Eden区的内存空间肯定有限,比如有100M,假如已经使用了

  100M或者达到一个设定的临界值,这时候就需要对Eden内存空间进行清理,即垃圾收集(GarbageCollect),

  这样的GC我们称之为MinorGC,MinorGC指得是Young区的GC。经过GC之后,有些对象就会被清理掉,有些对象可能还存活着,对于存活着的对象需要将其复制到Survivor区,然后再清空Eden区中的这些对象。

  下面根据垃圾收集算法

  详细讲解下为什么要分为surivor0和surivor1,难道一个survivor区不行吗?

  假设只有一个s0区,eden区回收之后,一部分对象存放到了s0区,此时eden区空间全部释放,内存都是连续的。但是因为s0区也会进行垃圾回收,它有一部分存活的对象进入到了Old区,还有一部分对象存活留下来,这时候s0区就产生了内存碎片,为了使s0区的内存空间相对连续,再分配一个s1区,大小和s0一样,每次垃圾回收的时候,将eden区和s0区存活的对象移动到s1区,这样永远都能保证s0或者s1的内存空间是连续的。当然,这样的情况下会使得s0或者s1区有一个空间永远为空,浪费10%的内存空间,当然为了最大化的利用young区,这样的浪费是被接受的。所以,young区一次GC流程是这样的:在同一个时间点上,S0和S1只能有一个区有数据,另外一个是空的。假设s0区有数据,此时进行一次GC操作,s0区中对象的年龄就会+1,而Eden区中所有存活的对象会被复制到是s1区,s0区中还能存活的对象会有两个去处。若对象年龄达到之前设置好的年龄阈值,此时对象会被移动到Old区,Eden区和s0区没有达到阈值的对象会被复制到s1区,s0区将又会变为空的。

本文:java堆的内存模型介绍的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:C#中的接口有什么用下一篇:

7 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18