JAVA 垃圾回收
如何确定垃圾:
1.引用计数法
在 Java 中,引用和对象是有关联的。如果要操作对象则必须用引用进行。因此,很显然一个简单
的办法是通过引用计数来判断一个对象是否可以回收。简单说,即一个对象如果没有任何与之关
联的引用,即他们的引用计数都为 0,则说明对象不太可能再被用到,那么这个对象就是可回收
对象。
2.可达性分析
为了解决引用计数法的循环引用问题,Java 使用了可达性分析的方法。通过一系列的“GC roots”
对象作为起点搜索。如果在“GC roots”和一个对象之间没有可达路径,则称该对象是不可达的。
要注意的是,不可达对象不等价于可回收对象,不可达对象变为可回收对象至少要经过两次标记
过程。两次标记后仍然是可回收对象,则将面临回收
标记清除算法( Mark-Sweep )
最基础的垃圾回收算法,分为两个阶段,标记和清除。标记阶段标记出所有需要回收的对象,清
除阶段回收被标记的对象所占用的空间。
从图中我们就可以发现,该算法最大的问题是内存碎片化严重,后续可能发生大对象不能找到可
利用空间的问题。
复制算法(copying)
为了解决 Mark-Sweep 算法内存碎片化的缺陷而被提出的算法。按内存容量将内存划分为等大小
的两块。每次只使用其中一块,当这一块内存满后将尚存活的对象复制到另一块上去,把已使用
的内存清掉,如图
这种算法虽然实现简单,内存效率高,不易产生碎片,但是最大的问题是可用内存被压缩到了原
本的一半。且存活对象增多的话,Copying 算法的效率会大大降低。
标记整理算法(Mark-Compact)
结合了以上两个算法,为了避免缺陷而提出。标记阶段和 Mark-Sweep 算法相同,标记后不是清
理对象,而是将存活对象移向内存的一端。然后清除端边界外的对象。如图:
分代收集算法:
分代收集法是目前大部分 JVM 所采用的方法,其核心思想是根据对象存活的不同生命周期将内存
划分为不同的域,一般情况下将 GC 堆划分为老生代(Tenured/Old Generation)和新生代(Young
Generation)。老生代的特点是每次垃圾回收时只有少量对象需要被回收,新生代的特点是每次垃
圾回收时都有大量垃圾需要被回收,因此可以根据不同区域选择不同的算法。
JAVA 垃圾回收相关推荐
- 假期三天,我肝了万字的Java垃圾回收,看完你还敢说不会?
大家好,我是狂聊,上一篇已经把 Jvm 的运行区数据和类加载机制聊完了. 今天来说说 Java 垃圾回收,高频面试问题. 提纲附上,话不多说,直接干货 1.什么是垃圾回收? 垃圾回收(Garbage ...
- java垃圾回收机制_笔记 | Java垃圾回收机制
本文经授权转载自程序员杂货铺(ID:speakFramework) 垃圾回收 最近上海的小伙伴是不是要被强垃圾分类搞疯了???哈哈哈哈 上海是个走在前列的城市啊,不光骑自行车闯红灯要被罚钱,垃圾不分类 ...
- 细述 Java垃圾回收机制→Types of Java Garbage Collectors
本文将会介绍各种不同类型的Java垃圾回收器.垃圾回收是Java用来将程序员从分配和释放内存的琐事中解放出来的自动过程. Java有四种类型的垃圾回收器, Serial Garbage Collect ...
- 细述 Java垃圾回收机制→Java Garbage Collection Monitoring and Analysis
本文非原创,翻译自Java Garbage Collection Monitoring and Analysis 在Java中为对象分配和释放内存空间都是由垃圾回收线程自动执行完成的.和C语言不一样的 ...
- Java垃圾回收工作原理
在C++中,在heap上分配对象比在stack上分配对象更加昂贵.程序需要找到合适的内存块,再返回内存的地址.但是在Java中垃圾回收器显著地提高了在heap上分配对象的速度.听起来会有些怪,但是这就 ...
- Java 垃圾回收机 GC Roots详解(Garbage Collection Roots)
背景: 之前面试阿里支付宝,被问到常见的GC Root 是什么? 当时自己支支吾吾,明明自己看过深入理解Java 虚拟机这本书,但是就是回答不上来. 后来自己工作中,遇到内存泄漏问题.我百度,下载了M ...
- Java垃圾回收机制(Garbage Collection)
引用博客地址:http://www.cnblogs.com/ywl925/p/3925637.html 以下两篇博客综合描述Java垃圾回收机制 第一篇:说的比较多,但是不详细 http://www. ...
- java垃圾回收机制串行_Java垃圾回收机制
Java语言是一门自动内存管理的语言,不再需要的对象可以通过垃圾回收自动进行内存释放. Java运行时内存区域划分 JVM将Java程序运行时内存区域划分成以下几个部分: 程序计数器(Program ...
- java垃圾回收机制_JVM的垃圾回收机制——垃圾回收算法
一.Java垃圾回收机制 在java中,程序员是不需要显示的去释放一个对象的内存的,而是由虚拟机自行执行.在JVM中,有一个垃圾回收线程,它是低优先级的,在正常情况下是不会执行的,只有在虚拟机空闲或者 ...
- java垃圾回收根对象_Java垃圾回收怎么理解?
展开全部 Java的堆是一个运行时数据区,类的实例(对象)从中62616964757a686964616fe58685e5aeb931333339653664分配空间.Java虚拟机(JVM)的堆中储 ...
最新文章
- Fedora安装Texlive2013时出现Can't locate Digest/MD5.pm的解决方法
- 2021-02-21 Python Easyocr 图片文字识别
- 关于Git的几个使用技巧
- 听说蒂姆·库克来了?这和我们有什么关系!
- 贷款中介市场要变天了吗?
- Unity SRP自定义渲染管线 -- 4.Spotlight Shadows
- CF1338D:Nested Rubber Bands(树形dp)
- 时间小知识对于时间转换可能有帮助
- webusercontrol ajax,ASP.NET页面使用AjaxPro2完成JS调用后台方法
- flutter AndroidView简述
- 山东女子学院计算机专业分数线,山东女子学院2020年山东省本科专业录取分数统计(含位次)...
- 多GPU环境运行实验的一点经验
- ic和mos怎么区分_快速掌握MOS管源极和漏极的区别!看了受益匪浅!
- 串口数据接收、发送与USB转串口驱动下载
- Kali利用Redis未授权漏洞入侵服务器
- 智能代还行业怎么样?合法吗?代还APP开发靠谱吗?
- 【单片机毕业设计】【mcuclub-jj-015】基于单片机的风扇的设计
- c语言流星雨程序下载,c语言 流星雨的实现.doc
- 从脚本学python(秋名山车神)
- Hamming Embedding 汉明嵌入