垃圾回收器GC

java中的垃圾回收机制

JAVA 的一个重要特点就是有垃圾回收器,并且能够自动回收垃圾,这也是java相对与其他语言的有优势的地方,如C语言就没有自动回收垃圾的机制。

java的每一个实例对象和数组都是在对堆里面分配空间的,解释器具有为类实例分配空间的工作能力,在解释器为一个实例分配完存储空间时,就会记录该实例对象所占用的内存区域的使用,一旦对象使用完毕之后,就会被回收到垃圾中!

在java语言中,出来new语句外没有其他方法为一个对象申请和释放内存,对内存的释放和回收的工作是有java运行系统承担的。在SUN公司开发的java解释器和Hot java 环境中,碎片回收后后台线程回收的方式来执行,这样子不但为系统提供良好的性能还使我们程序员摆脱了自己控制内存使用的风险。java的自动垃圾回收功能解决了两个最常见的应用程序错误:内存外露和无效内存的引用。

清理垃圾数据的重要性常常会被程序员忽视,这是很危险的,这些会导致垃圾占据系统资源,一直到内存耗尽。java提供了一种叫做垃圾回收的机制来避免程序员忽略垃圾的处理,java自动帮我们完成垃圾回收的工作,而不需要程序员再去考虑。

在java程序运行的时候,一个垃圾回收机器会不定时的被唤醒来检查是否有不再被用到的对象,并将其回收然后释放资源(空间),但垃圾回收机制的启动不受我们程序员的控制,有可能一个程序到运行完时,垃圾回收器都没有被启动。所以这个不是一个很可靠的机制,但这也不是什么坏事,因为垃圾回收机制会给系统资源带来额外的负担。启动的几率越小,带来的额外负担就越少。

不同的java虚拟机采用不同的回收策略:1.复制式 2.自省式

1.复制式:就是将在运行的程序暂停,将正在被使用的所有对象复制到另一个堆内存,那些不被使用的内存就会被释放掉。

这种复制方式需要维护所需内存数量的两倍的内存空间,即使你的垃圾很少,也会把堆内存的内容复制到另外一块堆内存中,这使得这种策略的效率低下。

2.自省式:

自省式回收器会检测所有正在被使用的对象,然后将其做标记,完成任务后将所有不再被使用的对象所占据的空间一次释放。但这样的方式速度很慢,不过如果程序的垃圾很少的话,这样的策略就很有优势了。

所以可以将两中方法结合起来使用,在一些jvm中两种方式有机的结合起来运用,在实际应用中,jvm会监督这两只模式的运作效率,如果程序中的对象长期被使用,JVM就会转换到“自省模式”回收模式,而当产生大量垃圾或者对象多占用的内存不连续的情况严重的时,又会转换至“复制式”模式,如此循环。实现两种机制交换。

时间: 2024-10-22 17:33:05

垃圾回收器GC的相关文章

C# 托管堆和垃圾回收器GC

这里我们讨论的两个东西:托管堆和垃圾回收器,前者是负责创建对象并控制这些对象的生存周期,后者负责回收这些对象. 一.托管堆分配资源 CLR要求所有的对象都从托管堆分配.进程初始化时,CLR划出一个地址空间区域作为托管堆.CLR还要维护一个指针P,该指针指向下一个对象在堆中的分配位置. 那么我们进一步深入看看创建一个对象(也就是new 一个对象)时CLR做了哪些工作呢. 1.计算类型字段需要的字节数. 2.加上对象开销所需要的字节数,每个对象都有两个开销:类型对象指针和同步块索引 3.CLR检查区

Java GC 垃圾回收器的类型小结

阅读了java paper的垃圾回收器类型文章,在此做一个小结,文章部分翻译自java paper gc collector,部分自己做的总结,图片来自网络,在此仅用作理解表达之用. 一.JVM GC 垃圾回收器类型 JVM的垃圾回收器大致分为四种类型: (图片来自网络) 1.串行垃圾回收器  Serial Garbage Collector 串行垃圾回收器在进行垃圾回收时,它会持有所有应用程序的线程,冻结所有应用程序线程,使用单个垃圾回收线程来进行垃圾回收工作. 串行垃圾回收器是为单线程环境而

Java GC系列(3):垃圾回收器种类

本文由 ImportNew - 好好先生 翻译自 javapapers. 目录 垃圾回收介绍 垃圾回收是如何工作的? 垃圾回收的类别 垃圾回收监视和分析 在这篇教程中我们将学习几种现有的垃圾回收器.在Java中,垃圾回收是一个自动的进程可以替代程序员进行内存的分配与回收这些复杂的工作.这篇是垃圾回 收教程系列的第三篇,在前面的第2部分我们看到了在Java中垃圾回收是如何工作的,那是篇有意思的文章,我推荐你去看一下.第一部分介绍了Java的垃 圾回收,主要有JVM体系结构,堆内存模型和一些Java

[Java基础]-- Java GC 垃圾回收器的分类和优缺点

https://blog.csdn.net/high2011/article/details/80177473?utm_source=blogxgwz2 所属专栏: Java 版权声明:尊重原创,转载请标明,本文转自 https://blog.csdn.net/high2011/article/details/80177473 关于Java的垃圾回收器,一直是个头疼的问题,这里简要说明下分类和优缺点,供选择使用. 一.JVM GC 垃圾回收器类型 JVM的垃圾回收器大致分为六种类型: 1.串行:

JVM 垃圾回收器工作原理及使用实例介绍(转载自IBM),直接复制粘贴,需要原文戳链接

原文 https://www.ibm.com/developerworks/cn/java/j-lo-JVMGarbageCollection/ 再插一个关于线程和进程上下文,待判断 http://blog.sina.com.cn/s/blog_75e9551f01016cm3.html 垃圾收集基础 Java 语言的一大特点就是可以进行自动垃圾回收处理,而无需开发人员过于关注系统资源,例如内存资源的释放情况.自动垃圾收集虽然大大减轻了开发人员的工作量,但是也增加了软件系统的负担. 拥有垃圾收集

Java虚拟机解析篇之---垃圾回收器

上一篇说了虚拟机的内存模型,在说到堆内存的时候我们提到了,堆内存是Java内存中区域最大的一部分,而且垃圾回收器主要就是回收这部分的内容.那么这篇就来介绍一下垃圾回收器的原理以及回收的算法. Java中的垃圾回收器(GC)是Java中比较有特色的一点,不需要我们手动的去管理一个对象,不想C++中的构造函数和析构函数一样,需要程序猿自己去手动的管理,很容易造成内存泄露的问题.当然如果学过OC语言的话,我们知道OC语言中有自动释放池的概念,当然我们使用retain/release进行手动管理对象的.

JVM垃圾回收器工作原理及使用实例介绍

垃圾收集基础 Java 语言的一大特点就是可以进行自动垃圾回收处理,而无需开发人员过于关注系统资源,例如内存资源的释放情况.自动垃圾收集虽然大大减轻了开发人员的工作量,但是也增加了软件系统的负担. 拥有垃圾收集器可以说是 Java 语言与 C++语言的一项显著区别.在 C++语言中,程序员必须小心谨慎地处理每一项内存分配,且内存使用完后必须手工释放曾经占用的内存空间.当内存释放不够完全时,即存在分配但永不释放的内存块,就会引起内存泄漏,严重时甚至导致程序瘫痪. 以下列举了垃圾回收器常用的算法及实

垃圾回收器种类

在这篇教程中我们将学习几种现有的垃圾回收器.在Java中,垃圾回收是一个自动的进程可以替代程序员进行内存的分配与回收这些复杂的工作.这篇是垃圾回 收教程系列的第三篇,在前面的第2部分我们看到了在Java中垃圾回收是如何工作的,那是篇有意思的文章,我推荐你去看一下.第一部分介绍了Java的垃 圾回收,主要有JVM体系结构,堆内存模型和一些Java术语. Java有四种类型的垃圾回收器: 串行垃圾回收器(Serial Garbage Collector) 并行垃圾回收器(Parallel Garba

JVM 垃圾回收器工作原理及使用实例介绍

垃圾收集基础 Java 语言的一大特点就是可以进行自动垃圾回收处理,而无需开发人员过于关注系统资源,例如内存资源的释放情况.自动垃圾收集虽然大大减轻了开发人员的工作量,但是也增加了软件系统的负担. 拥有垃圾收集器可以说是 Java 语言与 C++语言的一项显著区别.在 C++语言中,程序员必须小心谨慎地处理每一项内存分配,且内存使用完后必须手工释放曾经占用的内存空间.当内存释放不够完全时,即存在分配但永不释放的内存块,就会引起内存泄漏,严重时甚至导致程序瘫痪. 以下列举了垃圾回收器常用的算法及实