网站为什么没有排名了,w7系统那个网站做的好,专业的移动网站建设公司排名,有哪些网站程序#x1f4dd;个人主页#xff1a;五敷有你 #x1f525;系列专栏#xff1a;JVM
⛺️稳中求进#xff0c;晒太阳 垃圾回收算法
Java是如何实现垃圾回收的呢#xff1f;简单来说#xff0c;垃圾回收就做两件事
找到内存中存活的对象释放不在存活对象的内存… 个人主页五敷有你 系列专栏JVM
⛺️稳中求进晒太阳 垃圾回收算法
Java是如何实现垃圾回收的呢简单来说垃圾回收就做两件事
找到内存中存活的对象释放不在存活对象的内存使得程序能再次利用这部分空间
垃圾回收算法的历史和分类
1960年发布了第一个GC算法标记-清除算法。
1963年发布了复制算法
本质上后续所有垃圾回收算法都是在两种算法的基础之上优化而来 Java垃圾回收过程会通过单独的GC线程来完成但不管使用哪种GC算法都会有部分阶段需求停止所有的用户线程这个过程被称为StopTheWorld 简称STW,如果STW时间过程会影响用户使用
垃圾回收算法的评价标准
1.吞吐量
CPU用于执行用户代码的时间与CPU总执行时间的比值吞吐量数值越高垃圾回收的效率就越高
即吞吐量执行用户代码时间/(执行用户代码时间GC时间)
2.最大暂停时间
最大暂停时间指的是所有在垃圾回收过程中的STW时间最大值。最大暂停时间越短用户使用系统时受到的影响越短
3.堆使用的效率
不同的垃圾回收算法对堆的使用方式是不同的。
上面的三种标准不可兼得。
一般来说堆内存越大最大暂停时间就越长想要减少最大暂停时间就会降低吞吐量。
标记清除算法
标记清除算法的核心分为两个阶段
1.标记阶段将所有存活的对象进行标记Java中使用可达性分析法从GC ROOT开始通过引用链遍历出所有存活对象。
2.清除阶段从内存中删除没有被标记也就是非存活的对象 优点实现简单只需要在第一阶段给每个对象维护标志位。第二阶段删除对象即可。
缺点
1.碎片化问题。
由于内存是连续的所以在对象被删除后内存中会出现很多细小的可用内存单元。如果我们需要一个比较大的空间很可能这些内存单元的大小过小而无法分配。 2.分配速度慢由于内存碎片的存在需要维护一个空闲链表极有可能发生每次需要遍历到链表最后才能获取合适的内存空间 复制算法
复制算法的核心思想是
准备两块空间From空间和To空间每次对象分配阶段只能使用其中一块空间(From 空间)在垃圾回收GC阶段将From中存活对象赋值到To空间。将两块空间的From和To名字互换。 优点
吞吐量高复制算法只需要遍历一次存活对象复制到To空间即可比标记-整理算法少了一次遍历的过程因而性能较好但是不如标记-清除算法因为标记清除算法不需要进行对象的移动。
不发生碎片化复制算法在复制之后就会将对象按顺序放入To空间所以对象以外 的区域都是可用空间不存在碎片化内存空间
缺点
内存使用效率低每次只能让一半的内存空间来为创建对象使用
标记整理算法
标记整理算法也叫标记压缩算法是对标记整理算法中容易产生内存碎片问题的一种解决方案。
核心思想分为两个阶段
标记阶段将所有存活的对象进行标记Java中使用可达性分析算法从GC Root开始通过引用链遍历出所有存活对象。
整理阶段将存活对象移动到堆的一端清理掉存活对象的内存空间。 分代GC算法
现在优秀的垃圾回收算法会将上述描述的垃圾回收算法组合进行使用其中应用最广的就是分代垃圾回收
算法Generational GC
分代垃圾回收将整个内存区域划分为年轻代和老年代 分代回收时创建出来的对象首先会被放入Eden伊甸园区
随着对象在Eden区越来越多如果Eden区满新创建的对象已经无法放入就会触发年轻代的GC,称为Minbor GC或者 Young GC。
Minor GC会把需要eden中和From需要回收的对象回收把没有回收的对象放入To区 接下来S0变成to区s1变成From区当eden区满时在往里面放入对象。依然会发生Minor GC
此时会回收eden区和S1(from)中的对象并把eden和from区中剩余的对象放入S0
注意每次Minor GC中都会为对象记录他的年龄初始值为0每次GC完成加1
如果Minor GC后对象的年龄达到阈值(最大15默认值和垃圾回收器有关)对象就会被晋升老年代
当老年代中空间不足无法放入新的对象时先尝试minor gc如果还是不足就会触发Full GC对整个堆进行垃圾回收。
Full GC无法回收老年代的对象那么当对象继续放入老年代就会抛出Out Of Memory