Java 垃圾收集器
zgc 调优参数 -回复

zgc 调优参数-回复ZGC是一种用于Java应用程序的垃圾收集器,它的设计目标是在不超过10ms的停顿时间下,尽可能减少应用程序的吞吐量下降。
在实际应用中,通过调整ZGC的一些优化参数,可以进一步改善其性能和吞吐量。
本文将一步一步地介绍ZGC调优参数,并探讨如何选择和优化这些参数来改善性能。
第一步:理解ZGC调优参数在开始调优之前,我们首先需要了解ZGC的一些基本调优参数。
这些参数通常可以在JVM启动时通过命令行选项或配置文件来设置。
以下是一些常用的ZGC调优参数:1. -Xmx:设置应用程序堆的最大大小。
根据应用程序的需求和可用的系统内存,可以适当调整此参数。
2. -Xms:设置应用程序堆的初始大小。
与-Xmx一起设置,以确保应用程序在启动时拥有足够的内存空间。
3. -XX:ConcGCThreads:设置并发垃圾收集器的线程数量。
可以根据系统的CPU核心数来调整此参数,以获得更好的性能。
4. -XX:MaxGCPauseMillis:设置垃圾收集器的最大停顿时间。
可以根据应用程序的需求来调整此参数,以平衡停顿时间和吞吐量。
5. -XX:ParallelGCThreads:设置并行垃圾收集器的线程数量。
可以根据系统的CPU核心数来调整此参数,以提高并行垃圾收集的效率。
第二步:选择适当的调优参数一旦了解了ZGC的基本调优参数,我们就可以根据应用程序的需求和系统的硬件配置来选择适当的参数。
1. 调整堆大小:在选择-Xmx和-Xms参数时,需要考虑应用程序的内存需求和系统的可用内存。
如果应用程序需要更多的内存空间,可以增加-Xmx参数的值。
但是,需要注意不要将堆大小设置得过大,以避免导致内存不足或频繁的垃圾收集。
2. 并发和并行线程数量:根据系统的CPU核心数,可以调整并发垃圾收集器和并行垃圾收集器的线程数量。
通常情况下,可以将并发线程数量设置为CPU核心数的一半,将并行线程数量设置为CPU核心数的四分之一。
javaGC垃圾回收机制G1、CMS

javaGC垃圾回收机制G1、CMSCMS(Concurrent Mark-Sweep)是以牺牲吞吐量为代价来获得最短回收停顿时间。
对于要求服务器响应速度的应⽤上,这种垃圾回收器⾮常适合。
在启动JVM参数加上-XX:+UseConcMarkSweepGC ,这个参数表⽰对于⽼年代的回收采⽤CMS。
CMS采⽤的基础算法是:标记—清除。
使⽤场景:1、应⽤程序对停顿⽐较敏感,并且在应⽤程序运⾏的时候可以提供更⼤的内存和更多的CPU2、在JVM中,有相对较多存活时间较长的对象(⽼年代⽐较⼤)会更适合使⽤CMS。
为解决CMS算法产⽣空间碎⽚和其它⼀系列的问题缺陷,HotSpot提供了另外⼀种垃圾回收策略,G1(Garbage First)算法,通过参数-XX:+UseG1GC来启⽤,该算法在JDK 7u4版本被正式推出,G1垃圾收集算法主要应⽤在多CPU⼤内存的服务中,在满⾜⾼吞吐量的同时,竟可能的满⾜垃圾回收时的暂停时间,下⾯是官⽅介绍:The Garbage-First (G1) collector is a server-style garbage collector, targeted for multi-processor machines with large memories.It meets garbage collection (GC) pause time goals with a high probability, while achieving high throughput. The G1 garbagecollector is fully supported in Oracle JDK 7 update 4 and later releases. The G1 collector is designed for applications that:Can operate concurrently with applications threads like the CMS collector.Compact free space without lengthy GC induced pause times.Need more predictable GC pause durations.Do not want to sacrifice a lot of throughput performance.Do not require a much larger Java heap.G1采⽤了另外⼀种完全不同的⽅式组织堆内存,堆内存被划分为多个⼤⼩相等的内存块(Region),每个Region是逻辑连续的⼀段内存,G1中提供了三种模式垃圾回收模式,young gc、mixed gc 和 full gc,在不同的条件下被触发。
java gc 面试题

java gc 面试题JVM(Java Virtual Machine,Java虚拟机)是Java程序运行的环境,其中的垃圾收集(Garbage Collection,GC)是Java的一项重要特性。
GC负责回收Java程序中不再使用的内存,确保内存的有效利用和程序的性能。
对于JVM相关岗位的应聘者来说,掌握GC的原理和常见问题是非常重要的。
本文将介绍一些常见的Java GC面试题,帮助读者更好地准备面试。
一、什么是Java垃圾收集(GC)?GC是JVM自动管理内存的机制,它负责回收程序运行过程中产生的垃圾对象。
在Java中,无需手动申请和释放内存,GC会自动判断哪些对象不再被程序使用,然后进行回收,释放其占用的内存空间。
通过垃圾收集器的工作,Java程序的开发者可以更专注于业务逻辑的实现,而无需过多关注内存问题。
二、Java中的垃圾收集算法有哪些?请简要介绍其中几种。
1. 标记-清除算法(Mark and Sweep):该算法分为两个阶段,首先标记出所有需要被回收的对象,然后统一回收这些对象。
标记-清除算法存在效率问题,因为回收操作会造成内存碎片,影响程序运行性能。
2. 复制算法(Copying):该算法将内存空间一分为二,每次只使用其中一半。
当一半内存空间使用满后,将存活的对象复制到另一半空闲的内存空间中,并清空使用过的空间。
复制算法的优点是简单高效,但缺点是浪费一半的内存空间。
3. 标记-压缩算法(Mark and Compact):该算法从根节点开始标记存活对象,然后将存活对象压缩到内存空间的一端,清理压缩区域外的内存空间。
标记-压缩算法是一种解决内存碎片问题的有效方法。
三、Java中常用的垃圾收集器有哪些?请列举几种,并简要介绍其特点。
1. Serial收集器:Serial收集器是一种单线程的收集器,它只使用一个线程进行垃圾收集工作。
在新生代使用复制算法,老年代使用标记-压缩算法。
Serial收集器适用于单核CPU的环境,简单高效。
JVM常用参数设置(针对G1GC)

JVM常用参数设置(针对G1GC)Java虚拟机(JVM)是Java程序的运行环境,在JVM中,存在很多参数可以对其进行配置以优化Java应用程序的性能。
本文将介绍G1GC垃圾收集器常用的JVM参数设置。
G1GC(Garbage-First Garbage Collector)是JVM中的一种垃圾收集器,它是在Java 7 update 4之后引入的,并在Java 9中成为默认垃圾收集器。
G1GC的目标是为了更好地处理大内存的堆和长暂停时间,通过将堆内存划分成多个小区域(Region),并使用多线程来并行扫描、标记和压缩堆内存中的垃圾对象。
以下是一些常用的JVM参数设置,可以针对G1GC进行调整:1. -Xms:设置JVM的初始堆内存大小。
例如,-Xms2g将初始堆内存设置为2GB。
2. -Xmx:设置JVM的最大堆内存大小。
例如,-Xmx8g将最大堆内存设置为8GB。
3. -XX:+UseG1GC:启用G1GC垃圾收集器。
4. -XX:MaxGCPauseMillis:设置G1GC的最大垃圾收集停顿时间(单位:毫秒)。
默认值为200毫秒,可以根据实际需求进行调整。
较大的值可以减少垃圾收集的频率,但也会增加每次垃圾收集的停顿时间。
5. -XX:G1HeapRegionSize:设置G1GC中每个Region的大小。
默认值为堆内存的1/2048、较小的Region可以提高并行性和垃圾收集的效率,但同时也会增加垃圾收集器的元数据开销。
6. -XX:InitiatingHeapOccupancyPercent:设置G1GC开始执行垃圾收集的堆占用比例。
默认值为45%,当堆的占用率达到该比例时,G1GC将开始执行垃圾收集。
可以根据应用程序的内存使用情况进行调整。
7. -XX:ConcGCThreads:设置G1GC的并发垃圾收集线程数。
默认值为根据CPU核数动态计算的值。
可以根据实际硬件环境进行调整,较多的线程可以提高并发性能。
gc4653参数

gc4653参数1. 什么是gc4653参数?gc4653参数是一种用于垃圾回收(Garbage Collection)的参数。
在计算机科学中,垃圾回收是一种自动处理内存管理的技术,它通过识别和释放不再使用的内存,以便使其可供其他程序使用。
gc4653参数是Java虚拟机(JVM)中的一个配置选项,用于调整垃圾回收器的行为。
2. gc4653参数的作用gc4653参数可以影响Java程序中垃圾回收器的行为,从而优化内存管理和性能。
具体来说,gc4653参数可以控制以下几个方面:2.1 垃圾回收器类型Java虚拟机有多种不同类型的垃圾回收器可供选择,如Serial、Parallel、CMS (Concurrent Mark Sweep)和G1(Garbage First)等。
通过设置gc4653参数,可以指定使用哪种垃圾回收器。
2.2 垃圾回收器运行时相关配置除了选择垃圾回收器类型外,还可以通过设置gc4653参数来调整垃圾回收器的运行时相关配置。
例如,可以设置堆大小、年轻代大小、老年代大小等。
2.3 垃圾回收算法和策略垃圾回收器使用不同的算法和策略来识别和回收垃圾对象。
通过设置gc4653参数,可以选择不同的垃圾回收算法和策略,以适应不同类型的应用程序和内存需求。
2.4 垃圾回收器日志和统计信息gc4653参数还可以用于配置垃圾回收器的日志记录和统计信息。
通过设置合适的参数,可以获得有关垃圾回收器运行情况的详细信息,以便进行性能优化和故障排查。
3. 如何设置gc4653参数?要设置gc4653参数,需要在Java虚拟机启动时通过命令行或配置文件进行配置。
下面是一些常见的设置方法:3.1 命令行参数可以使用以下命令行参数来设置gc4653参数:java -XX:gc4653=参数值 YourProgram其中-XX:gc4653=参数值表示设置gc4653参数的值。
3.2 配置文件也可以在Java虚拟机的配置文件中设置gc4653参数。
JVM的7种垃圾回收器(小结)

JVM的7种垃圾回收器(⼩结)垃圾回收算法和垃圾回收器对于JVM的垃圾回收算法有复制算法、标记清除、标记整理。
⽤阳哥的话就是:这些算法只是天上飞的理念,是⼀种⽅法论,但是真正的垃圾回收还需要有落地实现,所以垃圾回收器应运⽽⽣。
JVM回收的区域包括⽅法区和堆,jvm对于不同区域不同的特点采⽤分代收集算法,⽐如因为所有的对象都是在Eden区进⾏分配,并且⼤部分对象的存活时间都不长,都是“朝⽣⼣死”的,每次新⽣代存活的对象都不多,所以新采取复制算法;⽽jvm默认是新⽣代的对象熬过15次GC才能进⼊⽼年代,所以⽼年代的对象都是⽣命周期⽐较长的,采⽤标记清除或者标记整理算法。
那么对于这些算法的实现都有什么呢?新⽣代:serial、ParNew、Parallel⽼年代:Serial Old、Parallel Old、CMS全堆:G1并且他们的搭配组合如下:垃圾回收器jvm的垃圾回收器⼤体上的分类主要包括四种:串⾏、并⾏、并发(CMS)和G1。
串⾏垃圾回收器(Serial):它为单线程环境设计并且只使⽤⼀个线程进⾏垃圾回收,会暂停所有的⽤户线程。
所以不适合服务器环境。
并⾏垃圾回收器(Parallel):多个垃圾回收线程并⾏⼯作,此时⽤户线程是暂停的,适⽤于科学计算/⼤数据处理等弱交互场景。
并发垃圾回收器(CMS):⽤户线程和垃圾收集线程同时执⾏(不⼀定是并⾏,可能交替执⾏),不需要停顿⽤户线程。
互联⽹公司多⽤它,适⽤于对响应时间有要求的场景。
G1垃圾回收器:G1垃圾回收器将堆内存分割成不同的区域然后并发的对其进⾏垃圾回收。
默认的垃圾回收器平时我们没有配置什么jvm参数,程序也能正常执⾏,那么JVM默认的垃圾回收器是什么呢?那么如何查看默认的回收器呢?有很多⽅式,这⾥简单列举⼏种:1.命令⾏⽅式:1java -XX:+PrintCommandLineFlags -version可以看到jdk8默认的是使⽤的Parallel并⾏回收器。
java清除实例的方法

java清除实例的方法Java是一种面向对象的编程语言,它提供了一种清除实例的方法,以便在不再需要对象时释放内存和资源。
在本文中,我们将讨论几种常用的方法来清除Java实例。
一、设置引用为null在Java中,当一个对象不再被引用时,垃圾收集器会自动回收它所占用的内存。
因此,将对象的引用设置为null是一种常用的清除实例的方法。
例如,当一个对象的生命周期结束后,可以将其引用设置为null,以便垃圾收集器可以回收它所占用的内存。
二、使用垃圾收集器Java的垃圾收集器负责回收不再被引用的对象。
垃圾收集器会自动扫描程序中的对象,并释放那些不再被引用的对象所占用的内存。
使用垃圾收集器可以大大减少内存泄漏的风险。
可以通过调用System.gc()方法来显式地触发垃圾收集器的工作。
三、关闭资源在Java中,一些对象可能会占用系统资源,如文件、数据库连接等。
为了确保这些资源能够及时释放,我们需要在不再使用这些对象时手动关闭它们。
例如,在使用完文件流时,可以调用close()方法关闭文件流,以释放系统资源。
四、使用try-with-resources语句Java 7引入了try-with-resources语句,可以自动关闭实现了AutoCloseable接口的对象。
这样,我们就能够在代码块结束时自动清除实例,并释放相关资源,而无需手动调用close()方法。
这种方式可以提高代码的可读性和维护性。
五、手动清除对象在某些情况下,我们可能需要手动清除对象,以确保及时释放内存和资源。
可以通过实现finalize()方法来实现手动清除对象。
在对象被垃圾收集器回收之前,会调用finalize()方法进行清理操作。
然而,由于finalize()方法的调用时间是不确定的,所以不建议过度依赖它。
六、使用弱引用Java提供了一种特殊的引用类型——弱引用。
弱引用是一种较弱的引用,当对象只被弱引用引用时,垃圾收集器会自动回收它。
使用弱引用可以在一些特定的场景中清除实例,如缓存等。
Java8的GC垃圾回收

Java8的GC垃圾回收Java垃圾回收概况Java GC(Garbage Collection,垃圾回收)机制,是Java与C++/C的主要区别之⼀,作为Java开发者,⼀般不需要专门编写内存回收和垃圾清理代码,对内存泄露和溢出的问题,也不需要像C程序员那样战战兢兢。
这是因为在Java虚拟机中,存在⾃动内存管理和垃圾清扫机制。
概括地说,该机制对JVM中的内存进⾏标记,并确定哪些内存需要回收,根据⼀定的回收策略,⾃动的回收内存,永不停息的保证JVM 中的内存空间,防⽌出现内存泄露和溢出问题。
关于JVM,需要说明⼀下的是,⽬前使⽤最多的Sun公司的JDK中,⾃从1999年的JDK1.2开始直⾄现在仍在⼴泛使⽤的JDK6,其中默认的虚拟机都是HotSpot。
2009年,Oracle收购Sun,加上之前收购的EBA公司,Oracle拥有3⼤虚拟机中的两个:JRockit和HotSpot,Oracle也表明了想要整合两⼤虚拟机的意图,但是⽬前在新发布的JDK8中,默认的虚拟机仍然是HotSpot,因此本⽂中默认介绍的虚拟机都是HotSpot,相关机制也主要是指HotSpot的GC机制。
Java GC机制主要完成3件事:确定哪些内存需要回收确定什么时候需要执⾏GC如何执⾏GC经过这么长时间的发展,Java GC机制已经⽇臻完善,⼏乎可以⾃动的为我们做绝⼤多数的事情。
然⽽,如果我们从事较⼤型的应⽤软件开发,曾经出现过内存优化的需求,就必定要研究Java GC机制。
学习Java GC机制,可以帮助我们在⽇常⼯作中排查各种内存溢出或泄露问题,解决性能瓶颈,达到更⾼的并发量,写出更⾼效的程序。
我们将从4个⽅⾯学习Java GC机制,1,内存是如何分配的;2,如何保证内存不被错误回收(即:哪些内存需要回收);3,在什么情况下执⾏GC以及执⾏GC的⽅式;4,如何监控和优化GC机制。
内存是如何分配的这⾥所说的内存分配,主要指的是在堆上的分配,⼀般的,对象的内存分配都是在堆上进⾏,但现代技术也⽀持将对象拆成标量类型(标量类型即原⼦类型,表⽰单个值,可以是基本类型或String等),然后在栈上分配,在栈上分配的很少见,我们这⾥不考虑,接下来我们⼀起来了解下内存分区,对我们后⾯学习的有所帮助。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
谈谈Java语言的垃圾收集器垃圾收集器是Java语言区别于其他程序设计语言的一大特色。
它把程序员从手工回收内存空间的繁重工作中解脱了出来。
在SUN公司的Java程序员(Java Programmer)认证考试中,垃圾收集器是必考的内容,一般最多可以占总分值的6%左右。
但是由于SUN公司的Java Programming Language SL-275 课程的标准教材中,对有关垃圾收集器的内容只做了非常简单的介绍,而另外的一些关于Java技术的书籍,比如《Java 2 核心技术》(Core Java 2)、《Java编程思想》(Thinking in Java)、《精通Java 2》等等,里面关于垃圾收集器的内容也几乎没有,或者只是简单地提两句,所以很多参加Java Programmer认证考试的中国考生,在垃圾收集器这一部分的得分都为0分(笔者曾认识一位SUN公司授权的中国Java培训班的老师,其考试总分为89%,但垃圾收集器的部分竟然也为0分)。
鉴于此,笔者总结了这个垃圾收集器的专题,希望对广大Java技术的爱好者和准备认证考试的考生们有所帮助。
我们知道,许多程序设计语言都允许在程序运行期动态地分配内存空间。
分配内存的方式多种多样,取决于该种语言的语法结构。
但不论是哪一种语言的内存分配方式,最后都要返回所分配的内存块的起始地址,即返回一个指针到内存块的首地址。
当已经分配的内存空间不再需要时,换句话说当指向该内存块的句柄超出了使用范围的时候,该程序或其运行环境就应该回收该内存空间,以节省宝贵的内存资源。
在C,C++或其他程序设计语言中,无论是对象还是动态配置的资源或内存,都必须由程序员自行声明产生和回收,否则其中的资源将消耗,造成资源的浪费甚至死机。
但手工回收内存往往是一项复杂而艰巨的工作。
因为要预先确定占用的内存空间是否应该被回收是非常困难的!如果一段程序不能回收内存空间,而且在程序运行时系统中又没有了可以分配的内存空间时,这段程序就只能崩溃。
通常,我们把分配出去后,却无法回收的内存空间称为"内存渗漏体(Memory Leaks)"。
以上这种程序设计的潜在危险性在Java这样以严谨、安全著称的语言中是不允许的。
但是Java语言既不能限制程序员编写程序的自由性,又不能把声明对象的部分去除(否则就不是面向对象的程序语言了),那么最好的解决办法就是从Java程序语言本身的特性入手。
于是,Java技术提供了一个系统级的线程(Thread),即垃圾收集器线程(Garbage Collection Thread),来跟踪每一块分配出去的内存空间,当Java 虚拟机(Java Virtual Machine)处于空闲循环时,垃圾收集器线程会自动检查每一快分配出去的内存空间,然后自动回收每一快可以回收的无用的内存块。
垃圾收集器线程是一种低优先级的线程,在一个Java程序的生命周期中,它只有在内存空闲的时候才有机会运行。
它有效地防止了内存渗漏体的出现,并极大可能地节省了宝贵的内存资源。
但是,通过Java虚拟机来执行垃圾收集器的方案可以是多种多样的。
下面介绍垃圾收集器的特点和它的执行机制:垃圾收集器系统有自己的一套方案来判断哪个内存块是应该被回收的,哪个是不符合要求暂不回收的。
垃圾收集器在一个Java程序中的执行是自动的,不能强制执行,即使程序员能明确地判断出有一块内存已经无用了,是应该回收的,程序员也不能强制垃圾收集器回收该内存块。
程序员唯一能做的就是通过调用System. gc 方法来"建议"执行垃圾收集器,但其是否可以执行,什么时候执行却都是不可知的。
这也是垃圾收集器的最主要的缺点。
当然相对于它给程序员带来的巨大方便性而言,这个缺点是瑕不掩瑜的。
垃圾收集器的主要特点有:1.垃圾收集器的工作目标是回收已经无用的对象的内存空间,从而避免内存渗漏体的产生,节省内存资源,避免程序代码的崩溃。
2.垃圾收集器判断一个对象的内存空间是否无用的标准是:如果该对象不能再被程序中任何一个"活动的部分"所引用,此时我们就说,该对象的内存空间已经无用。
所谓"活动的部分",是指程序中某部分参与程序的调用,正在执行过程中,尚未执行完毕。
3.垃圾收集器线程虽然是作为低优先级的线程运行,但在系统可用内存量过低的时候,它可能会突发地执行来挽救内存资源。
当然其执行与否也是不可预知的。
4.垃圾收集器不可以被强制执行,但程序员可以通过调用System. gc方法来建议执行垃圾收集器。
5.不能保证一个无用的对象一定会被垃圾收集器收集,也不能保证垃圾收集器在一段Java语言代码中一定会执行。
因此在程序执行过程中被分配出去的内存空间可能会一直保留到该程序执行完毕,除非该空间被重新分配或被其他方法回收。
由此可见,完全彻底地根绝内存渗漏体的产生也是不可能的。
但是请不要忘记,Java的垃圾收集器毕竟使程序员从手工回收内存空间的繁重工作中解脱了出来。
设想一个程序员要用C或C++来编写一段10万行语句的代码,那么他一定会充分体会到Java的垃圾收集器的优点!6.同样没有办法预知在一组均符合垃圾收集器收集标准的对象中,哪一个会被首先收集。
7.循环引用对象不会影响其被垃圾收集器收集。
8.可以通过将对象的引用变量(reference variables,即句柄handles)初始化为null值,来暗示垃圾收集器来收集该对象。
但此时,如果该对象连接有事件监听器(典型的AWT组件),那它还是不可以被收集。
所以在设一个引用变量为null值之前,应注意该引用变量指向的对象是否被监听,若有,要首先除去监听器,然后才可以赋空值。
9.每一个对象都有一个finalize( )方法,这个方法是从Object类继承来的。
10.finalize( )方法用来回收内存以外的系统资源,就像是文件处理器和网络连接器。
该方法的调用顺序和用来调用该方法的对象的创建顺序是无关的。
换句话说,书写程序时该方法的顺序和方法的实际调用顺序是不相干的。
请注意这只是finalize( )方法的特点。
11.每个对象只能调用finalize( )方法一次。
如果在finalize( )方法执行时产生异常(exception),则该对象仍可以被垃圾收集器收集。
12.垃圾收集器跟踪每一个对象,收集那些不可到达的对象(即该对象没有被程序的任何"活的部分"所调用),回收其占有的内存空间。
但在进行垃圾收集的时候,垃圾收集器会调用finalize( )方法,通过让其他对象知道它的存在,而使不可到达的对象再次"复苏"为可到达的对象。
既然每个对象只能调用一次finalize( )方法,所以每个对象也只可能"复苏"一次。
13.finalize( )方法可以明确地被调用,但它却不能进行垃圾收集。
14.finalize( )方法可以被重载(overload),但只有具备初始的finalize( )方法特点的方法才可以被垃圾收集器调用。
15.子类的finalize( )方法可以明确地调用父类的finalize( )方法,作为该子类对象的最后一次适当的操作。
但Java编译器却不认为这是一次覆盖操作(overriding),所以也不会对其调用进行检查。
16.当finalize( )方法尚未被调用时,System. runFinalization( )方法可以用来调用finalize( )方法,并实现相同的效果,对无用对象进行垃圾收集。
17.当一个方法执行完毕,其中的局部变量就会超出使用范围,此时可以被当作垃圾收集,但以后每当该方法再次被调用时,其中的局部变量便会被重新创建。
18.Java语言使用了一种"标记交换区的垃圾收集算法"。
该算法会遍历程序中每一个对象的句柄,为被引用的对象做标记,然后回收尚未做标记的对象。
所谓遍历可以简单地理解为"检查每一个"。
19.Java语言允许程序员为任何方法添加finalize( )方法,该方法会在垃圾收集器交换回收对象之前被调用。
但不要过分依赖该方法对系统资源进行回收和再利用,因为该方法调用后的执行结果是不可预知的。
通过以上对垃圾收集器特点的了解,你应该可以明确垃圾收集器的作用,和垃圾收集器判断一块内存空间是否无用的标准。
简单地说,当你为一个对象赋值为null并且重新定向了该对象的引用者,此时该对象就符合垃圾收集器的收集标准。
判断一个对象是否符合垃圾收集器的收集标准,这是SUN公司程序员认证考试中垃圾收集器部分的重要考点(可以说,这是唯一的考点)。
所以,考生在一段给定的代码中,应该能够判断出哪个对象符合垃圾收集器收集的标准,哪个不符合。
下面结合几种认证考试中可能出现的题型来具体讲解:Object obj = new Object ( ) ;我们知道,obj为Object的一个句柄。
当出现new关键字时,就给新建的对象分配内存空间,而obj的值就是新分配的内存空间的首地址,即该对象的值(请特别注意,对象的值和对象的内容是不同含义的两个概念:对象的值就是指其内存块的首地址,即对象的句柄;而对象的内容则是其具体的内存块)。
此时如果有obj = null;则obj指向的内存块此时就无用了,因为下面再没有调用该变量了。
请再看以下三种认证考试时可能出现的题型:程序段1:1.fobj = new Object ( ) ;2.fobj. Method ( ) ;3.fobj = new Object ( ) ;4.fobj. Method ( ) ;问:这段代码中,第几行的fobj 符合垃圾收集器的收集标准?答:第3行。
因为第3行的fobj被赋了新值,产生了一个新的对象,即换了一块新的内存空间,也相当于为第1行中的fobj赋了null值。
这种类型的题在认证0考试中是最简单的。
程序段2:1.Object sobj = new Object ( ) ;2.Object sobj = null ;3.Object sobj = new Object ( ) ;4.sobj = new Object ( ) ;问:这段代码中,第几行的内存空间符合垃圾收集器的收集标准?答:第1行和第3行。
因为第2行为sobj赋值为null,所以在此第1行的sobj符合垃圾收集器的收集标准。
而第4行相当于为sobj赋值为null,所以在此第3行的sobj也符合垃圾收集器的收集标准。
如果有一个对象的句柄a,且你把a作为某个构造器的参数,即new Constructor ( a )的时候,即使你给a赋值为null,a也不符合垃圾收集器的收集标准。