上篇文章主要描述了一下垃圾收集器的收集方式以及收集器的种类。如果对垃圾收集器还不是很了解的朋友可以去网上搜索下资料看看,或直接看《深入JVM》,如果觉得麻烦,可以看看我上篇blog。地址是:
http://xtu-tja-163-com.iteye.com/blog/771401
使用垃圾收集器要注意的地方
下面将提出一些有关垃圾收集器要注意的地方和一些面试题的分析。垃圾收集器知识很多,下面我只列出一部分我觉得有用的知识:
1. 每个对象只能调用finalize( )方法一次。如果在finalize( )方法执行时产生异常(exception),则该对象仍可以被垃圾收集器收集。
2. 垃圾收集器跟踪每一个对象,收集那些不可触及的对象(即该对象不再被程序引用 了),回收其占有的内存空间。但在进行垃圾收集的时候,垃圾收集器会调用该对象的finalize( )方法(如果有)。如果在finalize()方法中,又使得该对象被程序引用(俗称复活了),则该对象就变成了可触及的对象,暂时不会被垃圾收集了。但是由于每个对象只能调用一次finalize( )方法,所以每个对象也只可能 "复活 "一次。
3. Java语言允许程序员为任何方法添加finalize( )方法,该方法会在垃圾收集器交换回收对象之前被调用。但不要过分依赖该方法对系统资源进行回收和再利用,因为该方法调用后的执行结果是不可预知的。
4. 垃圾收集器不可以被强制执行,但程序员可以通过调研System.gc方法来建议执行垃圾收集。记住,只是建议。一般不建议自己写System.gc,因为会加大垃圾收集工作量。
有关垃圾收集器面试题分析
下面举几个java收集的例子(都是从网上搜集来的),以便大家可以更加深刻的理解垃圾收集,具体详细信息,可以参考文章:http://www.360doc.com/content/10/0822/18/1780254_47975944.shtml
在做题前,大家首先要明白:在Java语言中,判断一块内存空间是否符合垃圾收集器收集标准是程序中是否还有引用指向该对象,一般出现被回收,有以下几种情况:
1.给对象对应的所有引用赋予了空值null,以下再没有调用过。
2.给对象对应的所有引用赋予了新值,既重新分配了内存空间。
3.该对象引用有的被赋予了null,有的指向了新的对象。总之,就是以前指向该对象的所有引用现在都不指向它了。
程序段 1:
1.fobj = new Object ( ) ;
2.fobj. Method ( ) ;
3.fobj = new Object ( ) ;
4.fobj. Method ( ) ;
问:这段代码中,第几行的内存空间符合垃圾收集器的收集标准?
答:第1行。因为第3行的fobj被赋了新值,产生了一个新的对象,即换了一块新的内存空间,也相当于为第1行中的fobj赋了null值。这种类型的题在认证0考试中是最简单的。
疑问:感觉第2行还用了fobj对象啊,如果在第一行被收集了,那第二行还能被执行吗?
程序段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也不符合垃圾收集器的收集标准。直到由上面构造器构造的新对象被赋空值时,a才可以被垃圾收集器收集。
程序段3: 个人感觉有点问题,大家知道的可以讨论下
1.Object aobj = new Object ( ) ;
2.Object bobj = new Object ( ) ;
3.Object cobj = new Object ( ) ;
4.aobj = bobj;
5.aobj = cobj;
6.cobj = null;
7.aobj = null;
问:这段代码中,第几行的内存空间符合垃圾收集器的收集标准?
答:第7行。注意这类题型是认证考试中可能遇到的最难题型了。
行1-3分别创建了Object类的三个对象:aobj,bobj,cobj
行4:此时对象aobj的句柄指向bobj,所以该行的执行不能使aobj符合垃圾收集器的收集标准。
行5:此时对象aobj的句柄指向cobj,所以该行的执行不能使aobj符合垃圾收集器的收集标准。
行6:此时仍没有任何一个对象符合垃圾收集器的收集标准。
行7:对象cobj符合了垃圾收集器的收集标准,因为cobj的句柄指向单一的地址空间。在第6行的时候,cobj已经被赋值为null,但由cobj同时还指向了aobj(第5行),所以此时cobj并不符合垃圾收集器的收集标准。而在第7行,aobj所指向的地址空间也被赋予了空值null,这就说明了,由cobj所指向的地址空间已经被完全地赋予了空值。所以此时cobj最终符合了垃圾收集器的收集标准。 但对于aobj和bobj,仍然无法判断其是否符合收集标准。个人认为答案: 1和7行
最后再次提醒一下:一块内存空间符合了垃圾收集器的收集标准,并不意味着这块内存空间就一定会被垃圾收集器收集
最后一个比较难的题了,如果你会做,那证明你对JVM有比较深的了解了:
class Beta{}
class Alpha{ static Beta b1; Beta b2; }
//执行代码
Beta b1 = new Beta();
Beta b2 = new Beta();
Alpha a1 = new Alpha();
Alpha a2 = new Alpha();
a1.b1 = b1;
a1.b2 = b1;
a2.b2 = b2;
a1 = null;
b1 = null;
b2 = null;
问:程序执行完b2=null后,理论上有几个对象被回收了?
答案:http://zhidao.baidu.com/question/143700758.html?fr=ala0
为了看看JE上朋友JVM的水平,这题答案及分析过段时间再公布
分享到:
相关推荐
“-XX:+UseConcMarkSweepGC”和“-XX:+UseParallelGC”选择不同的垃圾收集器策略,以适应不同应用场景的性能需求。还有像“-XX:MaxTenuringThreshold”用于设置对象晋升老年代的阈值,以及“-XX:...
它不仅向读者提供了JVM垃圾收集机制的理论知识,还提供了实操指导,比如如何选择和调优垃圾收集器以及使用哪些工具来评估垃圾收集器性能。对于开发人员来说,掌握这些知识可以帮助他们编写出性能更优、稳定性更高的...
书中可能涉及了各种垃圾收集器的工作原理,如Serial、Parallel、CMS、G1、ZGC等,并分析了不同场景下选择哪种GC策略更为合适。 3. **内存泄漏与溢出诊断**:通过对JVM日志的分析,书里可能会教授读者如何识别和处理...
本文将深入探讨两个重要的垃圾收集器——ParNew和Concurrent Mark Sweep (CMS) ——以及它们在JVM性能调优中的作用,特别是基于三色标记算法的实现。 首先,ParNew垃圾收集器是新生代(Young Generation)的默认...
《Java实现的JVM——深入理解与实践》 在计算机科学领域,Java虚拟机(JVM)是Java语言的关键组成部分,它使得Java程序能够在不同平台上运行而无需重新编译。本项目“jvmjava”是一个开源项目,由Java语言实现,...
- **JVM的垃圾收集策略**:现代JVM提供了多种垃圾收集器,如串行收集器(Serial Collector)、并行收集器(Parallel Collector)、并发标记-清扫收集器(Concurrent Mark-Sweep Collector)等,每种收集器都针对不同...
4. **G1(Garbage-First)**:新一代的垃圾收集器,目标是实现可预测的暂停时间模型,适用于大型应用。 五、GC调优 理解并优化GC是提升Java应用性能的关键。调优包括调整堆大小、设置新生代与老年代的比例、选择...
总结来说,解决Java应用中old GC耗时过长的问题,需要深入理解应用的内存使用模式,合理调整JVM参数,选择合适的垃圾收集器,并进行持续的性能监控和调优。在调整过程中,应遵循最小化停顿时间、最大化吞吐量和优化...
《深入JVM内核——原理、诊断与优化》是一份深度探讨Java虚拟机核心机制、问题诊断和性能优化的专业资料。这份资料涵盖了JVM的各个方面,对于Java开发者来说,理解和掌握这些知识至关重要。 首先,我们要了解JVM...
了解JVM内部机制,包括类加载机制、内存模型、垃圾收集等,是提高程序性能和解决运行时问题的关键。书中的内容涵盖了以下几个核心知识点: 1. **JVM结构**:JVM分为多个组成部分,包括类装载器、运行时数据区、执行...
JVM(Java虚拟机)是Java...通过对JVM内存模型和GC的深入理解,开发者可以更好地对Java应用程序进行性能调优,包括合理配置堆大小、选择适当的垃圾收集器,以及在编码时注意对象的创建和回收,避免不必要的内存泄漏。
jstat(JVM Statistics Monitoring Tool)是Oracle JDK提供的一款强大的命令行工具,用于实时监控Java虚拟机的各种运行状态,包括内存管理、类加载、垃圾收集以及JIT编译等关键指标。了解并熟练运用jstat,能帮助...
总结来说,JVM性能调优是多方面的工作,包括理解内存结构、选择合适的垃圾收集器、调整内存参数以及优化代码实现。通过细致入微的调优,可以显著提升Java应用的性能和稳定性。这份PDF资料将详细介绍这些关键点,帮助...
1. 根据应用类型选择合适的垃圾收集器,如低延迟应用推荐使用G1或ZGC,大内存应用可选择Parallel GC。 2. 优化对象分配,减少短生命周期对象进入老年代,降低GC频率。 3. 监控系统性能,如CPU使用率、内存占用、GC...
JVM的垃圾收集机制负责自动回收不再使用的对象所占用的内存,主要有标记-清除、复制、标记-整理和分代收集等算法。理解垃圾收集的工作原理,可以帮助我们设置合理的内存参数,避免Full GC的发生,提高应用的响应速度...
2. **垃圾收集器**:HotSpot支持多种垃圾回收算法,如Serial、Parallel、Concurrent Mark Sweep (CMS) 和 Garbage First (G1)。这些算法各有优缺点,适应不同的应用场景。 3. **运行时系统**:包括对象模型、内存...
除了用户程序的线程,JVM实现还可能包含一些后台线程,如垃圾收集器,这些线程不需要直接对应执行引擎实例。 JVM的指令集是其操作的基础,字节码流由一系列指令组成,每个指令由一个操作码和可能的操作数构成。操作...
- **根搜索算法(GC Roots Tracing)**:这是现代垃圾收集器普遍采用的方法。它从一组被称为“GC Roots”的对象开始,递归地遍历可达对象。如果一个对象不可达,则认为它是不再使用的,从而可以被回收。 #### 四、GC ...
【JVM 分享】——深入理解Java程序的生命周期与执行机制 Java程序的生命周期始于源码,经过编译、加载和执行,最终在Java虚拟机(JVM)上运行。这个过程涉及到了编译器、类文件、虚拟机以及相关的优化技术。下面将...