大战Java虚拟机【2】—— GC策略
前言
前面我们已经知道了Java虚拟机所做的事情就是回收那些不用的垃圾,那些不用的对象。那么问题来了,我们如何知道一个对象我们不需要使用了呢?程序在使用的过程中会不断的创建对象,这些所创建的对象指不定在哪里我们就需要用到了呢?GC怎么知道我们不用了呢?回收就是简单的删除吗?这些问题将会在这里做出解释。
怎么判断一个对象将会被回收
说白了就是判断一个对象已经死亡,不会再被用到了。
首先我们需要知道java中有四种不一样的引用。
强引用:A a = new A()
软引用:还有用,但不是必须的对象,软引用就是连着这些对象,如果马上要内存溢出了就会尝试回收这些对象
弱引用:被弱引用关联的对象只能活到下一次GC之前
虚引用:最没用的一个,只有一个目的,在回收之前收到一个系统通知
引用计数(这个不是java虚拟机使用的)
看书的时候我就惊讶了,因为我确实也面试到很多人这个问题,回答告诉我的都是引用计数,即:用一个计数器,当有引用指向它,则加1,当失去一个引用,则减1,当引用为0时则回收。
我学过AS3,在flash里面确实是这样的,但是在java虚拟机里面不是,因为没有办法回收两个互相引用的对象。
比如A引用B,B引用A这样大家引用都不是0,就无法回收了,显然java中是可以回收这样对象的。
可达性算法
引入了GC Root的概念,从这个根必须能引用到这个对象。
(GC Root)->(A)->(B)
(C)
当C这样的对象到GC Root没有任何引用链项链的时候,也就是不可达的时候,算这个对象已经死亡。
java和C#都是使用这样算法。
上面说的都是堆中对象的死亡条件,或者说堆的的对象什么时候会被回收。
我们要知道的是,方法区其实也是可以垃圾收集的。比如当一个字符串常量没有地方引用到了这个量,如果现在方法区不够了那就会进行回收。
垃圾收集的算法
这里用最简单的话概括一下,有必要的详细了解
1、标记-清除
看名字就知道,就先标记一下要回收的对象,标记完成之后统一清除。
缺点:效率不高,清除之后碎片内存太多。
2、复制
将内存一分为A、B;用的时候就用A这块,回收的时候,将A中需要用的东西复制到B中,然后一次性清除A的区域。
优点:对象存活率不高的时候效率高,不会有内存碎片,都是一整块的。
缺点:代价高,原本挺大的一块内存硬生生是被切成了一半。(不是说所有的虚拟机都是对半分来实现复制的)
3、标记-整理
和标记清除类似,只是在清除的时候不一样,这里是整理,将存活的对象移到一起。
效率和标记清除是差不多的,但是不会有碎片内存
4、分代收集
因为不是每个收集的算法都是完美的,所以java虚拟机采用分代收集的思想,对于新生代因为有大批的对象会死亡,所以使用复制,但是对于老年代,对象的存活率高,所以采用标记整理或者标记清除。
分配
我们知道了对象是如何回收的,同时我们也需要知道对象是如何分配的。
1、对象优先分配在新生代Eden区,当没有位置的时候发起一次MinorGC
2、大的对象,如连续分配的数组直接进入老年代
3、长期存活的对象会进入老年代,没熬过一次MinorGC就增加一岁
4、当相同年龄的对象大小综合大于Survivor的一半就会将年龄大于等于这个年龄的对象直接进入老年代
5、老年代可以用作新生代的空间担保,新生代用的是复制算法,万一对象存活太多,那么需要额外的空间去弥补
针对每个收集器的具体行为和优势劣势将会在后面提出,这里暂时就到这里。
上面就是GC策略,我们所要知道的就是如何判断一个对象存活,对象怎么被回收,对象怎么被分配。
大战Java虚拟机【2】—— GC策略相关推荐
- 深入理解java虚拟机(六)GC垃圾回收-低延迟垃圾收集器(Shenandoah、ZGC)
文章目录 前言 一.Shenandoah收集器 1.Shenandoah介绍 2.Shenandoah与G1对比 3.Shenandoah工作原理 4.Shenandoah并行整理的核心概念-Broo ...
- 深入理解java虚拟机gc_jvm GC收集器与内存分配(深入理解java虚拟机第三章)
jvm GC收集器与内存分配(深入理解java虚拟机第三章) 本篇是<深入理解java虚拟机第三章>的笔记记录. 一 为什么要关注GC和内存分配? 需要排查各种内存溢出.内存泄漏问题时,或 ...
- java虚拟机jvm GC介绍
在虚拟机中,释放那些不再被使用的对象所占用空间的的过程称作垃圾回收,简称GC. 垃圾回收的三个难题: 如何确定哪些对象不再被使用? 什么时候进行回收? 如何回收? 如何确定对象无用 引用计数算法 引用 ...
- Java 虚拟机枚举 GC Roots 解析
原始链接:https://www.leahy.club/archives/gcroots 最近在复习JVM,在看<深入理解Java虚拟机>中关于GC Roots的描述不是很明白,就收集了相 ...
- 深入理解java虚拟机(三)GC垃圾回收-对象存活算法
文章目录 前言 一.引用计数算法 二.可达性分析算法 三.了解引用 结尾 前言 在堆里面存放着Java世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还&qu ...
- Java虚拟机-内存分配策略
Java技术体系中所提倡的自动内存管理策略最终可以归结为自动化地解决了两个问题:给对象分配内存以及回收分配给对象的内存: 几条普遍的分配规则: 1.对象优先在Eden区分配 年轻代分为三个区:1个Ed ...
- 深入理解java虚拟机(五)GC垃圾回收-经典垃圾收集器
文章目录 前言 一.Serial收集器(标记-复制算法) 二.ParNew收集器(标记-复制算法) 三.Parallel Scavenge收集器(标记-复制算法) 四.Serial Old收集器(标记 ...
- java虚拟机之gc
引用: java 和 c++ 之间有一堵 由动态内存分配和垃圾回收技术所围成的高墙.墙外的人想进入 而墙内的人却想出来. 回收内存的位置 内存回收的位置主要在 jvm 的堆和方法区中(线程共享的区域) ...
- Java虚拟机内存分配策略
1.JVM内存分配分区 Java的内存简单分为堆内存和非堆内存 其中堆内存又可以分为新生代和老年代 新生代分为1个Eden区和2个Survivor区,如下图: 2.JVM垃圾回收种类 分为2种,Min ...
最新文章
- 2020中国一流大学名单(27所)和中国大学综合实力300强出炉!
- OpenCV的cv::cvtColor函数之“CV_RGB2GRAY”: 未声明的标识符错误解决方法
- 交换二维数组元素c语言,二维数组中元素替换问题!
- 一文教你学会需求分析与管理
- catia如何整列加工_非标零件如何用机器检测?能像人类一样查出问题吗?
- EIGRP路由协议的简单理解及应用
- MYSQL获取自增ID的四种方法
- AMPL_网络项目问题
- 1.4 自定义框架
- aes解密流程图_aes流程图(apqp五个阶段流程图)
- 椭圆拟合fitEllipse()函数
- Win8.1的IE缓存文件夹哪里去了?细说系统安装分区里那些带箭头的文件夹
- 无主3局域网找不到服务器,无主之地3局域网模式设置方法攻略 无主之地3局域网怎么用...
- 0xffffffff是多少?
- 当前主流服务器型号,当前服务器的主流品牌 型号 配置
- 光纤连接器的连接方法
- Wireshark抓包分析微信功能----tcp/ip选修课期末大作业
- pcsx2模拟器怎么设置流畅?
- Apple下载Xcode安装包
- 为什么要用 UML 建模之建模的重要性