关于JAVA的垃圾回收机制
使用JAVA编程时,几乎不需要考虑“内存泄漏”的问题,这也是JAVA相较于C++的一个优点。
最近在看《Java编程思想》(第四版,听说第五版有点牛逼。。。。),里面讲到JAVA的回收机制,在这里记录一下。
书中首先说到的是引用计数:
这是一种很“简单”,但是速度很慢的垃圾回收技术。这个机制就是说每一个对象都含有一个"引用"计数器,当有”引用“连接到这个对象的时候,计数器就会+1;当”引用“离开作用域,或者被置为null时,计数器就会-1。虽然这个计数器可能不会占用太多的资源(空间),但是这个过程贯穿了程序的真个生命过程。 垃圾回收器会在含有”全部对象“的列表上进行遍历,当发现某一个计数器是0的时候,就释放这个对象占用的空间。这个方法有一些缺陷,当A对象中引用了B对象,A对象的引用消失了,但是此时,程序并不会认为B对象引用也减少了,因而会产生一些”错误“,该被释放掉的没有释放。这种方式也从来没有被任何一种JAVA虚拟机实现。
然后是停止-复制:
在这个模式认为,任何“活着”的对象,都一定能追溯到它存在于堆栈或者静态存储区的引用。这种模式下,程序会先暂停运行,然后将所有“活着”的对象从当前的堆中,复制到另一个堆。这个时候没有被复制并且放进新堆中的对象,都会被认为是垃圾。在新堆中,这些“活着”的对象是一个挨着一个的,位置紧凑。
这种方式的效率相对比较低,原因有两个:
- 这种复制的方式,需要两个堆,从一个堆复制到另一个堆去,需要的空间就是实际所需空间的一倍了。(有一些JAVA虚拟机在处理这个问题时,会将堆划分成几块较大的内存,复制动作发生在这几个大块之间)
- 复制,也是一个问题。当程序稳定运行的时候,垃圾应该是很少的,或者说没有垃圾,但是此时,依然要执行复制,来保证清楚垃圾,不浪费资源。而复制本身就在浪费资源。
最后是标记-清除:
这个模式的思路就是从堆栈和静态存储区出发,遍历所有的引用,可以找到“活着”的对象。找到“活着”的对象的时候,就会给这些“活着”的对象一个标记,此时暂时不在执行其他动作。当标记工作全部完成之后,清理才会开始。那些没有获得“活着”标记的对象将会被释放。但是这样做,却会造成内存空间的不紧凑,可能内存空间因为一些对象的释放变得不再连续。这个模式也是在程序暂停时才执行的。
就停止-复制而言,垃圾回收器在回收那些无用对象之前,必须要先将活着的对象拷贝到新的堆中。这里假设内存被分成了多个较大的”块“。则复制行为发生在这些”块“之间,一些大对象会独自占有一个”块“,对于这些大型对象,他们不会被复制,而是他所在的块代数会增加,对于那些小型对象,就使用复制并且释放的方法。当大多数对象都趋于稳定的时候,垃圾回收器还使用这种模式就显的效率很低下,所以这个时候就会切换到标记-清除模式;同样,JAVA虚拟机这个时候也会监控标记-清除模式工作效果,当出现很多破碎的空间时,就切换到停止-复制模式。
书中称到:这是一种自适应、分代的、停止-复制、标记-清除 式垃圾回收器
关于JAVA的垃圾回收机制的更多相关文章
- 记录Java的垃圾回收机制和几种引用
一.Java的垃圾回收机制 Java的垃圾回收机制(java garbage collection)是Java虚拟机提供的能力,用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的堆内存空间. ...
- 了解java中垃圾回收机制
Java的垃圾回收机制是Java环境自带有的,它不像c语言的malloc申请空间后需要Free()函数来释放,而Java中的代码块中所申请的空间可在程序执行完成后自动释放,但是是有局限性的,代码块所占 ...
- 面试官,不要再问我“Java GC垃圾回收机制”了
Java GC垃圾回收几乎是面试必问的JVM问题之一,本篇文章带领大家了解Java GC的底层原理,图文并茂,突破学习及面试瓶颈. 楔子-JVM内存结构补充 在上篇<JVM之内存结构详解> ...
- 【Java学习笔记】Java的垃圾回收机制
搬以前写的博客[2014-12-30 15:07] 以前很少关注内存的问题,基本没有关注,这方面的小白,原因在于自己都是写的自我娱乐的小程序,不关注性能,不是提供服务.而企业级别的应用在程序稳健性方面 ...
- JVM系列(三):java的垃圾回收机制
java垃圾回收机制介绍 上一篇讲述了JVM的内存模型,了解了到了绝大部分的对象是分配在堆上面的,我们在编码的时候并没有显示的指明哪些对象需要回收,但是程序在运行的过程中是会一直创建对象的,之所 ...
- JAVA的垃圾回收机制
1. 垃圾回收的意义 在C++中,对象所占的内存在程序结束运行之前一直被占用,在明确释放之前不能分配给其它对象:而在Java中,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾.JVM的 ...
- 全面分析Java的垃圾回收机制
Java的堆是一个运行时数据区,类的实例(对象)从中分配空间.Java虚拟机(JVM)的堆中储存着正在运行的应用程序所建立的所有对象,这些对象通过new.newarray.anewarray和mult ...
- java JVM垃圾回收机制
Java语言出来之前,大家都在拼命的写C或者C++的程序,而此时存在一个很大的矛盾,C++等语言创建对象要不断的去开辟空间,不用的时候有需要不断的去释放控件,既要写构造函数,又要写析构函数,很多时候都 ...
- Java 的垃圾回收机制(转)
先看一段转载,原文出自 http://jefferent.iteye.com/blog/1123677 虚拟机中的共划分为三个代:年轻代(Young Generation).年老点(Old Gener ...
- Java虚拟机垃圾回收机制
在Java虚拟机中,对象和数组的内存都是在堆中分配的,垃圾收集器主要回收的内存就是再堆内存中.如果在Java程序运行过程中,动态创建的对象或者数组没有及时得到回收,持续积累,最终堆内存就会被占满,导致 ...
随机推荐
- pandas电子表格的读取(pandas中的read_excel)
上面那篇文章中,初步介绍了一个文本文件的读取:接下来介绍另外一种常见的本地数据格式,那就是Excel电子表格,如果读者在学习或者工作中需要使用Python分析某个Excel表格数据,改如何完成第一个的 ...
- 还在问什么是JavaScript构造函数、实例、原型对象以及原型链?看完这篇你就懂
1概述 ES6, 全称 ECMAScript 6.0 ,2015.06 发版.在ES6之前,对象不是基于类创建的,而是用一种称为构造函数的特殊函数来定义对象和它们的特征. 2构造函数 构造函数是一种特 ...
- [PyTorch 学习笔记] 2.1 DataLoader 与 DataSet
thumbnail: https://image.zhangxiann.com/jeison-higuita-W19AQY42rUk-unsplash.jpg toc: true date: 2020 ...
- springboot文件上传(可单文件/可多文件)
获取文件内容,是从InputStream中获取,添加到指定位置的文件 如下所示 public static void getFile(InputStream is,File fileName) thr ...
- JavaScript闭包(内存泄漏、溢出以及内存回收),超直白解析
1 引言 变量作用域 首先我们先铺垫一个知识点--变量作用域: 变量根据作用域的不同分为两种:全局变量和局部变量. 函数内部可以使用全局变量. 函数外部不可以使用局部变量. 当函数执行完毕,本作用域内 ...
- oracle备份之备份测试脚本(冷备、热备、rman)
1.数据库环境 数据库DBID及打开模式SQL> select dbid,open_mode from v$database; DBID OPEN_MODE---------- -------- ...
- ZooKeeper的十二连问,你顶得了嘛?
前言 一线大厂ZooKeeper的十二连问,你顶得了嘛? 本文已经收录到github ❝ https://github.com/whx123/JavaHome ❞ 1. 面试官:工作中使用过Zooke ...
- Java 获取一段时间内的每一天
有时候我们会遇到一些业务场景,需要去获取一段时间内的每一天日期 public static List<Date> findDates(Date dBegin, Date dEnd) { L ...
- Android项目智能机器人的实现,带有源代码,图灵智能机器人,详细讲解。。
大家好,今天给大家推荐一个我利用图灵api制作的android项目,智能机器人,类似智能小冰,等一些会机器人. 下面看效果.女头像是系统自动给你回复的,男头像是你输入的内容.项目源代码是eclipse ...
- SpiderMonkey教程
https://technotales.wordpress.com/2009/06/07/spidermonkey-introduction/ https://developer.mozilla.or ...