摘要:每被引用一次,引用次数加一。相反,不再被引用时,引用计数减一。从被称为的一些对象出发,找到其引用的对象,再到其间接引用的对象,形成一条引用链。凡是不在引用链里面的对象,被称为不可达对象,被标记为需要回收。
(我在知乎的专栏文章地址: https://zhuanlan.zhihu.com/p/... )
简介C/C++等语言中需要手动管理内存,操作繁琐,还容易忘记释放内存。
为了把程序员从这些繁琐的操作中解放出来,所以引入了GC。
GC的主要工作就是寻找不再需要的对象,释放其内存。这句话中蕴含着两个操作:
定位不需要的对象
释放内存
定位不需要的对象 引用计数 Reference counting每个对象都有一个变量,记录了自己被引用的次数。每被引用一次,引用次数加一。相反,不再被引用时,引用计数减一。当引用次数为0的时候,说明对象需要被回收。
优点:实现简单
缺点:无法解决循环引用
改进:
添加弱引用
用trial deletion解决循环引用
使用tracing GC例如mark-sweep GC辅助
跟踪 Tracing基于可达性(reachable)分析。从被称为GC Roots的一些对象出发,找到其引用的对象,再到其间接引用的对象,形成一条引用链。凡是不在引用链里面的对象,被称为不可达(Unreachable)对象,被标记为需要回收。
优点: 目前主流的GC算法,解决了引用计数的问题。
缺点:实现较为复杂
标记清除算法分为“标记”和“清除”两个阶段:首先标记出需要回收的对象,标记完成之后统一清除对象。它的优点是效率高,缺点是容易产生内存碎片。
复制它将可用内存容量划分为大小相等的两块,每次只使用其中的一块。当这一块用完之后,就将还存活的对象复制到另外一块上面,然后在把已使用过的内存空间一次理掉。它的优点是实现简单,效率高,不会存在内存碎片。缺点就是需要2倍的内存来管理。
标记-整理标记操作和“标记-清理”算法一致,后续操作不只是直接清理对象,而是在清理无用对象完成后让所有 存活的对象都向一端移动,并更新引用其对象的指针。因为要移动对象,所以它的效率要比“标记-清理”效率低,但是不会产生内存碎片。
总结标记-整理和复制算法是对标记-清除算法的改进,解决了一些标记-清除算法的缺点。但是并不意味着后两种算法优于标记-清除算法,只是有所取舍,在工程上权衡。
分代分代不是一种新的算法,而是对已有的算法的工程上调优。
由于对象的存活时间有长有短,所以对于存活时间长的对象,减少被gc的次数可以避免不必要的开销。这样我们就把内存分成新生代和老年代,新生代存放刚创建的和存活时间比较短的对象,老年代存放存活时间比较长的对象。这样每次仅仅清理年轻代,老年代仅在必要时时再做清理可以极大的提高GC效率,节省GC时间。
Serial -XX:+UseSerialGC
Parallel -XX:+UseParallelGC -XX:+UseParallelOldGC
CMS -XX:+UseParNewGC -XX:+UseConcMarkSweepGC
G1 -XX:+UseG1GC
默认gc,分代gc,经典的Eden, Survivor, OldGen, PermGen。
1.8中PerGen被废弃,部分被MetaSpace代替。
改进的mark-sweep算法。
年轻代使用Parallel,老年代才使用CMS。可以通过参数配置不同的回收器。
初始标记(CMS-initial-mark stop the world) -> 并发标记(CMS-concurrent-mark) -> 重新标记(CMS-remark stop the world) -> 并发清除(CMS-concurrent-sweep) ->并发重设状态等待下次CMS的触发(CMS-concurrent-reset)
G1多个Region, 每个Region都有Eden,Survivor,Old,Humongous。
因为划分多个Region,所以单个Region可能比较小,对于那些较大的对象用Humongous储存
对象分配策略
TLAB(Thread Local Allocation Buffer)线程本地分配缓冲区
Eden区
Humongous区
TLAB是为了避免同步的预分配区。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/68403.html
摘要:概述是一个主要版本的发布这里介绍的是对的特性和增强的实现是的增强提案,包括增强建议和路线图流程规范请求,描述了针对平台的建议和最终规范主要变更统一模块化标准这是全新的编程组件模块,是可命名的可自描述的代码和数据集合。 概述 java9是一个主要版本的发布 这里介绍的是Oracle对JDK9的特性和增强的实现 JEP是JDK的增强提案,包括增强建议和路线图流程 JSR(Java规范请...
摘要:做好的优化能大大提升系统的性能体系结构概览大致流程如图编译好的文件通过类加载器从物理结构转换成运行时数据区结构。后面再写一篇关于调优的 什么是jvm jvm是java虚拟机的缩写。所有的java程序都是在jvm上运行的。做好jvm的优化能大大提升系统的性能 jvm体系结构概览 showImg(https://segmentfault.com/img/bVba5lB?w=1049&h=6...
摘要:千呼万唤,于正式发布版本即,也就是官方推荐可以广泛使用的版本,其中发布了包括等个新特性,让我们一睹为快。一新特性一览二发布计划日期阶段说明对进入阶段的变化会应用越来越严格的审查。我们需要支持以保持竞争力并与最新标准保持同步。 千呼万唤,JDK11于2018-09-25正式发布GA版本(GA即General Availability,也就是官方推荐可以广泛使用的版本),其中发布了包括ZG...
摘要:概要要理解的内存管理策略,首先就要熟悉的运行时数据区,如上图所示,在执行程序的时候,虚拟机会把它所管理的内存划分为多个不同的数据区,称为运行时数据区。 这是一篇有关JVM内存管理的文章。这里将会简单的分析一下Java如何使用从物理内存上申请下来的内存,以及如何来划分它们,后面还会介绍JVM的核心技术:如何分配和回收内存。 JMM ( Java Memory Model )概要 show...
阅读 1901·2021-11-24 11:16
阅读 3259·2021-09-10 10:51
阅读 3195·2021-08-03 14:03
阅读 1264·2019-08-29 17:03
阅读 3244·2019-08-29 12:36
阅读 2228·2019-08-26 14:06
阅读 496·2019-08-23 16:32
阅读 2674·2019-08-23 13:42