仅做学习笔记

JVM中Eden区、Survivor from区和Survivor to区

本文主要根据《深入理解JVM》中内存回收策略,主要关注如下五个方面:

1:Eden区分配

2:大对象直接进入老年代

3:长期存活的对象直接进入老年代

4:动态对象年龄判定

5:空间分配担保

首先明确新生代都是分配于Eden区的,所以Eden区是最重要也是内存回收最重要的管理区域,同时也是最频繁的内存替换区域。我们知道JVM将内存根据分代策略将内存分为三层,新生代所占据的内存、老年代所占据的内存以及永久代,我们这里不关注永久代,因为永久代是属于方法区内存的部分,而新生代和老年代都是属于堆内存区域的。

新生代中又继续分为三个子块,Eden区、Survivor from区、Survivor to区,实际上分为三个区的原因是为了方便采用复制-清除(详情请参考深入理解JVM中内存回收策略)策略而采用的策略,复制策略就是将原来存在的内存分为两个相等的区,使用一块进行新生代的内存分配,当要GC时,则将存活的对象复制进入另一块空闲的内存,然后将使用的内存进行清除,从而又有一个空闲区和一个使用区,并且不会有碎片问题。实际上并不需要两个1:1的分区比例,因为一般存活的对象很少,所以JVM聪明的讲新生代占据的总内存分为Eden:Survivor from:Survivor to = 8:1:1三部分,其中Eden就用来分配新的对象内存,Survivor from则用于GC时的复制,那为什么需要两个Survivor区呢,因为复制后Survivor from区虽然现在很整齐,没有碎片,当下一次进行回收时,Eden区和Survivor from区里都存在需要回收的对象,则Survivor from区也会出现碎片。

那么现在,我们看一下上述的五个部分:所有的新生代首先会在Eden区进行内存分配,当Eden区满时会进行一次Minor GC操作,将Eden区进行回收,此时判断存活的对象会被复制进入Survivor from区(年龄加1),对于大对象直接进入老年代,实际上是为了保证Eden区具有充足的空间可用的一种策略,采用-XX:PretenureSizeThreshold参数可以设置多大的对象可以直接进入老年代内存区域。对于长期存活的对象直接进入老年代,实际上时对Eden区到Survivor区过度的一种策略,是为了保证Eden区到Survivor区不会频繁的进行复制一直存活的对象且对Survivor区也能保证不会具有太多的一直占据的内存,采用-XX:MaxTenuringThreshold=数字 参数可以设置对象在经过多少次GC后会被放入老年代(年龄达到设置值,默认为15)。对于动态对象年龄判断,实际上是对Survivor区的一种策略,是为了保证Survivor区具有充足的空间用于分配,动态对象年龄只判断Survivor区是否存在相等对象年龄的对象是否超过Survivor from/to的一半时,直接将超过的对象放入老年代。对于空间分配担保实际上是针对老年代,为了保证老年代的内存区域具有充足的空间,不至于内存溢出的情况出现,在发生MinorGC之前,JVM会判断之前每次晋升到老年代的平均大小是否大于老年代剩余空间的大小,若大于则进行full GC(即回收所有区域),若小于,则还需要查看一个参数HandlePromotionFailure,即是否允许担保失败,因为实际上进入老年代的对象大小在GC前是未知的,这也是为什么采用之前晋升的平均值来进行判断担保,也就是说只是一种预测,并不能代表真实就是有这么多对象晋升,所以若不允许担保失败,即保守的人为一定会有超过剩余老年代区域的对象存入,则还是进行Full GC,否则,进行Minor GC。
————————————————
原文链接:https://blog.csdn.net/qq_29631431/article/details/82344081

关于Minor GC和Major GC的理解

此篇文章不是原创,内容来自于《深入理解java虚拟机》。仅作笔记使用。如有错误之处,请不吝指正,谢谢。

在介绍之前,首先简单说一下堆内存的结构
堆内存在大的结构上分为:年轻代和年老代。其中年轻代又分为Eden区和Survivor区。Survivor区又分为两个相等的区域,一个是fromspace区,另外一个是tospace区。年轻代内存=Eden+其中一个Survivor区,也就是说两个Survivor区,虚拟机只使用了其中一个。

Minor GC:简单理解就是发生在年轻代的GC。
Minor GC的触发条件为:当产生一个新对象,新对象优先在Eden区分配。如果Eden区放不下这个对象,虚拟机会使用复制算法发生一次Minor GC,清除掉无用对象,同时将存活对象移动到Survivor的其中一个区(fromspace区或者tospace区)。虚拟机会给每个对象定义一个对象年龄(Age)计数器,对象在Survivor区中每“熬过”一次GC,年龄就会+1。待到年龄到达一定岁数(默认是15岁),虚拟机就会将对象移动到年老代。如果新生对象在Eden区无法分配空间时,此时发生Minor GC。发生MinorGC,对象会从Eden区进入Survivor区,如果Survivor区放不下从Eden区过来的对象时,此时会使用分配担保机制将对象直接移动到年老代。

Major GC的触发条件:当年老代空间不够用的时候,虚拟机会使用“标记—清除”或者“标记—整理”算法清理出连续的内存空间,分配对象使用。
大家注意:Major GC和Full GC是不一样的,前者只清理老年代,后者会清理年轻代+老年代。
————————————————
原文地址:https://blog.csdn.net/qq_39839075/article/details/83447985

记录JVM中Eden区、Survivor from区和Survivor to区及Minor GC和Major GC的理解相关推荐

  1. 36.JVM内存分哪几个区,每个区的作用是什么、如和判断一个对象是否存活、java垃圾回收机制、垃圾收集的方法有哪些、java类加载过程、类加载机制、双亲委派、Minor GC和Major GC

    36.JVM内存分哪几个区,每个区的作用是什么? 37.如和判断一个对象是否存活?(或者GC对象的判定方法) 38.简述java垃圾回收机制? 39.java中垃圾收集的方法有哪些? 40.java类 ...

  2. JVM的三种常见GC:Minor GC、Major GC与Full GC

    文章目录 JVM的GC JVM GC的种类 GC的触发机制 年轻代GC(Minor GC)触发机制 老年代GC(Major GC/Full GC)触发机制 Full GC触发机制 为什么需要把Java ...

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

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

  4. 直通BAT JVM必考题:Minor GC、Major GC、Full GC的区别

    Java面试过程,JVM属于必考题系列: 直通BAT必考题系列:深入详解JVM内存模型与JVM参数详细配置 直通BAT必考题系列:JVM的4种垃圾回收算法.垃圾回收机制与总结 直通BAT必考题系列:7 ...

  5. 关于JVM中Eden区、Survivor from区和Survivor to区的理解

    本文主要根据<深入理解JVM>中内存回收策略,主要关注如下五个方面: 1:Eden区分配 2:大对象直接进入老年代 3:长期存活的对象直接进入老年代 4:动态对象年龄判定 5:空间分配担保 ...

  6. JVM总结(三)Minor GC、Major GC和Full GC

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的"高墙",墙外面的人想进去,墙里面的人却想出来. 一.Minor GC Minor GC是指从年轻代空间(包括 Ede ...

  7. JVM GC(垃圾回收机制)Minro GC,Major GC/Full GC

    在学习Java GC 之前,我们需要记住一个单词:stop-the-world .它会在任何一种GC算法中发生.stop-the-world 意味着JVM因为需要执行GC而停止了应用程序的执行.当st ...

  8. JVM(七) -- 内存与垃圾回收(二) -- 运行时数据区(四) -- Java堆

    运行时数据区最重要的内容,对应书中2.2.4节.3.8节. 位置: 1. 概述 一个java进程对应一个jvm虚拟机,也对应一个堆空间 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域 ...

  9. 一篇文章帮你搞定JVM中的堆

    文章目录 一篇文章帮你搞定JVM中的堆 堆的核心概述 堆的内存细分 设置堆内存大小与OOM OOM(OutOfMemory)举例 年轻代与老年代 图解对象分配过程 MinorGC,MajorGC,Fu ...

最新文章

  1. linux kernel内存回收机制
  2. c#_文件的保存与读取
  3. spider RPC更新至2.0.0-RELEASE
  4. 谷歌的android下拉刷新页面,Android SwipeRefreshLayout:谷歌官方SDK包中的下拉刷新
  5. python工程师薪资坑吗-不在打工就在找坑的路上,3年+程序员都爱跳槽?
  6. [Android1.5]DigitalClock自定义日期输出格式
  7. eclipse User Enties 顺序
  8. MFC80.DLL复制到程序目录中,也有的说复制到安装目录中
  9. C++中模板使用详解
  10. linux安装 redis,在linux中安装redis
  11. java boolean是什么_java中的boolean与Boolean有什么不同
  12. 诺微联盟催生智能手机的三足鼎立
  13. python如何提高工作效率_用Python的这3个优点,让工作效率提升一倍
  14. 面试题 02.05. 链表求和
  15. mac下修改MySQL密码
  16. 从零实现循环神经网络
  17. JS实现各种页面的刷新
  18. mongodb导入bson文件_分布式文档存储数据库之MongoDB备份与恢复
  19. 六款顶级Wifi无线网络搜索工具盘点
  20. ubuntu 910 下安装万能五笔

热门文章

  1. WMI Provider Host(wmiprvse.exe)占用CPU高的解决方案
  2. 【年度榜单】2020大数据产业创新服务产品丨数据猿·金猿榜
  3. 个性化测试学生评测软件,学生综合素质测评软件定制开发方案
  4. c语言滚动字幕的原理编程,c#中通过Graphics.DrawString实现滚动字幕的原理和代码实例...
  5. 满满的大片既视感,还原 Pwn2Own 黑客大赛首日战况
  6. 系统找不到zlib.dll文件的解决方法。zlib编译和使用
  7. 第一阶段冲刺团队贡献值总结
  8. WinRAR捆绑木马
  9. 精通人脸识别10:RGB颜色空间
  10. Gym - 100543G Virus synthesis Gym