为什么要这样分代

简介: 为什么要这样分代

4.3.1 为什么要这样分代:
其实主要原因就是可以根据各个年代的特点进行对象分区存储,更便于回收,采用最适当的收集算法:

新生代中,每次垃圾收集时都发现大批对象死去,只有少量对象存活,便采用了复制算法,只需要付出少量存活对象的复制成本就可以完成收集。

而老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须采用“标记-清理”或者“标记-整理”算法。

新生代又分为Eden和Survivor (From与To,这里简称一个区)两个区。加上老年代就这三个区。数据会首先分配到Eden区当中(当然也有特殊情况,如果是大对象那么会直接放入到老年代(大对象是指需要大量连续内存空间的java对象)。当Eden没有足够空间的时候就会触发jvm发起一次Minor GC,。如果对象经过一次Minor-GC还存活,并且又能被Survivor空间接受,那么将被移动到Survivor空间当中。并将其年龄设为1,对象在Survivor每熬过一次Minor GC,年龄就加1,当年龄达到一定的程度(默认为15)时,就会被晋升到老年代中了,当然晋升老年代的年龄是可以设置的。

4.3.2 Minor GC、Major GC、Full GC区别及触发条件
Minor GC是新生代GC,指的是发生在新生代的垃圾收集动作。由于java对象大都是朝生夕死的,所以Minor GC非常频繁,一般回收速度也比较快。

Major GC是老年代GC,指的是发生在老年代的GC,通常执行Major GC会连着Minor GC一起执行。Major GC的速度要比Minor GC慢的多。

Full GC是清理整个堆空间,包括年轻代和老年代

Minor GC 触发条件一般为:

eden区满时,触发MinorGC。即申请一个对象时,发现eden区不够用,则触发一次MinorGC。
新创建的对象大小 > Eden所剩空间
Major GC和Full GC 触发条件一般为:
Major GC通常是跟full GC是等价的

每次晋升到老年代的对象平均大小>老年代剩余空间
MinorGC后存活的对象超过了老年代剩余空间
永久代空间不足
执行System.gc()
CMS GC异常
堆内存分配很大的对象

4.4 如何判断对象是否存活
4.4.1 引用计数法
引用计数法就是如果一个对象没有被任何引用指向,则可视之为垃圾。这种方法的缺点就是不能检测到环的存在。

首先需要声明,至少主流的Java虚拟机里面都没有选用引用计数算法来管理内存。

什么是引用计数法:每个对象在创建的时候,就给这个对象绑定一个计数器。每当有一个引用指向该对象时,计数器加一;每当有一个指向它的引用被删除时,计数器减一。这样,当没有引用指向该对象时,计数器为0就代表该对象死亡

引用计数法的优点:

引用计数算法的实现简单,判定效率也很高,在大部分情况下它都是一个不错的算法,
引用计数法的缺点:

主流的Java虚拟机里面没有选用引用计数算法来管理内存,其中最主要的原因是它很难解决对象之间相互循环引用的问题。

相关文章
|
4月前
|
存储 Oracle Java
分代 ZGC 详解
本文主要介绍JDK21中的分代ZGC详解,包括染色指针、内存屏障等核心概念及ZGC JVM参数介绍 ZGC(Z Garbage Collector)是Java平台上的一种垃圾收集器,它是由Oracle开发的,旨在解决大堆的低延迟垃圾收集问题。ZGC是一种并发的分代垃圾收集器,它主要针对具有大内存需求和低停顿时间要求的应用程序。
分代 ZGC 详解
|
7月前
|
存储 算法 Java
JVM垃圾回收相关及堆分代原理
JVM垃圾回收相关及堆分代原理
41 0
|
13天前
|
算法 Java
垃圾收集-垃圾收集算法
垃圾收集-垃圾收集算法
21 0
垃圾收集-垃圾收集算法
|
13天前
|
算法 Java UED
垃圾收集器
垃圾收集器
32 0
|
9月前
|
Java
分代回收
分代回收
56 0
|
6月前
|
算法 Java
【垃圾回收算法】
【垃圾回收算法】
|
11月前
|
算法 Java UED
JVM - 再聊GC垃圾收集算法及垃圾收集器
JVM - 再聊GC垃圾收集算法及垃圾收集器
74 0
|
算法 安全 Java
深入剖析垃圾收集器之后,我发现里面没有扫帚
深入剖析垃圾收集器之后,我发现里面没有扫帚
深入剖析垃圾收集器之后,我发现里面没有扫帚
|
缓存 算法 安全
JVM(四)垃圾收集算法与垃圾收集器
JVM(四)垃圾收集算法与垃圾收集器
76 0
|
机器学习/深度学习 缓存 算法
jvm垃圾收集器 以及 垃圾收集算法
jvm垃圾收集器 以及 垃圾收集算法
93 0