jvm中的新生代Eden和survivor区

转载 2016年08月30日 15:27:33

聊聊JVM的年轻代

1.为什么会有年轻代

我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能。你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我们要找到哪些对象没用,这样就会对堆的所有区域进行扫描。而我们的很多对象都是朝生夕死的,如果分代的话,我们把新创建的对象放到某一地方,当GC的时候先把这块存“朝生夕死”对象的区域进行回收,这样就会腾出很大的空间出来。

2.年轻代中的GC

    HotSpot JVM把年轻代分为了三部分:1个Eden区和2个Survivor区(分别叫from和to)。默认比例为8:1,为啥默认会是这个比例,接下来我们会聊到。一般情况下,新创建的对象都会被分配到Eden区(一些大对象特殊处理),这些对象经过第一次Minor GC后,如果仍然存活,将会被移到Survivor区。对象在Survivor区中每熬过一次Minor GC,年龄就会增加1岁,当它的年龄增加到一定程度时,就会被移动到年老代中。

因为年轻代中的对象基本都是朝生夕死的(80%以上),所以在年轻代的垃圾回收算法使用的是复制算法,复制算法的基本思想就是将内存分为两块,每次只用其中一块,当这一块内存用完,就将还活着的对象复制到另外一块上面。复制算法不会产生内存碎片。

在GC开始的时候,对象只会存在于Eden区和名为“From”的Survivor区,Survivor区“To”是空的。紧接着进行GC,Eden区中所有存活的对象都会被复制到“To”,而在“From”区中,仍存活的对象会根据他们的年龄值来决定去向。年龄达到一定值(年龄阈值,可以通过-XX:MaxTenuringThreshold来设置)的对象会被移动到年老代中,没有达到阈值的对象会被复制到“To”区域。经过这次GC后,Eden区和From区已经被清空。这个时候,“From”和“To”会交换他们的角色,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。不管怎样,都会保证名为To的Survivor区域是空的。Minor GC会一直重复这样的过程,直到“To”区被填满,“To”区被填满之后,会将所有对象移动到年老代中。

young_gc

3.一个对象的这一辈子

我是一个普通的java对象,我出生在Eden区,在Eden区我还看到和我长的很像的小兄弟,我们在Eden区中玩了挺长时间。有一天Eden区中的人实在是太多了,我就被迫去了Survivor区的“From”区,自从去了Survivor区,我就开始漂了,有时候在Survivor的“From”区,有时候在Survivor的“To”区,居无定所。直到我18岁的时候,爸爸说我成人了,该去社会上闯闯了。于是我就去了年老代那边,年老代里,人很多,并且年龄都挺大的,我在这里也认识了很多人。在年老代里,我生活了20年(每次GC加一岁),然后被回收。

4.有关年轻代的JVM参数

1)-XX:NewSize和-XX:MaxNewSize

用于设置年轻代的大小,建议设为整个堆大小的1/3或者1/4,两个值设为一样大。

2)-XX:SurvivorRatio

用于设置Eden和其中一个Survivor的比值,这个值也比较重要。

3)-XX:+PrintTenuringDistribution

这个参数用于显示每次Minor GC时Survivor区中各个年龄段的对象的大小。

4).-XX:InitialTenuringThreshol和-XX:MaxTenuringThreshold

用于设置晋升到老年代的对象年龄的最小值和最大值,每个对象在坚持过一次Minor GC之后,年龄就加1。


文章出处:http://ifeve.com/jvm-yong-generation/

JVM内存区域详解(Eden Space、Survivor Space、Old Gen、Code Cache和Perm Gen)

JVM区域总体分两类,heap区和非heap区。 heap区又分为: - Eden Space(伊甸园)、 - Survivor Space(幸存者区)、 - Old Gen(老年代)...
  • shiyong1949
  • shiyong1949
  • 2016年09月19日 14:05
  • 9414

JVM学习笔记二 :垃圾收集的过程分析Eden->Survivor->Tenured

内存申请过程 JVM会试图为相关Java对象在Eden中初始化一块内存区域; 当Eden空间足够时,内存申请结束。否则到下一步; JVM试图释放在Eden中所有不活跃的对象(minor ...
  • duj671
  • duj671
  • 2016年03月11日 17:27
  • 2910

JVM GC调优一则--增大Eden Space提高性能

缘起 线上有Tomcat升级到7.0.52版,然后有应用的JVM FullGC变频繁,在高峰期socket连接数,Cpu使用率都暴增。 思路 思路是Tomcat本身的代码应该是没有问题的,有问题的可能...
  • hengyunabc
  • hengyunabc
  • 2014年05月03日 18:29
  • 34104

JVM的新生代内存中,为什么除了Eden区,还要设置两个Survivor区?

在我的上一篇博客中,介绍了JVM堆内存的结构以及在堆中进行的GC机制,链接是浅谈JAVA GC机制与性能优化 那么,在JVM的新生代内存中,为什么除了Eden区,还要设置两个Survivor区? ...
  • u011445156
  • u011445156
  • 2017年06月18日 22:53
  • 432

为什么新生代内存需要有两个Survivor区

堆内存分为新生代和老年代,其中新生代分为Eden和两块Survivor,本文探讨了为什么要设置两块Survivor区...
  • antony9118
  • antony9118
  • 2016年05月16日 15:34
  • 5814

JVM内存区域划分 EDEN SPACE、SURVIVOR SPACE、TENURED GEN

本文转自:点击打开链接 JVM区域总体分两类,heap区和非heap区。heap区又分:Eden Space(伊甸园)、Survivor Space(幸存者区)、Tenured Gen(...
  • zhuyucheng123
  • zhuyucheng123
  • 2016年07月10日 17:30
  • 1530

Java的内存结构(Memory Structure)和垃圾收集(Garbage Collection)图解

JVM 内存包含如下几个部分: Heap Memory 存放Java对象 Non-Heap Memory 存放类加载信息和其它meta-dataOther 存放JVM 自身代码等 在J...
  • autofei
  • autofei
  • 2012年04月13日 02:48
  • 21477

JVM内存区域划分Eden Space、Survivor Space、Tenured Gen,Perm Gen解释

jvm区域总体分两类,heap区和非heap区。heap区又分:Eden Space(伊甸园)、Survivor Space(幸存者区)、Tenured Gen(老年代-养老区)。 非heap区又分:...
  • aoxida
  • aoxida
  • 2015年04月15日 16:43
  • 3024

JVM内存区域划分Eden Space、Survivor Space...解释以及jvm内存回收过程

jvm区域总体分两类,heap区和非heap区。heap区又分:Eden Space(伊甸园)、Survivor Space(幸存者区)、Tenured Gen(老年代-养老区)。 非heap区又分:...
  • qq_35031177
  • qq_35031177
  • 2017年03月20日 15:51
  • 445

Edon 和 survivor 占比配置项 -XX:SurvivorRatio=8

关于Edon区和Survivor区的占比配置,Edon(伊甸园)是对象最开始去的地方,而Survivor作为young gc之后对象去的地方,关于JVM GC这里不再详述,这里重点讲一下JVM参数-X...
  • Viogs
  • Viogs
  • 2016年03月29日 16:21
  • 4878
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:jvm中的新生代Eden和survivor区
举报原因:
原因补充:

(最多只允许输入30个字)