jvm的新生代、老年代、永久代关系
原文地址: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的新生代、老年代、永久代关系相关推荐
- JVM 新生代老年代与GC
Java堆可以分为新生代和老年代两个区,其中新生代又可以分为一个Eden区和两个Survivor区,两个Survivor区分别被命名为From和To以示区分,新生代和老年代的比例为1:2,它们共同组成 ...
- GC算法 (标记清除、复制、标记整理、 分代收集) 、 新生代 老年代
一.标记-清除算法(Mark-Sweep) 1标记阶段:首先通过根节点,标记所有从根节点开始的可达对象.未被标记的对象就是未被引用的垃圾对象 2清除阶段:清除所有未被标记的对象. 不足:1效率问题 ...
- Java架构学习(十二)java内存结构新生代老年代JVM参数调优堆内存参数配置解决堆栈溢出
JVM参数调优与垃圾回收机制 一.java内存结构 Java内存模型:是多线程里面的,jmm与线程可见性有关 Java内存结构:是JVM虚拟机存储空间. Java内存结构图 Java内存机构分为:方法 ...
- jvm中的年轻代 老年代 持久代 gc ----------转载
jvm中的年轻代 老年代 持久代 gc 虚拟机中的共划分为三个代:年轻代(Young Generation).老年代(Old Generation)和持久代(Permanent Generation) ...
- 【JVM】元空间与永久代区别
永久代(PermGen) 在自定义类加载器还不是很常见的时候,类大多是static的,很少被卸载或收集,因此被成为"永久的(Permanent)".同时,由于类class是JVM实 ...
- 04.Java 堆内存 新生代 老年代?
Java 中的堆是 JVM所管理的最大的一块内存空间,主要用于存放各种类的实例对象. 在 Java 中,堆被划分成两个不同的区域:新生代 ( Young ).老年代 ( Old ).新生代 ( You ...
- java新生代 老年代比例_JVM老年代和新生代的比例
在 Java 中,堆被划分成两个不同的区域:新生代 ( Young ).老年代 ( Old ).新生代 ( Young ) 又被划分为三个区域:Eden.From Survivor.To Surviv ...
- java 年轻代算法_java内存模型 年轻代/年老代 持久区,jvm中的年轻代 老年代 持久代 gc...
虚拟机中的共划分为三个代:年轻代(Young Generation).老年代(Old Generation)和持久代(Permanent Generation).其中持久代主要存放的是Java类的类信 ...
- jvm中的年轻代 老年代 持久代 gc
虚拟机中的共划分为三个代:年轻代(Young Generation).老年代(Old Generation)和持久代(Permanent Generation).其中持久代主要存放的是Java类的类信 ...
最新文章
- 我是一个平平无奇的AI神经元
- DOM_05之DOM、BOM常用对象
- mysql session变量_mysql 系统变量和session变量
- 融合libevent和protobuf
- meta viewport相关
- matlab没有找到图形用户界面,MATLAB中不能设计图形用户界面。
- 爱护身体之简易程序员健身操
- CCF201312-1 出现次数最多的数
- Mysql一些重要配置参数的学习与整理(二)
- Servlet 生命周期的过程分析 图解
- 通赢A5管理系统服务器连不进,赢通软件A5A6系列管理系统参数设置说明
- 利用Matlab求解Stewart并联机构位置正解,方法为牛顿迭代法
- 通过代理服务器下载网页
- 华为电脑安装双系统linux,华为MateBook笔记本安装Win10与Ubuntu双系统
- sd卡受损怎么修复?这个技巧一定要看
- 一些常用的开发软件,定期更新!
- 蓝牙速率详细分析和提升方式【附IOS,安卓速率测试报告】
- pmf-automl源码分析
- matlab 变量上小尖尖,发动机最中间的那个小尖尖,你猜是什么?
- 【MMDetection3D】环境搭建,使用PointPillers训练测试可视化KITTI数据集
热门文章
- 华为鸿蒙系统发布会是几点,华为鸿蒙6月2日几点发布 鸿蒙系统发布会时间
- matlab 从结构体struct提取某一字段filed
- SVN文件不显示绿色勾子的解决方法
- Mendix平台(Mendix Platform)架构
- 转载 GIS的下个十年(Peter Batty, president, Spatial Networking)
- app接入 Paypal BrainTree
- C4D2023取消永久许可?Maya推出精简版?你不能错过的7个CG软件资讯...
- 无人驾驶汽车模型预测控制
- python实现通讯录管理系统
- java中的addbutton表达什么_button1.addActionListener(this); 这句话什么意思啊????...