一.谁在做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)是一个核心特性,它自动管理内存,使得开发者无需手动释放内存,从而降低了内存泄漏的风险。Java虚拟机(JVM)负责执行垃圾回收,但其工作原理对于优化程序...
在实际开发中,理解这些内存分配原则可以帮助我们有效地管理资源,比如避免内存溢出,优化对象的创建和使用,以及理解和利用垃圾回收机制。Java内存管理是一个深度和广度并存的话题,需要不断学习和实践来提升。
Java内存模型和垃圾回收是Java性能优化的关键环节。本文将简要探讨这两个...总结,Java内存模型和垃圾回收机制确保了程序高效运行的同时避免了内存浪费。理解这两个概念对于编写高性能、健壮的Java应用程序至关重要。
Java虚拟机的垃圾回收机制提供了一种强保证:只要从根引用可以到达的对象,就不会被回收。这意味着只要对象的引用链还存在于执行代码中,那么该对象就会保留在内存中。垃圾回收器何时运行是自动的,通常在内存不足...
其面向对象的特性、丰富的类库和强大的垃圾回收机制,为Web应用提供了稳定和高效的基础。 其次,Servlet和JSP(JavaServer Pages)是Java Web开发的两大核心组件。Servlet是Java编写的服务端程序,负责处理HTTP请求...
JVM的垃圾回收机制会定期检查堆中的对象,以确定哪些可以被回收,从而释放内存资源。 了解Java中的堆和栈内存分配有助于优化程序性能,避免内存泄漏和内存溢出等问题。开发者应当合理使用堆和栈,确保对象的正确...
然而,Java智能卡在安全性方面仍需保证,智能终端需要有能力保障系统内部运行的安全,包括防火墙机制、垃圾自动回收机制和代码校验等。 尽管Java智能卡具有明显的优势,但其技术也存在一些局限性。随着数字信息化...
Java虚拟机(JVM)的垃圾回收(Garbage Collection, GC)是自动管理内存的一种机制,旨在自动识别并释放不再使用的对象,以防止内存泄漏。本文将深入探讨JVM垃圾回收的基本过程,主要包括三个关键步骤:枚举根节点、...
并且,Java内存管理的垃圾回收机制自动处理不再使用的对象,减少了内存泄漏的问题,让开发者可以更专注于业务逻辑。 Java在计算机软件应用上广泛且多样。例如,在企业级应用开发中,Java EE(企业版)提供了一系列...
在安全性方面,Java强调安全编程,例如,它具有内置的内存管理机制,通过垃圾回收自动释放不再使用的内存,避免了C语言中常见的内存泄漏和悬挂指针问题。此外,Java的类型系统和访问控制也减少了错误的可能性。C语言...
Notes 我的笔记: 知识不总结,就会被大脑当...垃圾回收机制的监控 优化垃圾回收机制 Apache的MaxClients参数详解及其在Tomcat执行FullGC时的影响 JavaEE 浅析Web容器 计算机网络 UDP&TCP DB MySQL索引背后的数据结构
3. **Java中的垃圾回收算法**:Java的垃圾回收主要基于分代收集理论,常见的算法有标记-清除、复制、标记-压缩和分代收集。现代JVM如HotSpot采用混合策略,如G1收集器,以提高内存管理效率。 4. **Java IO流相关...
2. JVM:在有限的资源下运行Java代码,支持类装载、垃圾回收等功能,确保代码高效执行。 三、Java智能卡的开发流程 1. 定义需求:明确智能卡需要实现的功能,如电子钱包、加密服务等。 2. 设计Applet:编写符合...
Java作为一门面向对象的高级编程语言,其对象的创建过程是理解Java内存管理机制的重要一环。本文详细解析了Java中对象创建的整个...通过本文,读者可以更深入地理解Java内存管理、垃圾回收以及对象生命周期的各个方面。
垃圾回收机制(Garbage Collection, GC)是JVM中的重要组成部分,主要负责自动回收不再使用的对象占用的内存资源,从而避免内存泄漏等问题。 - **标记-清除算法**:这是最基本的垃圾回收算法,分为标记和清除两个...
然而,直接内存的使用需要额外的注意,因为它不会受到JVM的垃圾回收机制的管理。 #### 四、事件处理机制 Netty的事件处理机制是基于`ChannelHandler`和`ChannelPipeline`实现的。每个`Channel`都有一个对应的`...
在Java编程中,内存泄漏是一个重要的性能问题,它涉及到程序运行时的内存管理和垃圾回收机制。虽然Java的自动内存管理减轻了程序员的负担,但如果不正确地处理对象引用,仍可能导致内存泄漏,进而影响程序的稳定性和...