java堆的内存模型介绍-创新互联

本篇内容介绍了“java堆的内存模型介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:主机域名网站空间、营销软件、网站建设、巩留网站维护、网站推广。

java堆的内存模型

根据对象存活的特点以及使垃圾回收产生算法产生较大的收益,将堆区分为两大块,一个是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

下面根据垃圾收集算法

详细讲解下为什么要分为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堆的内存模型介绍”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!


文章题目:java堆的内存模型介绍-创新互联
文章转载:http://scyanting.com/article/cssjco.html