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”区被填满之后,会将所有对象移动到年老代中。

3.老年代

老年代的对象比较稳定,所以老年代GC不会频繁执行。

在进行老年代GC前一般都先进行了一次新生代GC,使得有新生代的对象晋身入老年代,导致空间不够用时才触发。当无法找到足够大的连续空间分配给新创建的较大对象时也会提前触发一次老年代GC进行垃圾回收腾出空间。

老年代GC采用标记—清除算法

  1. 首先扫描一次所有老年代,标记出存活的对象
  2. 然后回收没有标记的对象。

老年代GC的耗时比较长,因为要扫描再回收。老年代GC会产生内存碎片,为了减少内存损耗,我们一般需要进行合并或者标记出来方便下次直接分配。

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

4.永久代

指内存的永久保存区域,主要存放Class和Meta(元数据)的信息

Class在被加载的时候被放入永久区域。它和和存放实例的区域不同,GC不会在主程序运行期对永久区域进行清理。所以这也导致了永久代的区域会随着加载的Class的增多而胀满,最终抛出OOM异常。

在Java8中,永久代已经被移除,被一个称为“元数据区”(元空间)的区域所取代。

元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。因此,默认情况下,元空间的大小仅受本地内存限制。类的元数据放入 native memory, 字符串池和类的静态变量放入java堆中. 这样可以加载多少类的元数据就不再由MaxPermSize控制, 而由系统的实际可用空间来控制。

  • Major GC和Full GC区别
  • Full GC:收集young gen、old gen、perm gen
  • Major GC:有时又叫old gc,只收集old gen

  Minor GC触发机制:
  当年轻代满时就会触发Minor GC,这里的年轻代满指的是Eden代满,Survivor满不会引发GC。通过复制算法 ,回收垃圾。复制算法不会产生内存碎片。

  复制算法————————

        复制算法将内存划分为两个区间,在任意时间点,所有动态分配的对象都只能分配在其中一个区间(称为活动区间),而另外一个区间(称为空闲区间)则是空闲的

    当有效内存空间耗尽时,JVM将暂停程序运行,开启复制算法GC线程。接下来GC线程会将活动区间内的存活对象,全部复制到空闲区间,且严格按照内存地址依次排列,与此同时,GC线程将更新存活对象的内存引用地址指向新的内存地址

    此时,空闲区间已经与活动区间交换,而垃圾对象现在已经全部留在了原来的活动区间,也就是现在的空闲区间。事实上,在活动区间转换为空间区间的同时,垃圾对象已经被一次性全部回收。

5.一个对象的这一辈子

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

Java中的新生代、老年代和永久代相关推荐

  1. java 堆中的永久代_JVM中的堆的新生代、老年代、永久代详解

    JVM中的堆一般分为三大部分:新生代.老年代.永久代,其大致的占比如下: 一.新生代 新生代主要用来存放新生的对象.一般占据堆空间的1/3.在新生代中,保存着大量的刚刚创建的对象,但是大部分的对象都是 ...

  2. java年轻代minor gc_jvm之年轻代(新生代)、老年代、永久代以及GC原理详解、GC优化...

    关于JVM,也许你听过这些术语:年轻代(新生代).老年代.永久代.minor gc(young gc).major gc.full gc 不要急,先上图,这是jvm 堆内存结构图 仔细的你发现了 图中 ...

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

    关于JVM,也许你听过这些术语:年轻代(新生代).老年代.永久代.minor gc(young gc).major gc.full gc 不要急,先上图,这是jvm 堆内存结构图 仔细的你发现了 图中 ...

  4. JVM年轻代,老年代,永久代详解​​​​​​​

    秉承不重复造轮子的原则,查看印象笔记分享连接↓↓↓↓ 传送门:JVM年轻代,老年代,永久代详解 速读摘要 最近被问到了这个问题,解释的不是很清晰,有一些概念略微模糊,在此进行整理和记录,分享给大家.在 ...

  5. JVM年轻代,老年代,永久代详解

    前言 最近被问到了这个问题,解释的不是很清晰,有一些概念略微模糊,在此进行整理和记录,分享给大家.本篇文章主要讲解内存区域的年轻代,老年代和永久代,略微提及一些垃圾回收算法,下面是正文. 堆整体 堆主 ...

  6. JVM专题之分代模型:年轻代、老年代、永久代

    目录 一 什么是GC 分代 二 GC 为什么需要分代 三 GC 如何分代,每一个代具体是怎么工作的 3.1 年轻代 3.1.1 Eden Space 3.1.2 Survivor 3.2 老年代 3. ...

  7. Java当中jvm运行时区域新生代、老年代、永久代和Garbage Collection垃圾回收机制【杭州多测师】【杭州多测师_王sir】...

    1.本地方法栈和程序计数器 ==>偏底层一般不会接触到 2.方法区 ==>对应为永久代 3.虚拟机栈(stack) ==>对应为栈 4.堆(heap) ==>对应里面有新生代+ ...

  8. jvm对象从新生代到老年代_JVM内存管理、JVM垃圾回收机制、新生代、老年代以及永久代...

    内存模型 JVM运行时数据区由程序计数器.堆.虚拟机栈.本地方法栈.方法区部分组成,结构图如下所示. JVM内存结构由程序计数器.堆.栈.本地方法栈.方法区等部分组成,结构图如下所示: 1)程序计数器 ...

  9. jvm的新生代、老年代、永久代关系

    原文地址:https://blog.csdn.net/iechenyb/article/details/79424974 新生代分为三个区域,一个Eden区和两个Survivor区,它们之间的比例为( ...

最新文章

  1. 计算机NLP注意力机制思想和实现原理讲的较清晰
  2. 高斯混合模型--GMM
  3. 关于英文邮件一些tips
  4. 面试官问你如何解决web高并发这样回答就好了
  5. 将jQuery的复选框设置为“已选中”?
  6. 10、Cocos2dx 3.0游戏开发找小三之容器篇:Vector、Map、Value
  7. 倒立摆matlab仿真,PID控制仿真,simulink仿真最简单版本(保姆级),一阶倒立摆,附源码
  8. VB 连接AutoCad 模块代码
  9. educoder 1-1Python 计算思维训练——公式编程
  10. GeoTools入门(八)-- (SLD)样式处理
  11. 西游记不单单讲的是故事(1) ------ 摘自 吴闲云的《煮酒探西游》
  12. 流放者柯南rust_《流放者柯南》评测8.0分 胯下生风的沙盒生存游戏
  13. 在pb中实现声音文件的播放
  14. FLEAPHP框架的数据库操作
  15. debian live-buid
  16. 娱乐蓝屏程序, 禁用键盘鼠标, 指定键可恢复
  17. java 搭建ota服务器_OTA配置服务器
  18. Java Swing--学生信息管理系统
  19. 安卓逆向so篇(一):so文件调用
  20. Windows的此版本即將過期

热门文章

  1. 数据库访问性能优化法则
  2. AOP的XML架构、AOP的@AspectJ
  3. Java中的Comparable和Comparator到底该怎么用看完就全明白了
  4. html getelementbyid 修改图片_如何使用HTML、CSS和JS轻松构建桌面应用程序
  5. UVa - 1617 - Laptop
  6. windows8.1下安装Cygwin并通过apt-cyg安装软件包
  7. Quartz2D之绘制一个简单的机器猫
  8. 聊聊四种Oracle数字取整函数
  9. 疯狂ios讲义之美化iOS应用
  10. (转)B2B2C,从营销的角度,来理解SaaS