原文地址:https://blog.csdn.net/iechenyb/article/details/79424974

新生代分为三个区域,一个Eden区和两个Survivor区,它们之间的比例为(8:1:1),这个比例也是可以修改的。通常情况下,对象主要分配在新生代的Eden区上,少数情况下也可能会直接分配在老年代中。Java虚拟机每次使用新生代中的Eden和其中一块Survivor(From),在经过一次Minor GC后,将Eden和Survivor中还存活的对象一次性地复制到另一块Survivor空间上(这里使用的复制算法进行GC),最后清理掉Eden和刚才用过的Survivor(From)空间。将此时在Survivor空间存活下来的对象的年龄设置为1,以后这些对象每在Survivor区熬过一次GC,它们的年龄就加1,当对象年龄达到某个年龄(默认值为15)时,就会把它们移到老年代中。

在新生代中进行GC时,有可能遇到另外一块Survivor空间没有足够空间存放上一次新生代收集下来的存活对象,这些对象将直接通过分配担保机制进入老年代;

1.Eden区

Eden区位于Java堆的年轻代,是新对象分配内存的地方,由于堆是所有线程共享的,因此在堆上分配内存需要加锁。而Sun JDK为提升效率,会为每个新建的线程在Eden上分配一块独立的空间由该线程独享,这块空间称为TLAB(Thread Local Allocation Buffer)。在TLAB上分配内存不需要加锁,因此JVM在给线程中的对象分配内存时会尽量在TLAB上分配。如果对象过大或TLAB用完,则仍然在堆上进行分配。如果Eden区内存也用完了,则会进行一次Minor GC(young GC)。

2.Survival from to

Survival区与Eden区相同都在Java堆的年轻代。Survival区有两块,一块称为from区,另一块为to区,这两个区是相对的,在发生一次Minor GC后,from区就会和to区互换。在发生Minor GC时,Eden区和Survivalfrom区会把一些仍然存活的对象复制进Survival to区,并清除内存。Survival to区会把一些存活得足够旧的对象移至年老代。

3.年老代

年老代里存放的都是存活时间较久的,大小较大的对象,因此年老代使用标记整理算法。当年老代容量满的时候,会触发一次Major GC(full GC),回收年老代和年轻代中不再被使用的对象资源。

总结:

1、Minor GC是发生在新生代中的垃圾收集,采用的复制算法;

2、新生代中每次使用的空间不超过90%,主要用来存放新生的对象;

3、Minor GC每次收集后Eden区和一块Survivor区都被清空;

4、老年代中使用Full GC,采用的标记-清除算法

注意:

堆=新生代+老年代,不包括永久代(方法区)。

很多人认为方法区(或者HotSpot虚拟机中的永久代)是没有垃圾收集的,Java虚拟机规范中确实说过可以不要求虚拟机在方法区实现垃圾收集,而且在方法区进行垃圾收集的“性价比”一般比较低:在堆中,尤其是在新生代中,常规应用进行一次垃圾收集一般可以回收70%~95%的空间,而永久代的垃圾收集效率远低于此。

永久代的垃圾收集主要回收两部分内容:废弃常量和无用的类。回收废弃常量与回收Java堆中的对象非常类似。以常量池中字面量的回收为例,假如一个字符串“abc”已经进入了常量池中,但是当前系统没有任何一个String对象是叫做“abc”的,换句话说是没有任何String对象引用常量池中的“abc”常量,也没有其他地方引用了这个字面量,如果在这时候发生内存回收,而且必要的话,这个“abc”常量就会被系统“请”出常量池。常量池中的其他类(接口)、方法、字段的符号引用也与此类似。

判定一个常量是否是“废弃常量”比较简单,而要判定一个类是否是“无用的类”的条件则相对苛刻许多。类需要同时满足下面3个条件才能算是“无用的类”:

该类所有的实例都已经被回收,也就是Java堆中不存在该类的任何实例。

加载该类的ClassLoader已经被回收。

该类对应的java.lang.Class 对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。

虚拟机可以对满足上述3个条件的无用类进行回收,这里说的仅仅是“可以”,而不是和对象一样,不使用了就必然会回收。是否对类进行回收,HotSpot虚拟机提供了-Xnoclassgc参数进行控制,还可以使用-verbose:class及-XX:+TraceClassLoading、 -XX:+TraceClassUnLoading查看类的加载和卸载信息。

在大量使用反射、动态代理、CGLib等bytecode框架的场景,以及动态生成JSP和OSGi这类频繁自定义ClassLoader的场景都需要虚拟机具备类卸载的功能,以保证永久代不会溢出。

jvm的新生代、老年代、永久代关系相关推荐

  1. JVM 新生代老年代与GC

    Java堆可以分为新生代和老年代两个区,其中新生代又可以分为一个Eden区和两个Survivor区,两个Survivor区分别被命名为From和To以示区分,新生代和老年代的比例为1:2,它们共同组成 ...

  2. GC算法 (标记清除、复制、标记整理、 分代收集) 、 新生代 老年代

    一.标记-清除算法(Mark-Sweep)   1标记阶段:首先通过根节点,标记所有从根节点开始的可达对象.未被标记的对象就是未被引用的垃圾对象 2清除阶段:清除所有未被标记的对象. 不足:1效率问题 ...

  3. Java架构学习(十二)java内存结构新生代老年代JVM参数调优堆内存参数配置解决堆栈溢出

    JVM参数调优与垃圾回收机制 一.java内存结构 Java内存模型:是多线程里面的,jmm与线程可见性有关 Java内存结构:是JVM虚拟机存储空间. Java内存结构图 Java内存机构分为:方法 ...

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

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

  5. 【JVM】元空间与永久代区别

    永久代(PermGen) 在自定义类加载器还不是很常见的时候,类大多是static的,很少被卸载或收集,因此被成为"永久的(Permanent)".同时,由于类class是JVM实 ...

  6. 04.Java 堆内存 新生代 老年代?

    Java 中的堆是 JVM所管理的最大的一块内存空间,主要用于存放各种类的实例对象. 在 Java 中,堆被划分成两个不同的区域:新生代 ( Young ).老年代 ( Old ).新生代 ( You ...

  7. java新生代 老年代比例_JVM老年代和新生代的比例

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

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

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

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

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

最新文章

  1. 我是一个平平无奇的AI神经元
  2. DOM_05之DOM、BOM常用对象
  3. mysql session变量_mysql 系统变量和session变量
  4. 融合libevent和protobuf
  5. meta viewport相关
  6. matlab没有找到图形用户界面,MATLAB中不能设计图形用户界面。
  7. 爱护身体之简易程序员健身操
  8. CCF201312-1 出现次数最多的数
  9. Mysql一些重要配置参数的学习与整理(二)
  10. Servlet 生命周期的过程分析 图解
  11. 通赢A5管理系统服务器连不进,赢通软件A5A6系列管理系统参数设置说明
  12. 利用Matlab求解Stewart并联机构位置正解,方法为牛顿迭代法
  13. 通过代理服务器下载网页
  14. 华为电脑安装双系统linux,华为MateBook笔记本安装Win10与Ubuntu双系统
  15. sd卡受损怎么修复?这个技巧一定要看
  16. 一些常用的开发软件,定期更新!
  17. 蓝牙速率详细分析和提升方式【附IOS,安卓速率测试报告】
  18. pmf-automl源码分析
  19. matlab 变量上小尖尖,发动机最中间的那个小尖尖,你猜是什么?
  20. 【MMDetection3D】环境搭建,使用PointPillers训练测试可视化KITTI数据集

热门文章

  1. 华为鸿蒙系统发布会是几点,华为鸿蒙6月2日几点发布 鸿蒙系统发布会时间
  2. matlab 从结构体struct提取某一字段filed
  3. SVN文件不显示绿色勾子的解决方法
  4. Mendix平台(Mendix Platform)架构
  5. 转载 GIS的下个十年(Peter Batty, president, Spatial Networking)
  6. app接入 Paypal BrainTree
  7. C4D2023取消永久许可?Maya推出精简版?你不能错过的7个CG软件资讯...
  8. 无人驾驶汽车模型预测控制
  9. python实现通讯录管理系统
  10. java中的addbutton表达什么_button1.addActionListener(this); 这句话什么意思啊????...