Java 垃圾回收机制(早期版本)
Java 垃圾回收机制在我们普通理解来看,应该视为一种低优先级的后台进程来实现的,其实早期版本的Java虚拟机并非以这种方式实现的。
先从一种很简单的垃圾回收方式开始。
引用计数
引用计数是一种简单但是速度很慢的垃圾回收技术。
每个对象都含有要给引用计数器,当有引用连接至对象时,引用计数+1。
当引用离开作用域或者被置为null时,引用计数-1。
当发现某个对象的引用计数为0时,就释放其占用的空间。

这种方法开销在整个程序生命周期中持续发生,并且该方法有个缺陷,如果对象之间存在循环引用,可能会出现 “对象应该被收回,但引用计数却不为零” 的情况。
即
b.setA(a);
a.setB(b);
对垃圾回收器而言,定位这样的交换自引用的对象组所需的工作量极大。引用计数常用来说明垃圾收集的工作方式,但似乎未被应用于任何一种Java虚拟机实现中。
如何解决
很多垃圾回收器并非基于引用记数计数。它们依赖的思想是:
对任何“活”对象,一定能最终追溯到其存活再堆栈或者静态存储区之中的引用。这个引用链条可能会穿过数个对象层次。由此,如果从堆栈和静态存储区开始,遍历所有的引用,就能找到所有“活”的对象。对于发现的每个引用,必须追踪它所引用的对象,然后是此对象包含的所有引用,如此反复进行,知道“根源于堆栈和静态存储区的引用”所形成的网络全部被访问为止。你所访问过的对象必须是“活”的。
注意,这就解决“交互自引用的对象组”的问题——这种现象根本不会被发现,因此也被自动回收了。
停止-复制
显然,意味着,这种方法要先暂停程序运行(所以他不属于后台回收模式),然后将所有存活的对象从当前堆栈复制到另个堆(所有指向它的引用都要被重新修正),没有被复制的全部都是垃圾。
当对象被复制到新堆时,他们时一个挨着一个的,所以新堆保持紧凑配列,然后就可以根据前述方法,直接地分配新空间了。
存在的问题:效率太低。
(1)在两个堆之间倒腾,需要维护多一倍的空间;
(2)程序进入稳定状态后,可能只产生少量垃圾,复制式回收器仍然会将所有内存自一处复制到另一处,这很浪费。
为了解决第二个问题,产生了“标记-清扫”
标记-清扫
从堆栈和静态存储出发,遍历所有引用,进而找出所有活的对象,并标记,整个过程不会回收任何对象。
只有全部标记工作完成的时候,清理动作才会开始。在清理过程中,没有标记的对象将被释放,不会发生任何复制动作。
但此方法同样必须在程序暂停的情况下才能进行。
综合两种方法,即可形成早期Java回收机制——“自适应”技术
顾名思义,Java虚拟机会进行监控,如果对象都很稳定,垃圾回收器的效率降低时,就切换“标记-清理”方式;
同样,Java虚拟机会跟踪“标记-清理”的效果,要是堆空间出现很多碎片,就会切换回“停止-复制”方式。
Java 垃圾回收机制(早期版本)的更多相关文章
- 【转】深入理解 Java 垃圾回收机制
深入理解 Java 垃圾回收机制 一.垃圾回收机制的意义 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再 ...
- 深入理解java垃圾回收机制
深入理解java垃圾回收机制---- 一.垃圾回收机制的意义 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再 ...
- 深入理解 Java 垃圾回收机制
深入理解 Java 垃圾回收机制 一:垃圾回收机制的意义 java 语言中一个显著的特点就是引入了java回收机制,是c++程序员最头疼的内存管理的问题迎刃而解,它使得java程序员 ...
- Java垃圾回收机制(Garbage Collection)
引用博客地址:http://www.cnblogs.com/ywl925/p/3925637.html 以下两篇博客综合描述Java垃圾回收机制 第一篇:说的比较多,但是不详细 http://www. ...
- [转载]深入理解Java垃圾回收机制
深入理解Java垃圾回收机制 2016-07-28 20:07:49 湖冰2019 阅读数 14607更多 分类专栏: JAVA基础 原文:http://www.linuxidc.com/Linu ...
- 图解Java 垃圾回收机制
摘要: Java技术体系中所提倡的 自动内存管理 最终可以归结为自动化地解决了两个问题:给对象分配内存 以及 回收分配给对象的内存,而且这两个问题针对的内存区域就是Java内存模型中的 堆区.关于对象 ...
- 【转载】Java垃圾回收机制
原文地址:http://www.importnew.com/19085.html Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联 ...
- Java垃圾回收机制_(转载)
Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给 ...
- 成为Java GC专家(3)—如何优化Java垃圾回收机制
为什么需要优化GC 或者说的更确切一些,对于基于Java的服务,是否有必要优化GC?应该说,对于所有的基于Java的服务,并不总是需要进行GC优化,但前提是所运行的基于Java的系统,包含了如下参数或 ...
随机推荐
- php 极简框架ES发布(代码总和不到 400 行)
ES 框架简介 ES 是一款 极简,灵活, 高性能,扩建性强 的php 框架. 未开源之前在商业公司 经历数年,数个高并发网站 实践使用! 框架结构 整个框架核心四个文件,所有文件加起来放在一起总行数 ...
- 使用 electron 实现类似新版 QQ 的登录界面效果(阴影、背景动画、窗体3D翻转)
上文<使用 VS2017 和 js 进行桌面程序开发 - electron 之 Hello Word>介绍了如何使用 VS2017 开发 electron 桌面程序,今天来点有看头的,但是 ...
- MongoDB入门解析【学习记录】
刚开始学习mongodb,对笔记做了一个整理.是基于nodejs来学习的. 1.mongodb介绍 mongodb 是C++语言编写的,是一个基于分布式文件存储的开源数据库系统. 在高负载的情况下,添 ...
- 51nod_1639:绑鞋带
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1639 #include <bits/stdc++.h& ...
- 测试环境-memcached安装与说明
一,下载memcached和libevent安装包: 1,Memcache用到了libevent这个库用于Socket的处理,所以还需要安装libevent (这两个包百度上都能找到) 二,安装lib ...
- R读取MySQL数据出现乱码,解决该问题的方法总结
最终的解决办法直接看 4 我的思路: 我用的都是utf-8编码,电脑系统win7, MySQL-Front进行数据库的可视化. 1.我用的是RStudio,先去设置R的默认编码: Tools→Glob ...
- Python爬虫初学(三)—— 模拟登录知乎
模拟登录知乎 这几天在研究模拟登录, 以知乎 - 与世界分享你的知识.经验和见解为例.实现过程遇到不少疑问,借鉴了知乎xchaoinfo的代码,万分感激! 知乎登录分为邮箱登录和手机登录两种方式,通过 ...
- python关于list的三个内置函数filter(), map(), reduce()
''' Python --version :Python 2.7.11 Quote : https://docs.python.org/2/tutorial/datastructures.html#m ...
- Password
Description Rivest是密码学专家.近日他正在研究一种数列E = {E[1],E[2],--,E[n]}, 且E[1] = E[2] = p(p为一个质数),E[i] = E[i-2]* ...
- 模板 mú bǎn
链式前向星 #include<string.h> #define MAX 10000 struct node { int to,nex,wei; }edge[MAX*+]; ],cnt; ...