精华内容
下载资源
问答
  • 新生代和老年代

    2021-02-12 12:01:58
    什么是堆:new出来的的对象都会存放在堆当中堆内存分为两个区:(垃圾回收机制)新生代:Eden,s0,s1老年代:刚new出来的对象存放在Eden区域中新生代:刚创建对象,先存放在新生代老年代:如果对象频繁被使用,对象放...

    什么是堆:new出来的的对象都会存放在堆当中

    堆内存分为两个区:(垃圾回收机制)

    新生代:Eden,s0,s1

    老年代:

    刚new出来的对象存放在Eden区域中

    新生代:刚创建对象,先存放在新生代

    老年代:如果对象频繁被使用,对象放入老年代

    s0,s1大小相同:为了来及回收机制的复制算法

    垃圾回收机制需要经常去老年代进行垃圾回收吗?

    垃圾回收机制主要是对新生代进行垃圾回收。

    堆内存参数配置:

    -XX:+PrintGC 每次触发日志的时候打印相关日志

    -XX:+UseSerialGC 串行回收

    -XX:+printGCDetails 打印更详细的GC日志

    -Xms:堆初始值

    -Xmx:堆最大可用值

    -Xmn:新生代堆最大可用值

    -XX:survivorRatio 用于设置新生代Eden空间和from/to空间比例

    配置新生代和老年代的调优参数配置

    -XX:survivorRatio = 2 Eden是from区(s0)或者to区(s1)的两倍

    -XX:NewRatio = 2 设置老年区的内存大小为新生代去的两倍

    总结:在实际应用中,我们可以直接将堆的初始值与堆的最大可用值相等,这样可以减少程序运行时垃圾回收的次数,从而提高效率

    初始值越小,垃圾回收的次数就越多

    堆溢出的解决方案:

    java.lang.OutOfMemoryError:Java heap space 堆内存溢出

    解决办法:

    设置堆内存大小 :

    -Xms1m -Xmx10m -XX:+HeapDumpOnOutOfMemoryError(打印内存溢出错误信息)

    在实际开发中,可以在Tomcat的catalina.sh文件中设置JVM的堆内存大小

    JAVA_OPTS="-Server -Xms800m -Xmx800m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:MaxNewSize=512m"

    栈溢出:产生于无限递归调用,循环遍历是不会的,但是循环方法里面产生递归调用,也会发生栈溢出。

    解决办法:设置线程最大调用深度

    设置 -Xss的大小。例如-Xss5m

    展开全文
  • 在经典分代的设计下,新生对象通常会被分配在新生代中,少数情况下(如对象大小超过一定阈值)也可能会直接分配在老年代新生代Eden区两个survivor区的比例是8:1:1——参数:-XX:Survivor-Ratio=8 2、空间...

    1、如何区分新生代和老生代?划分比例?

    参考书籍:《深入理解Java虚拟机》
    在经典分代的设计下,新生对象通常会被分配在新生代中,少数情况下(如对象大小超过一定阈值)也可能会直接分配在老年代。

    新生代Eden区和两个survivor区的比例是8:1:1——参数:-XX:Survivor-Ratio=8
    在这里插入图片描述

    2、空间分配担保?

    在这里插入图片描述

    3、为什么新生代用复制,老年代用标记清除或者标记整理

    Q1:为什么新生代用标记-复制?
    A1:因为新生代中的对象熬不过第一轮收集,存活的对象较少。

    Q2:为什么老年代用标记-清除/标记-清理?

    1. 标记-复制算法在对象存活率较高时需要进行较多的复制操作,效率会降低。
    2. 如果不想浪费50%的空间,就需要有额外的空间进行分配担保,以应对被使用的内存中所有对象都存活的极端情况。

    4、CMS(Concurrent Mark Sweep)的过程

    用的是标记-清理算法。
    在这里插入图片描述

    展开全文
  • 关于新生代和老年代

    2020-12-11 14:47:00
    前言 这里主要记录一点对于新生代和老年代的整理了解

    目录

    前言

    一、年轻代

    1.1survivor区解释

    二、老年代

    三、Full GC

    总结

    感谢 



    前言

    这里主要记录一点对于新生代和老年代的整理了解;


    一、年轻代

    也叫新生代,顾名思义,主要是用来存放新生的对象。新生代又细分为 Eden区、SurvivorFrom区、SurvivorTo区

    如果新生对象在Eden区无法分配空间时,此时发生Minor GC。发生MinorGC,对象会从Eden区进入Survivor区,如果Survivor区放不下从Eden区过来的对象时,此时会使用分配担保机制将对象直接移动到老年代。

    在Minor GC开始的时候,对象只会存在于Eden区和Survivor from区,Survivor to区是空的。

    Minor GC操作后,Eden区如果仍然存活(判断的标准是被引用了,通过GC root进行可达性判断)的对象,将会被移到Survivor To区。而From区中,对象在Survivor区中每熬过一次Minor GC,年龄就会+1岁,当年龄达到一定值(年龄阈值,默认是15,可以通过-XX:MaxTenuringThreshold来设置)的对象会被移动到年老代中,否则对象会被复制到“To”区。经过这次MinorGC后,Eden区和From区已经被清空,所有对象都在to区连续存储

    “From”区和“To”区互换角色,原Survivor To成为下一次GC时的Survivor From区, 总之,GC后,都会保证Survivor To区是空的。

    奇怪为什么有 From和To,2块区域?这就要说到新生代Minor GC的算法了:复制算法,把内存区域分为两块,每次使用一块,GC的时候把一块中的内容移动到另一块中,原始内存中的对象就可以被回收了,优点是避免内存碎片

    1.1survivor区解释

    具体详见:survivor区解释


    二、老年代

    随着Minor GC的持续进行,老年代中对象也会持续增长,导致老年代的空间也会不够用,最终会执行Major GC(MajorGC 的速度比 Minor GC 慢很多很多,据说10倍左右)。Major GC使用的算法是:标记清除(回收)算法或者标记压缩算法

    标记清除(回收):

    1. 首先会从GC root进行遍历,把可达对象(存过的对象)打标记;

    2. 再从GC root二次遍历,将没有被打上标记的对象清除掉。

            优点:老年代对象一般是比较稳定的,相比复制算法,不需要复制大量对象。之所以将所有对象扫描2次,看似比较消耗时间,其实不然,是节省了时间。举个栗子,数组 1,2,3,4,5,6。删除2,3,4,如果每次删除一个数字,那么5,6要移动3次,如果删除1次,那么5,6只需移动1次。

            缺点:这种方式需要中断其他线程(STW),相比复制算法,可能产生内存碎片。

    标记压缩:和标记清除算法基本相同,不同的就是,在清除完成之后,会把存活的对象向内存的一边进行压缩,这样就可以解决内存碎片问题。 

    当老年代也满了装不下的时候,就会抛出OOM(Out of Memory)异常。

    三、Full GC

    Major GC和Full GC是不一样的,前者只清理老年代,后者会清理年轻代+老年代什么时候触发:

    1. 调用System.gc

    2. 方法区空间不足

    3.老年代空间不足,包括:

    • 新创建的对象都会被分配到Eden区,如果该对象占用内存非常大,则直接分配到老年代区,此时老年代空间不足;
    • 做Minor GC操作前,发现要TO区中移动的对象需要的空间(Eden区、From区向To区复制时,To区的内存空间不足或者年龄到达阈值)比老年代剩余空间要大,则触发Full GC,而不是Minor GC;
    • 等等。

    GC优化的本质,也是为什么分代的原因:减少GC次数和GC时间,避免全区扫描。



    总结

    今天总结整理理解了一下关于新生代和老年代的一点知识,希望之后学习会越来越好。


    感谢 

    jvm之年轻代(新生代)、老年代、永久代以及GC原理详解

    展开全文
  • 转自:...在 Java 中,堆被划分成两个不同的区域:新生代 ( Young )、老年代 ( Old )。新生代 ( Young ) 又被划分为三个区域:Eden、From Survivor、To...

    转自:https://blog.csdn.net/henry956595421/article/details/77488260

    Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象。

    在 Java 中,堆被划分成两个不同的区域:新生代 ( Young )、老年代 ( Old )。新生代 ( Young ) 又被划分为三个区域:Eden、From Survivor、To Survivor。

    这样划分的目的是为了使 JVM 能够更好的管理堆内存中的对象,包括内存的分配以及回收。

    堆的内存模型大致为:

    208b2d668e5533b0dabbea80e348a891.png

    从图中可以看出: 堆大小 = 新生代 + 老年代。其中,堆的大小可以通过参数 –Xms、-Xmx 来指定。

    (本人使用的是 JDK1.6,以下涉及的 JVM 默认值均以该版本为准。)

    默认的,新生代 ( Young ) 与老年代 ( Old ) 的比例的值为 1:2 ( 该值可以通过参数 –XX:NewRatio 来指定 ),即:新生代 ( Young ) = 1/3 的堆空间大小。老年代 ( Old ) = 2/3 的堆空间大小。其中,新生代 ( Young ) 被细分为 Eden 和 两个 Survivor 区域,这两个 Survivor 区域分别被命名为 from 和 to,以示区分。

    默认的,Edem : from : to = 8 : 1 : 1 ( 可以通过参数 –XX:SurvivorRatio 来设定 ),即: Eden = 8/10 的新生代空间大小,from = to = 1/10 的新生代空间大小。

    JVM 每次只会使用 Eden 和其中的一块 Survivor 区域来为对象服务,所以无论什么时候,总是有一块 Survivor 区域是空闲着的。

    因此,新生代实际可用的内存空间为 9/10 ( 即90% )的新生代空间。

    GC 堆

    Java 中的堆也是 GC 收集垃圾的主要区域。GC 分为两种:Minor GC、Full GC ( 或称为 Major GC )。

    Minor GC 是发生在新生代中的垃圾收集动作,所采用的是复制算法。

    新生代几乎是所有 Java 对象出生的地方,即 Java 对象申请的内存以及存放都是在这个地方。Java 中的大部分对象通常不需长久存活,具有朝生夕灭的性质。

    当一个对象被判定为 "死亡" 的时候,GC 就有责任来回收掉这部分对象的内存空间。新生代是 GC 收集垃圾的频繁区域。

    当对象在 Eden ( 包括一个 Survivor 区域,这里假设是 from 区域 ) 出生后,在经过一次 Minor GC 后,如果对象还存活,并且能够被另外一块 Survivor 区域所容纳( 上面已经假设为 from 区域,这里应为 to 区域,即 to 区域有足够的内存空间来存储 Eden 和 from 区域中存活的对象 ),则使用复制算法将这些仍然还存活的对象复制到另外一块 Survivor 区域 ( 即 to 区域 ) 中,然后清理所使用过的 Eden 以及 Survivor 区域 ( 即 from 区域 ),并且将这些对象的年龄设置为1,以后对象在 Survivor 区每熬过一次 Minor GC,就将对象的年龄 + 1,当对象的年龄达到某个值时 ( 默认是 15 岁,可以通过参数 -XX:MaxTenuringThreshold 来设定 ),这些对象就会成为老年代。

    但这也不是一定的,对于一些较大的对象 ( 即需要分配一块较大的连续内存空间 ) 则是直接进入到老年代。

    Full GC 是发生在老年代的垃圾收集动作,所采用的是标记-清除算法。

    现实的生活中,老年代的人通常会比新生代的人 "早死"。堆内存中的老年代(Old)不同于这个,老年代里面的对象几乎个个都是在 Survivor 区域中熬过来的,它们是不会那么容易就 "死掉" 了的。因此,Full GC 发生的次数不会有 Minor GC 那么频繁,并且做一次 Full GC 要比进行一次 Minor GC 的时间更长。

    另外,标记-清除算法收集垃圾的时候会产生许多的内存碎片 ( 即不连续的内存空间 ),此后需要为较大的对象分配内存空间时,若无法找到足够的连续的内存空间,就会提前触发一次 GC 的收集动作。

    展开全文
  • JVM中的新生代和老年代

    千次阅读 2019-04-13 20:14:06
    用于设置晋升到老年代的对象年龄的最小值最大值,每个对象在坚持过一次Minor GC之后,年龄就加1。 2)年老代(Tenured Gen): 年老代主要存放JVM认为生命周期比较长的对象(经过几次的Young Gen的垃圾回收后...
  • 一、为什么要分为新生代和老年代? 二、为什么要有Survivor区? 三、JVM 各区的结构图。
  • java新生代和老年代

    千次阅读 2019-03-31 23:14:04
    堆被划分成两个不同的区域:新生代 ( Young )、老年代 ( Old )。新生代 ( Young ) 又被划分为三个区域:Eden、From Survivor、To Survivor。 这样划分的目的是为了使 JVM 能够更好的管理堆内存中的对象,包括内存的...
  • 现有的主流JVM分别是HotSpotJRockit,主要研究对象也是这两个。这篇文章里,我们只研究HotSpot,也就是所谓的Sun JVM。目前阶段,Sun的GC方式主要有CMSG1两种。考虑到效果实际应用,这里只介绍CMS。CMS,全称...
  • G1还有新生代和老年代么?

    千次阅读 2020-10-15 19:40:56
    G1依旧存在着老年代和新生代,只不过相比起CMS等垃圾回收器将新生代和老年代区域划分的那么明显, 在G1中,老年代和新生代逐渐变成逻辑上的概念了。首先G1将整个堆内存划分成一个个Region,可以先将这个Region想像成...
  • Java 堆从 GC 的角度还可以细分为: 新生代(Eden 区、 From Survivor 区 To Survivor 区)老年 代。 1. 新生代 是用来存放新生的对象。一般占据堆的 1/3 空间。由于频繁创建对象,所以新生代会频繁触发 MinorGC ...
  • HotSpot为什么要分为新生代和老年代? 因为有的对象寿命长,有的对象寿命短。应该将寿命长的对象放在一个区,寿命短的对象放在一个区。不同的区采用不同的垃圾收集算法。寿命短的区清理频次高一点,寿命长的区清理...
  • 现有的主流JVM分别是HotSpotJRockit,主要研究对象也是这两个。这篇文章里,我们只研究HotSpot,也就是所谓的Sun JVM。目前阶段,Sun的GC方式主要有CMSG1两种。考虑到效果实际应用,这里只介绍CMS。CMS,全称...
  • 2020-11-23:HotSpot为什么要把堆空间分为新生代和老年代? 前言HotSpot为什么要把堆空间分为新生代和老年代? 前言 每日一题专栏 HotSpot为什么要把堆空间分为新生代和老年代? 将java堆分为新生代和老年代,这样...
  • java中新生代和老年代

    千次阅读 2018-06-25 21:26:49
    其中的Young Generation(年轻代),又分为Eden、FromTo,其中FromTo又统称为Survivor Spaces(幸存区)。  正常情况下,一个对象从创建到销毁,应该是从Eden,然后到Survivor Spaces(幸存区),再到Old ...
  • 堆的新生代和老年代的理解

    千次阅读 2019-02-25 09:33:55
    堆被划分为新生代和老年代新生代又分为eden区和s0、s1区。 新创建的对象存放在eden区,当eden区满时,执行gc,将eden中的存活对象存放到s0区中。当eden区再一次满时,执行gc,同时执行复制算法,将eden区和s0区...
  • java新生代和老年代的垃圾回收规则

    千次阅读 2019-05-05 19:45:07
    java新生代分为两部分:Eden区两个Survivor区,它们的比例是8:1:1,两个Survivor区又分为 fromSurvivor区to Survivor区,其中新生代每次进行Minor GC(新生代的GC)之前,to Survivor区一定是空的。 每当新创建...
  • jvm中新生代和老年代的理解

    千次阅读 2017-12-11 14:30:19
    堆用于存储对象实例及数组值,可以认为Java中所有通过new...1. 新生代(New Generation)大多数情况下Java程序中新建的对象都从新生代分配内存,新生代由Eden Space两块相同大小的Survivor Space(通常又称为S0S
  • 在 Java 中,堆被划分成两个不同的区域:新生代 ( Young )、老年代 ( Old )。新生代 ( Young ) 又被划分为三个区域:Eden、From Survivor、To Survivor。 这样划分的目的是为了使 JVM 能够更好的管理堆内存中的对象...
  • 新生代和老年代的区别

    千次阅读 2015-11-23 17:19:47
    新生代和老年代的区分**所谓的新生代和老年代是针对于分代收集算法来定义的,新生代又分为Eden和Survivor两个区。加上老年代就这三个区。数据会首先分配到Eden区 当中(当然也有特殊情况,如果是大对象那么会直接放...
  • java堆空间的新生代和老年代

    千次阅读 2015-05-12 13:50:01
    在 Java 中,堆被划分成两个不同的区域:新生代 ( Young )、老年代 ( Old )。新生代 ( Young ) 又被划分为三个区域:Eden、From Survivor、To Survivor。 这样划分的目的是为了使 JVM 能够更好的管理堆内存中的对象...
  • 在了解垃圾收集器之前,本篇文章先来简单的说一下新生代和老年代、并行和并发的概念。 新生代和老年代 从内存回收的角度来看,一般我们可以将Java堆分为:新生代和老年代新生代再细分可以分为 Eden空间、...
  • ![图片说明](https://img-ask.csdn.net/upload/201706/22/1498113926_13383.png) 如上图 上面的GC fullgc代表什么含义 我看有种说法是gc代表新生代,fullgc代表所有代的gc 不知道对不对
  • Java中的新生代老年代和永久代

    千次阅读 2020-07-21 14:59:00
    在进行老年代GC前一般都先进行了一次新生代GC,使得有新生代的对象晋身入老年代,导致空间不够用时才触发。当无法找到足够大的连续空间分配给新创建的较大对象时也会提前触发一次老年代GC进行垃圾回收腾出空间。 ...
  • jvm的新生代老年代、永久代关系

    万次阅读 多人点赞 2018-07-08 13:43:44
    原文地址:...通常情况下,对象主要分配在新生代的Eden区上,少数情况下也可能会直接分配在老年代中。Java虚拟机每次使用新生代中的Eden其中一块Survivor(From)...
  • 从内存回收角度看,由于现在收集器基本都采用分代收集算法,所以Java堆中还可以细分为:新生代和老年代。再细致一点儿就是Eden空间、From Survivor空间以及To Survivor空间等。 注意:堆=新生代+老年代,不包括永久...
  • JVM老年代和新生代的比例

    千次阅读 2021-02-26 09:36:27
    在 Java 中,堆被划分成两个不同的区域:新生代 ( Young )、老年代 ( Old )。新生代 ( Young ) 又被划分为三个区域:Eden、From Survivor、To Survivor。这样划分的目的是为了使 JVM 能够更好的管理堆内存中的对象,...
  • 在测试服务器上发现 ES 进程总是挂掉,于是看 ES...可以看到经过一段时间的观察,新生代的 YoungGC 并没有发生,一直是 18 次没改变,而 FullGC 在新生代内存用完时就会出现一次,非常的频繁。 原因很明显,年老代的内

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 58,252
精华内容 23,300
关键字:

新生代和老年代

友情链接: zj.rar