首相明确一点,年轻代和老年代属于堆;永久代属于在Hotspot虚拟机下对方法区的实现,并不存在于堆中。

在 Java 中,堆被划分成两个不同的区域:新生代 ( Young )、老年代 ( Old)。新生代 ( Young ,垃圾回收器都采用复制算法) 又被划分为三个区域:Eden和两块Survivor(S0、S1)。每次使用Eden和一块Survivor,当回收时将Eden和Survivor中还存活的对象一次性复制到另一块Survivor中,这样划分的目的是为了使 JVM 能够更好的管理堆内存中的对象,包括内存的分配以及回收。

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

 一、新生代

主要是用来存放新生的对象。一般占据堆的1/3空间。由于频繁创建对象,所以新生代会频繁触发MinorGC进行垃圾回收。

新生代又分为 Eden区、ServivorFrom、ServivorTo三个区。

Eden区:Java新对象的出生地(如果新创建的对象占用内存很大,则直接分配到老年代)。当Eden区内存不够的时候就会触发MinorGC,对新生代区进行一次垃圾回收。

ServivorTo:保留了一次MinorGC过程中的幸存者。

ServivorFrom:上一次GC的幸存者,作为这一次GC的被扫描者。

MinorGC的过程:MinorGC采用复制算法。首先,把Eden和ServivorFrom区域中存活的对象复制到ServicorTo区域(如果有对象的年龄以及达到了老年的标准,则赋值到老年代区),同时把这些对象的年龄+1(如果ServicorTo不够位置了就放到老年区);然后,清空Eden和ServicorFrom中的对象;最后,ServicorTo和ServicorFrom互换,原ServicorTo成为下一次GC时的ServicorFrom区。

 二、老年代

主要存放应用程序中生命周期长的内存对象。

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

MajorGC采用标记—清除算法:首先扫描一次所有老年代,标记出存活的对象,然后回收没有标记的对象。MajorGC的耗时比较长,因为要扫描再回收。MajorGC会产生内存碎片,为了减少内存损耗,我们一般需要进行合并或者标记出来方便下次直接分配。

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

三、永久代

指内存的永久保存区域,主要存放Class和Meta(元数据)的信息,Class在被加载的时候被放入永久区域. 它和和存放实例的区域不同,GC不会在主程序运行期对永久区域进行清理,只有在full GC时进行垃圾收集。所以这也导致了永久代的区域会随着加载的Class的增多而胀满,最终抛出OOM异常。

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

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

资料:深入理解Java虚拟机

年轻代,老年代,永久代相关推荐

  1. jvm中的年轻代 老年代 持久代 gc ----------转载

    jvm中的年轻代 老年代 持久代 gc 虚拟机中的共划分为三个代:年轻代(Young Generation).老年代(Old Generation)和持久代(Permanent Generation) ...

  2. GC 年轻代 老年代 持久代

    转载自:http://www.cnblogs.com/yaoyuan23/p/5587548.html 虚拟机中的共划分为三个代:年轻代(Young Generation).老年代(Old Gener ...

  3. java 年轻代算法_java内存模型 年轻代/年老代 持久区,jvm中的年轻代 老年代 持久代 gc...

    虚拟机中的共划分为三个代:年轻代(Young Generation).老年代(Old Generation)和持久代(Permanent Generation).其中持久代主要存放的是Java类的类信 ...

  4. jvm中的年轻代 老年代 持久代 gc

    虚拟机中的共划分为三个代:年轻代(Young Generation).老年代(Old Generation)和持久代(Permanent Generation).其中持久代主要存放的是Java类的类信 ...

  5. java年轻代频繁gc_JVM 年轻代 老年代 持久代 gc

    虚拟机中的共划分为三个代:年轻代(Young Generation).老年代(Old Generation)和持久代(Permanent Generation).其中持久代主要存放的是Java类的类信 ...

  6. JVM的年轻代、年老代(老年代)和永生代(持久代)【Loadrunner性能调优】

    1.为什么会有年轻代 我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能.你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我 ...

  7. JVM笔记-13运行时数据区-堆(OOM、年轻代老年代)

    学习JVM的一点简单笔记,宋红康老师jvm讲的很好,感谢. 尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) OOM 异常是什么? 堆空间溢出,存放数据大于堆空间大小. packa ...

  8. JVM学习笔记之-堆,年轻代与老年代,对象分配过程,Minor GC、Major GC、Full GC,堆内存大小与OOM,堆空间分代,内存分配策略,对象分配内存,小结堆空间,逃逸分析,常用调优工具

    堆的核心概述 概述 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域.Java堆区在JVM 启动的时候即被创建,其空间大小也就确定了.是JVM管理的最大一块内存空间. 堆内存的大小是可 ...

  9. jvm中年轻代,老年代

    jvm中新生代,老年代 一.年轻代 二.老年代 三.永久代 Java中的Heap(堆)是JVM所管理的最大的一块内存空间,主要用于存放各种类的实例对象. 由于Java堆是垃圾收集器管理的主要区域,因此 ...

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

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

最新文章

  1. java 函数式编程_函数式编程杂谈
  2. 概率论中均值、方差、标准差介绍及C++/OpenCV/Eigen的三种实现
  3. linux 将当前时间往后调整2分钟_自动调整linux系统时间和时区与Internet时间同步...
  4. python3 pip3 install 报错 ModuleNotFoundError: No module named ‘_ctypes‘ 解决方法
  5. android 开发时遇到的各种问题1--Android双模(CDMA/GSM)手机短信相关
  6. Leetcode 187. 重复的DNA序列 解题思路及C++实现
  7. BlueMix与商业智能BI(第二部分:Bluemix应用创建)
  8. 互联网晚报 | 3月28日 星期一 | 上海医保局辟谣:新冠患者要自负医疗费用不属实 ;十荟团关停全国所有业务...
  9. Nonebot部署机器人常见问题
  10. 赛尔笔记 | 对比学习简述
  11. 人工智能GIS软件技术体系初探
  12. 小米手机开启Root权限
  13. 安装GNOME3桌面并设置开机启动图形界面
  14. python图片裁剪
  15. python面试题No5
  16. 如何利用MATLAB建立Lotka-Volterra模型及其改进模型
  17. 手势控制鼠标的操作(不指屏幕实现简单触屏)
  18. HTML与CSS详细介绍
  19. 马斯克:需要300T电池
  20. 【论文笔记】A Reinforcement Learning Method for Multi-AGV Scheduling in Manufacturing

热门文章

  1. 2020年中国农业银行校招笔试(北京)
  2. 7.Maven更新版本号
  3. iOS开发之iOS15及以上长按输入框点击文本识别,但识别界面不只是键盘区域,而是全屏的,并且会把键盘顶飞的bug解决
  4. 网络游戏P2P智能更新解决方案
  5. 高数-不定积分-三角函数的不定积分
  6. python求雅可比矩阵_提高自组雅可比矩阵的性能
  7. Android数据库框架-GreenDao入门,阿里P8架构师Android大厂面试题总结
  8. Spring Boot SOAP Webservice 案例
  9. 三个有趣的小故事带你了解C、C++和C#!魔法师的“火球术”
  10. @echo是什么意思?