GC之我见:
在java中内存释放是由java虚拟机来完成的,只需要在使用时申请空间就行,而不需要考虑回收的事。具体的话,jvm中垃圾回收机制有很多种,其中最主要的一个算法叫做引用计数法。在java世界里,内存主要的分为两个部分,一个是堆,一个是栈,当new一个对象时,我们一般会把对象存到堆中,而对对象的引用放到栈里。当对某个对象的引用增加时,计数器就加1,减少时计数器就减掉1.当检测到计数器为0时,表示该对象不再使用时,java虚拟机会自动将其回收。
当然jvm也不是对计数器为0的立即回收,只是把它回收队列里面去。Java虚拟机中还有其他的相关算法会权衡一下它的时间与空间方面的问题,所以不会立即回收他。有时候我们确定一个对象已经使用完后,我们也可以通过system。Gc()来加速该对象的回收。
Jvm垃圾回收很方便,但是也有他自身的缺点,负责垃圾回收的线程优先级是10,在java中属于最低的优先级,由于他不能够对不再使用的对象立即回收,有时候也会产生内存泄露的问题,所有我们在编码过程中,可以有两种方法加快它的回收。一种方法就是,对一个对象使用完成后,将这个对象设计为null值,这样jvm会很快的对其进行回收。还有一个就是使用system。Gc()能够加重该对象被回收的权重,从而加快它的回收。
一.谁在做Garbage Collection?
在C++里,释放内存是手动处理的,要用delete运算符来释放分配的内存。这是流行的说法。确切地说,是应用认为不需要某实体时,就需用delete告诉系统,可以回收这块空间了。这个要求,对编码者来说,是件很麻烦、很难做到的事。随便上哪个BBS,在C/C++版块里总是有一大堆关于内存泄漏的话题。
Java采用一种不同的,很方便的方法:Garbage Collection。Java垃圾回收机制放在JVM里。JVM完全负责垃圾回收事宜,应用只在需要时申请空间,而在抛弃对象时不必关心空间回收问题。
二.对象在啥时被丢弃?
在C++里,当对象离开其作用域时,该对象即被应用抛弃。
是对象的生命期不再与其作用域有关,而仅仅与引用有关。
Java的垃圾回收机制一般包含近十种算法。对这些算法中的多数,我们不必予以关心。只有其中最简单的一个:引用计数法,与编码有关。
一个对象,可以有一个或多个引用变量指向它。当一个对象不再有任何一个引用变量指向它时,这个对象就被应用抛弃了。或者说,这个对象可以被垃圾回收机制回收了。
这就是说,当不存在对某对象的任何引用时,就意味着,应用告诉JVM:我不要这个对象,你可以回收了。
JVM的垃圾回收机制对堆空间做实时检测。当发现某对象的引用计数为0时,就将该对象列入待回收列表中。但是,并不是马上予以销毁。
三.丢弃就被回收?
该对象被认定为没有存在的必要了,那么它所占用的内存就可以被释放。被回收的内存可以用于后续的再分配。
但是,并不是对象被抛弃后当即被回收的。JVM进程做空间回收有较大的系统开销。如果每当某应用进程丢弃一个对象,就立即回收它的空间,势必会使整个系统的运转效率非常低下。
前面说过,JVM的垃圾回收机制有多个算法。除了引用计数法是用来判断对象是否已被抛弃外,其它算法是用来确定何时及如何做回收。JVM的垃圾回收机制要在时间和空间之间做个平衡。
因此,为了提高系统效率,垃圾回收器通常只在满足两个条件时才运行:即有对象要回收且系统需要回收。切记垃圾回收要占用时间,因此,Java运行时系统只在需要的时候才使用它。因此你无法知道垃圾回收发生的精确时间。
四.没有引用变量指向的对象有用吗?
前面说了,没挂上引用变量的对象是被应用丢弃的,这意味着,它在堆空间里是个垃圾,随时可能被JVM回收。
不过,这里有个不是例外的例外。对于一次性使用的对象(有些书称之为临时对象),可以不用引用变量指向它。举个最简单也最常见的例子:
System.out.println(“I am Java!”);
就是创建了一个字符串对象后,直接传递给println()方法。
五.应用能干预垃圾回收吗?
许多人对Java的垃圾回收机制不放心,希望在应用代码里控制JVM的垃圾回收运作。这是不可能的事。对垃圾回收机制来说,应用只有两个途径发消息给JVM。第一个前面已经说了,就是将指向某对象的所有引用变量全部移走。这就相当于向JVM发了一个消息:这个对象不要了。第二个是调用库方法System.gc(),多数书里说调用它让Java做垃圾回收。
第一个是一个告知,而调用System.gc()也仅仅是一个请求。JVM接受这个消息后,并不是立即做垃圾回收,而只是对几个垃圾回收算法做了加权,使垃圾回收操作容易发生,或提早发生,或回收较多而已。
希望JVM及时回收垃圾,是一种需求。其实,还有相反的一种需要:在某段时间内最好不要回收垃圾。要求运行速度最快的实时系统,特别是嵌入式系统,往往希望如此。
Java的垃圾回收机制是为所有Java应用进程服务的,而不是为某个特定的进程服务的。因此,任何一个进程都不能命令Java垃圾回收机制做什么、怎么做或做多少。
六.对象被回收时要做的事
一个对象在运行时,可能会有一些东西与其关连。因此,当对象即将被销毁时,有时需要做一些善后工作。可以把这些操作写在finalize()方法(常称之为终止器)里。
protected void finalize()
{
// finalization code here
}
这个终止器的用途类似于C++里的析构函数,而且都是自动调用的。但是,两者的调用时机不一样,使两者的表现行为有重大区别。C++的析构函数总是当对象离开作用域时被调用。这就是说,C++析构函数的调用时机是确定的,且是可被应用判知的。但是,Java终止器却是在对象被销毁时。由上所知,被丢弃的对象何时被销毁,应用是无法获知的。而且,对于大多数场合,被丢弃对象在应用终止后仍未销毁。
在编码时,考虑到这一点。譬如,某对象在运作时打开了某个文件,在对象被丢弃时不关闭它,而是把文件关闭语句写在终止器里。这样做对文件操作会造成问题。如果文件是独占打开的,则其它对象将无法访问这个文件。如果文件是共享打开的,则另一访问该文件的对象直至应用终结仍不能读到被丢弃对象写入该文件的新内容。
至少对于文件操作,编码者应认清Java终止器与C++析构函数之间的差异。
那么,当应用终止,会不会执行应用中的所有finalize()呢?据Bruce Eckel在Thinking in Java里的观点:“到程序结束的时候,并非所有收尾模块都会得到调用”。这还仅仅是指应用正常终止的场合,非正常终止呢?
因此,哪些收尾操作可以放在finalize()里,是需要酌酎的。
分享到:
相关推荐
在Java开发过程中,垃圾回收(Garbage Collection, GC)是管理内存资源的关键技术之一。合理的GC配置可以显著提高应用程序的性能和稳定性。本指南旨在帮助开发者深入理解Java GC的工作原理,并提供一系列调优策略与...
Java的GC机制是确保程序稳定运行的关键因素之一。通过对GC原理的理解和合理配置,开发者可以有效地管理Java应用的内存使用,提高应用的性能和稳定性。无论是增量式GC还是分代收集策略,都是为了更好地适应不同应用...
Java垃圾收集(GC)专题针对的是Java编程语言中内存管理机制的重要组成部分。Java自1996年推出以来,其最大的改进之一就是引入了受管内存。在Java之前,C和C++语言中的内存泄漏问题十分常见,这导致开发稳定和安全的...
Java垃圾回收(GC)机制是Java编程语言中的一个重要特性,它自动管理程序的内存空间,负责识别并清除不再使用的对象,以防止内存泄漏。本文将深入探讨Java GC的工作原理、类型、过程以及优化策略。 一、Java垃圾...
《Java技术指南2019》是一本全面的Java技术书籍,它系统地介绍了Java语言及相关技术。该书分为基础篇、进阶篇、高级篇、架构篇和拓展篇五个部分,覆盖了Java编程的多个层面,包括Java虚拟机(JVM)的深入理解、Java...
【Java技术文档PDF】是一份专门针对Java编程语言的技术性文档,它包含了广泛而深入的Java知识,旨在帮助读者理解并掌握这一强大的编程工具。这份文档可能是由董浏榆编撰或整理的,标签中的“PDF”表明了文档的格式,...
总之,监控Java垃圾回收是一个复杂但必要的过程,需要综合运用各种工具、技术和实践经验。通过深入理解GC的工作原理,调整合适的GC策略,以及优化代码,开发者可以提升应用的性能和稳定性,成为一名真正的Java GC...
### Java的垃圾收集器(GC)详解 #### 引言 垃圾收集器(Garbage Collector,简称GC)是Java语言的一项重要特性,它自动化管理内存,...随着Java技术的不断演进,GC也将持续优化,为开发者带来更加便捷的开发体验。
【JAVA·初级】GC垃圾回收机制是Java编程中一个至关重要的概念,对于任何Java开发者来说,理解并掌握这一机制都是提升程序性能的关键。在Java中,内存管理主要依赖于垃圾回收器(Garbage Collector,简称GC),它...
"java技术支持面试题" 在 Java 技术支持面试中,面试官通常会考察应届毕业生的基础知识和实际操作能力。本文档将总结一些常见的 Java 面试题,涵盖了 Java 基础、SSH、上机面试题等多方面的知识点。 一、 Java ...
Java技术文章总结,涵盖了许多Java开发中的核心概念和实践技巧,是学习和提升Java技能的重要资源。以下是对这些文章主题的详细解读: 1. **Java基础** - 类与对象:Java是一种面向对象的语言,理解类和对象的概念...
Java技术内幕涵盖了许多核心主题,包括Java虚拟机(JVM)、服务器端应用容器、网络访问以及内容分发网络(CDN)技术。这些是构建高效、可扩展且可靠的分布式系统的关键组成部分。以下是对这些主题的深入分析: 1. *...
Java的垃圾收集(GC)机制是Java编程中的一个重要概念,它是Java虚拟机(JVM)自动管理内存的主要方式。GC的主要目标是识别并回收不再使用的对象,以避免内存泄漏,并整理堆内存,防止碎片产生,从而确保Java应用...
java -jar gcviewer_1.3.4.jar gc.log 或者 java -jar gcviewer_1.3.4.jar gc.log summary.csv chart.png 其中; gc.log 是截取的一部分样本日志文件; 建议使用你自己的日志。 GCViewer官网: ...
垃圾收集(Garbage Collection,简称GC)是Java虚拟机(JVM)自动管理内存的重要功能之一。通过自动识别并回收不再使用的对象所占用的内存空间,GC极大地简化了开发者的编程工作,避免了手动内存管理可能带来的内存...
《Java技术面试宝典2020版》是一本针对Java程序员面试精心编撰的指南,旨在帮助求职者全面掌握Java技术,顺利通过面试。这本书的内容涵盖了Java编程的基础知识、进阶技能以及与面试密切相关的实战技巧。标签“java ...
在Java技术面试中,面试官通常会关注求职者的基础知识、编程能力、设计模式、并发处理、内存管理、框架应用等多个方面。以下是一些可能的面试题及其详细解答,帮助你准备即将到来的Java技术面试。 1. **Java基础** ...
10. **Java内存模型和垃圾回收**:解析Java内存区域,探讨对象的生命周期,以及GC的工作原理和性能优化。 11. **IO流新特性NIO**:介绍非阻塞I/O,Channel、Buffer和Selector等NIO核心组件,以及NIO在高并发场景下...