JVM中的垃圾回收算法GC
GC是分代收集算法;因为Young区,需要回收垃圾对象的次数操作频繁;Old区次数上较少收集;基本不动Perm区。每个区特点不一样,所以就没有通用的最好算法,只有合适的算法。

GC的4大算法
1、引用计数法(JVM实现一般不采用此方式)
缺点:
》每次对对象赋值时均要维护引用计数器,且计数器本身也有一定的性能消耗。
》较难处理循环引用
2、复制算法:复制存活对象
用在哪:年轻代中使用的是Minor GC,这种GC算法采用的复制算法(Copying)
HotSpot JVM把年轻代分为了三部分:1个Eden区和2个Survivor区(分别叫from和to)。默认比例为8:1:1,一般情况下,新创建的对象都会被分配到Eden区(一些大对象特殊处理),这些对象经过第一次Minor GC后,如果仍然存活,将会被移到Survivor区。对象在Survivor区中每熬过一次Minor GC,年龄就会增加1岁,当它的年龄增加到一定程度时,就会被移动到年老代中。因为年轻代中的对象基本都是朝生夕死的(90%以上),所以在年轻代的垃圾回收算法使用的是复制算法,复制算法的基本思想就是将内存分为两块,每次只用其中一块,当这一块内存用完,就将还活着的对象复制到另外一块上面。复制算法不会产生内存碎片。
缺点:
(1)浪费一半内存
(2)如果对象存活率比较高,那么我们需要将对象赋值,并且将引用复制一遍。所以复制算法想要使用,要求对象存活率比较低,还有克制50%内存浪费。
3、标记清除(Mark-Sweep)
老年代一般是由标记清除或标记清除与标记整理混合实现
原理:
第一步:从根集合开始扫描,对存活的对象进行标记。
第二步:再次扫描一遍,对未被标记的对象,进行清除。
优点:不需要额外的内存。
缺点:两次扫描,耗时严重;清除不用的对象后,产生内存碎片。
4、标记压缩(Mark-Compact)
老年代一般是由标记清除或标记清除与标记整理混合实现。
原理图:

缺点:效率低;不仅要标记所有存活的对象,还要整理所有存活对象的地址,效率会低于复制算法。
优点:内存不会有碎片。
5、标记清除压缩(Mark-Sweep-Compact)
就是标记清除和标记压缩的结合,特点是进行多次清除才会执行一次压缩。
总结
没有最好的算法,只有最合适的算法:分代收集算法。
1、年轻代(Young Gen),特点:区域相对老年代较小,对象存活率低。
这种情况下需要效率高的算法,所以复制算法很合适。
2、老年代(Tenure Gen),特点:区域较大,对象存活率高。
这种情况下,存在大量存活率高的对象,复制算法明显变得不合适。所以在老年代一般是由标记清除和标记压缩混合实现。
JVM中的垃圾回收算法GC的更多相关文章
- 【JVM】JVM中的垃圾回收算法
1.标记 -清除算法 "标记-清除"(Mark-Sweep)算法,如它的名字一样,算法分为"标记"和"清除"两个阶段:首先标记出所有需要回收 ...
- Java中的垃圾回收算法详解
一.前言 前段时间大致看了一下<深入理解Java虚拟机>这本书,对相关的基础知识有了一定的了解,准备写一写JVM的系列博客,这是第二篇.这篇博客就来谈一谈JVM中使用到的垃圾回收算法. ...
- JVM总括二-垃圾回收:GC Roots、回收算法、回收器
JVM总括二-垃圾回收:GC Roots.回收算法.回收器 目录:JVM总括:目录 一.判断对象是否存活 为了判断对象是否存活引入GC Roots,如果一个对象与GC Roots没有直接或间接的引用关 ...
- 浅谈jvm中的垃圾回收策略
下面小编就为大家带来一篇浅谈jvm中的垃圾回收策略.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 java和C#中的内存的分配和释放都是由虚拟机自动管理的,此前我已 ...
- JVM调优-Jva中基本垃圾回收算法
从不同的的角度去划分垃圾回收算法. 按照基本回收策略分 引用计数(Reference Counting) 比较古老的回收算法.原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数.垃圾回 ...
- JVM学习--(四)垃圾回收算法
我们都知道java语言与C语言最大的区别就是内存自动回收,那么JVM是怎么控制内存回收的,这篇文章将介绍JVM垃圾回收的几种算法,从而了解内存回收的基本原理. stop the world 在介绍垃圾 ...
- @JVM新一代的垃圾回收算法
垃圾回收的瓶颈 传统分代垃圾回收方式,已经在一定程度上把垃圾回收给应用带来的负担降到了最小,把应用的吞吐量推到了一个极限.但是他无法解决的一个问题,就是Full GC所带来的应用暂停.在一些对实时性要 ...
- JVM 中的垃圾回收
说到JVM,总是绕不开垃圾回收,因为其是JVM的核心之一,因为对象的创建是非常频繁的,想要提高程序的执行效率,拥有一个高效的垃圾回收机制是必不可少的. 首先要明确,因为对象的创建只在堆中,所以垃圾回收 ...
- java中的垃圾回收算法与垃圾回收器
常用的垃圾回收算法 标记-清除 标记清除算法是一种非移动式的回收算法,分为标记 清除 2个阶段,简而言之就是先标记出需要回收的对象,标记完成后再回收掉所有标记的内存对象,如下图 可见回收后图中被标记的 ...
随机推荐
- Java开发笔记(五十一)多态的发生场景
江湖上传闻,面向对象之所以厉害,是因为它拥有封装.继承与多态三项神技,只要三板斧一出,号令天下谁敢不从.前面费了老大的劲才讲清楚封装和继承,那么多态又是怎样的神乎其神呢?下面先通过一个简单的例子来说明 ...
- Java基础:Object类中的equals与hashCode方法
前言 这个系列的文章主要用来记录我在学习和复习Java基础知识的过程中遇到的一些有趣好玩的知识点,希望大家也喜欢. 一切皆对象 对于软件工程来说面向对象编程有一套完整的解决方案:OOA.OOD.O ...
- java SPI机制
1. SPI是Service Provider Interfaces的简称.根据Java的SPI规范,我们可以定义一个服务接口,具体的实现由对应的实现者去提供,即Service Provider(服务 ...
- Ext中继承知识点
Ext.define(entend):定义类,单继承 Ext.define(override):定义类的补丁(扩展或重写) Ext.extend:老版本的定义类,单继承 Ext.override:4种 ...
- win10更新系统后,无法远程访问的bug
win10更新系统后,无法远程访问其它电脑(服务器),同时关于其它的远程服务也将无法使用(打印机……) 是因为win10自动更新的时候安装了KB4103718插件 解决办法: 1.手动卸掉KB4103 ...
- 1.SDL介绍
01.什么是SDL SDL是微软提出的一种软件开发安全生命周期管理的一种最佳安全实践,全称为Security Development Lifecycle. SDL是微软软件开发安全保障流程,结合了软件 ...
- iOS----------常见经典错误
最近使用cocoapods集成友盟 发现几个经典错误 1.clang: error: linker command failed with exit code 1 (use -v to see in ...
- C# MessageBox自动关闭
本文以一个简单的小例子,介绍如何让MessageBox弹出的对话框,在几秒钟内自动关闭.特别是一些第三方插件(如:dll)弹出的对话框,最为适用.本文仅供学习分享使用,如有不足之处,还请指正. 概述 ...
- 更新下载库update绝对详解
下载更新apk,基本上每个app都需要的功能,来看看吧,肯定有你想要的,以前都是自己写,近期想借助第三方的一个库来做,功能齐全,感觉不错,记录使用过程,虽然官方也有使用教程,不过毕竟粗略,网上也能搜到 ...
- .net core 验证 Options 参数
.net core 中通过 PostConfigure 验证 Options 参数 Intro 在 .net core 中配置项推荐用 Options 来实现,有一些参数可能必须是用由用户来配置,不能 ...