关于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程序运行过程中,动态创建的对象或者数组没有及时得到回收,持续积累,最终堆内存就会被占满,导致 ...
随机推荐
- 虚拟化技术之kvm镜像模板制作工具virt-sysprep
virt-sysprep这个工具来自libguest-tools这个工具包,它能够把kvm虚拟机对应的磁盘文件做成一个模板,后续我们启动虚拟机就可以基于这个镜像模板启动:什么是镜像模板呢?所谓模板就是 ...
- 关于c++11 memory order的理解
关于C++memory_order的理解 看了c++并发编程实战的内存模型部分后,一直对memory_order不太懂,今天在知乎发现了百度的brpc,恰好有关于原子操作的文档,感觉解释的很好.为了加 ...
- 玩转Spring——Spring IOC/DI
什么是IOCioc :Inversion of Control,即控制反转. 它不是一种技术,而是一种设计思想,即java程序中获取对象的方式发生反转,由最初的new方式创建,转变成由第三方框架创建. ...
- 迷上我成真恋爱学心理学挽回她PDF文档资料完整版情感技巧脱单教程
迷上我成真恋爱学心理学挽回她PDF文档资料完整版情感技巧脱单教程 成真迷上我偷听女人心挽回她课程 百度网盘迷上我教程pdf地址 百度网盘挽回她教程pdf+视频的地址 备用地址淘宝百度网盘发货地址 百度 ...
- nodejs打包成桌面程序(exe)的进阶之路
nodejs打包成桌面程序(exe)的进阶之路 node js bat 前端 计划任务 前言:最近的研究,请大佬们细品 第一篇 - 任务计划程序篇 说真的研究到将nodejs打包成可执行的exe文件是 ...
- Android开发之AlertDialog警告提示框删除与取消 详解代码
package cc.jiusansec.www; import android.app.Activity; import android.app.AlertDialog; import androi ...
- Idea使用方式——创建类模板
问题:创建类或接口时,要添加自定义的默认注释,比如版本,时间等.每个类修改显然不符合程序员的思路,有没有办法通过定义模板来实现? 使用Idea模板 Idea可听过创建类模板来实现. 功能路径:Sett ...
- SplashImage
关于Unity启动时间过长(启动黑屏时间长)的问题 https://blog.csdn.net/h5q8n2e7/article/details/50484458 Unity3D游戏开发之“重写Uni ...
- Unity Job System
https://docs.unity3d.com/Manual/JobSystem.html https://github.com/Unity-Technologies/EntityComponent ...
- java中变量在内存的位置
package day02; /* * 成员变量:在堆内存中,因为对象的存在,才在内存中存在:作用于整改类中 * 局部变量:在栈内存中:作用于函数中,或者语句中 * */ class car{ //描 ...