java堆的内存模型介绍
导读:本文共1406字符,通常情况下阅读需要5分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: java堆的内存模型 根据对象存活的特点以及使垃圾回收产生算法产生最大的收益,将堆区分为两大块,一个是Old区,一个是Young区。Young区分为两大块,一个是Survivor区(S0+S1),一块是Eden区。S0和S1一样大,也可以叫From和To。对象创建所在区域 一般情况下,新创建的对象都会被分配到Eden区,一些特殊的大的对象会直接分配到Old区... ...
目录
(为您整理了一些要点),点击可以直达。根据对象存活的特点以及使垃圾回收产生算法产生最大的收益,将堆区分为两大块,一个是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堆的内存模型介绍的详细内容,希望对您有所帮助,信息来源于网络。