`
躁动的绵羊
  • 浏览: 95917 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

深入JVM——垃圾收集器(二)

阅读更多

上篇文章主要描述了一下垃圾收集器的收集方式以及收集器的种类。如果对垃圾收集器还不是很了解的朋友可以去网上搜索下资料看看,或直接看《深入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赋值为nulla也不符合垃圾收集器的收集标准。直到由上面构造器构造的新对象被赋空值时,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类的三个对象:aobjbobj
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最终符合了垃圾收集器的收集标准。 但对于aobjbobj,仍然无法判断其是否符合收集标准。个人认为答案 17

 

最后再次提醒一下:一块内存空间符合了垃圾收集器的收集标准,并不意味着这块内存空间就一定会被垃圾收集器收集

 

 

 

 

最后一个比较难的题了,如果你会做,那证明你对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的水平,这题答案及分析过段时间再公布

 

 

10
3
分享到:
评论
16 楼 kx29126390 2010-10-09  
最后那道题是第7行生成的对象可以被回收吗
15 楼 superheizai 2010-10-08  
蔡华江 写道
最后一道题倒是不难,答案是2.
问题是前面的收集标准没看懂。
尤其是第3题,没看出第7行有内存空间啊,我的答案是1,3


   同意这个观点为1,3。我认为这么看待这个问题。

程序段3:  个人感觉有点问题,大家知道的可以讨论下
1.Object aobj = new Object ( ) ; 
2.Object bobj = new Object ( ) ; 
3.Object cobj = new Object ( ) ;
// 前三行在堆中新建三个对象1,2,3,而且在栈中新建三个引用。
4.aobj = bobj; 
//第四行,引用aobj指向了bobj指向的对象2,使得第一个堆中的对象1没有被任何引用指向,所以符合了收集条件,会被收集。
5.aobj = cobj; 
//第五行,aobj又指向了cobj指向的对象3,这个时候,对象2,3都有对象被引用到,所以,不会有任何回收。
6.cobj = null; 
//第六行,cobj==null,使得对象3的被引用从被aobj和cobj两个引用,减少到只有aobj一个引用。
7.aobj = null;
//第七行,aobj==null,使得对象3的被引用的次数减少到0,符合了被回收的条件,所以,这个时候对象3被回收。

   也就是说,第1,3两行的创建的对象满足回收条件,是在第4,7两句执行的时候,满足回收条件的。



14 楼 youlong699 2010-10-06  
躁动的绵羊 写道
yangjitang100 写道
2个对象被回收,a1被回收和a1对象里的b2


你可能做错了,标准答案是一个。还有,要注意那个静态变量,这需要理解JVM中的类型以及静态常量区的知识了,我当时做时也做错了


这里应该与静态常量区无关吧?静态常量指的是字面常量或者final static类型吧?这里的static是类变量,当对应的Class实例被创建并经历了连接阶段后,类变量被分配了内存且置为默认值,可见,只要对应的Class对象没有被回收那么这个类变量的引用是时刻存在的,在本例中当该引用被指向了b1或者b2时,那么对应的b1或者b2所指向的对象就增加了一次引用计数。这一引用是由Alpha对应的java.lang.Class 实例(它也是一个对象)所持有的。
ps:正在学习jvm,说的不对,欢迎指正!
13 楼 躁动的绵羊 2010-09-28  
zzc_zj 写道
a1.b1 = b1;//该句的作用与下面两句不同,因为a1.b1是静态属性,所以这句等于a2.b1=b1和Alpha.b1=b1。
这句不明白,求解释


静态变量引用存储在静态常量区,该类多有实例都有一个指向它的引用
12 楼 zzc_zj 2010-09-28  
a1.b1 = b1;//该句的作用与下面两句不同,因为a1.b1是静态属性,所以这句等于a2.b1=b1和Alpha.b1=b1。
这句不明白,求解释
11 楼 se7en8974 2010-09-28  
进来学习的。
10 楼 yangjitang100 2010-09-28  
躁动的绵羊 写道
yangjitang100 写道
躁动的绵羊 写道
yangjitang100 写道
2个对象被回收,a1被回收和a1对象里的b2


你可能做错了,标准答案是一个。还有,要注意那个静态变量,这需要理解JVM中的类型以及静态常量区的知识了,我当时做时也做错了


是哪个,还请详解



其实你说的也没错啦,只有a1被回收了,而a1里的b2就是b2,它还有引用指向,所以不会被回收的

明白了
9 楼 躁动的绵羊 2010-09-27  
kakaluyi 写道
晕点顶,点到了踩楼主原谅我吧。。。。


没关系 其实我写blog的原因是为了让自己对知识加深理解和方便以后复习,其它的其实没什么,当然,有人顶我会更高兴
8 楼 蔡华江 2010-09-27  
最后一道题倒是不难,答案是2.
问题是前面的收集标准没看懂。
尤其是第3题,没看出第7行有内存空间啊,我的答案是1,3
7 楼 kakaluyi 2010-09-27  
最后题,a1,b1被回收?因为b2开辟的内存还有a2.b2引用,所以不会被回收
6 楼 kakaluyi 2010-09-27  
晕点顶,点到了踩楼主原谅我吧。。。。
5 楼 kakaluyi 2010-09-27  
第三个程序段:
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;
第4行也被垃圾回收了,因为aobj开辟了内存空间new Object()后指向了别的内存空间,
所以第一行的new Object()也会被回
4 楼 躁动的绵羊 2010-09-27  
yangjitang100 写道
躁动的绵羊 写道
yangjitang100 写道
2个对象被回收,a1被回收和a1对象里的b2


你可能做错了,标准答案是一个。还有,要注意那个静态变量,这需要理解JVM中的类型以及静态常量区的知识了,我当时做时也做错了


是哪个,还请详解



其实你说的也没错啦,只有a1被回收了,而a1里的b2就是b2,它还有引用指向,所以不会被回收的
3 楼 yangjitang100 2010-09-26  
躁动的绵羊 写道
yangjitang100 写道
2个对象被回收,a1被回收和a1对象里的b2


你可能做错了,标准答案是一个。还有,要注意那个静态变量,这需要理解JVM中的类型以及静态常量区的知识了,我当时做时也做错了


是哪个,还请详解
2 楼 躁动的绵羊 2010-09-26  
yangjitang100 写道
2个对象被回收,a1被回收和a1对象里的b2


你可能做错了,标准答案是一个。还有,要注意那个静态变量,这需要理解JVM中的类型以及静态常量区的知识了,我当时做时也做错了
1 楼 yangjitang100 2010-09-26  
2个对象被回收,a1被回收和a1对象里的b2

相关推荐

    深入JVM内核—原理、诊断与优化视频教程-3.常用JVM配置参数

    “-XX:+UseConcMarkSweepGC”和“-XX:+UseParallelGC”选择不同的垃圾收集器策略,以适应不同应用场景的性能需求。还有像“-XX:MaxTenuringThreshold”用于设置对象晋升老年代的阈值,以及“-XX:...

    JVM内存管理白皮书

    它不仅向读者提供了JVM垃圾收集机制的理论知识,还提供了实操指导,比如如何选择和调优垃圾收集器以及使用哪些工具来评估垃圾收集器性能。对于开发人员来说,掌握这些知识可以帮助他们编写出性能更优、稳定性更高的...

    实战Java虚拟机——JVM故障诊断与性能优化.pdf

    书中可能涉及了各种垃圾收集器的工作原理,如Serial、Parallel、CMS、G1、ZGC等,并分析了不同场景下选择哪种GC策略更为合适。 3. **内存泄漏与溢出诊断**:通过对JVM日志的分析,书里可能会教授读者如何识别和处理...

    jvm性能调优-垃圾收集器parnew&CMS底层三色标记算-performance-gc-parnew-cms.zip

    本文将深入探讨两个重要的垃圾收集器——ParNew和Concurrent Mark Sweep (CMS) ——以及它们在JVM性能调优中的作用,特别是基于三色标记算法的实现。 首先,ParNew垃圾收集器是新生代(Young Generation)的默认...

    jvmjava,java实现的JVM。.zip

    《Java实现的JVM——深入理解与实践》 在计算机科学领域,Java虚拟机(JVM)是Java语言的关键组成部分,它使得Java程序能够在不同平台上运行而无需重新编译。本项目“jvmjava”是一个开源项目,由Java语言实现,...

    jvm详解资料

    - **JVM的垃圾收集策略**:现代JVM提供了多种垃圾收集器,如串行收集器(Serial Collector)、并行收集器(Parallel Collector)、并发标记-清扫收集器(Concurrent Mark-Sweep Collector)等,每种收集器都针对不同...

    深入JVM内核—原理、诊断与优化视频教程-4.GC算法与种类

    4. **G1(Garbage-First)**:新一代的垃圾收集器,目标是实现可预测的暂停时间模型,适用于大型应用。 五、GC调优 理解并优化GC是提升Java应用性能的关键。调优包括调整堆大小、设置新生代与老年代的比例、选择...

    java jvm-old gc耗时几十s,导致系统告警(csdn)————程序.pdf

    总结来说,解决Java应用中old GC耗时过长的问题,需要深入理解应用的内存使用模式,合理调整JVM参数,选择合适的垃圾收集器,并进行持续的性能监控和调优。在调整过程中,应遵循最小化停顿时间、最大化吞吐量和优化...

    深入JVM内核-原理、诊断与优化ppt.zip

    《深入JVM内核——原理、诊断与优化》是一份深度探讨Java虚拟机核心机制、问题诊断和性能优化的专业资料。这份资料涵盖了JVM的各个方面,对于Java开发者来说,理解和掌握这些知识至关重要。 首先,我们要了解JVM...

    实战Java虚拟机——JVM故障诊断与性能优化

    了解JVM内部机制,包括类加载机制、内存模型、垃圾收集等,是提高程序性能和解决运行时问题的关键。书中的内容涵盖了以下几个核心知识点: 1. **JVM结构**:JVM分为多个组成部分,包括类装载器、运行时数据区、执行...

    JVM Memory Model and GC.pdf

    JVM(Java虚拟机)是Java...通过对JVM内存模型和GC的深入理解,开发者可以更好地对Java应用程序进行性能调优,包括合理配置堆大小、选择适当的垃圾收集器,以及在编码时注意对象的创建和回收,避免不必要的内存泄漏。

    学习笔记——JVM性能调优之 jstat(csdn)————程序.pdf

    jstat(JVM Statistics Monitoring Tool)是Oracle JDK提供的一款强大的命令行工具,用于实时监控Java虚拟机的各种运行状态,包括内存管理、类加载、垃圾收集以及JIT编译等关键指标。了解并熟练运用jstat,能帮助...

    JVM性能调优-JVM内存整理及GC回收.pdf_java_jvm_

    总结来说,JVM性能调优是多方面的工作,包括理解内存结构、选择合适的垃圾收集器、调整内存参数以及优化代码实现。通过细致入微的调优,可以显著提升Java应用的性能和稳定性。这份PDF资料将详细介绍这些关键点,帮助...

    jvm参数调优-jvmSample.zip

    1. 根据应用类型选择合适的垃圾收集器,如低延迟应用推荐使用G1或ZGC,大内存应用可选择Parallel GC。 2. 优化对象分配,减少短生命周期对象进入老年代,降低GC频率。 3. 监控系统性能,如CPU使用率、内存占用、GC...

    JVM笔记(阳哥).zip

    JVM的垃圾收集机制负责自动回收不再使用的对象所占用的内存,主要有标记-清除、复制、标记-整理和分代收集等算法。理解垃圾收集的工作原理,可以帮助我们设置合理的内存参数,避免Full GC的发生,提高应用的响应速度...

    JVM虚拟机源码(C++)

    2. **垃圾收集器**:HotSpot支持多种垃圾回收算法,如Serial、Parallel、Concurrent Mark Sweep (CMS) 和 Garbage First (G1)。这些算法各有优缺点,适应不同的应用场景。 3. **运行时系统**:包括对象模型、内存...

    深入Java虚拟机——本地方法栈.pdf

    除了用户程序的线程,JVM实现还可能包含一些后台线程,如垃圾收集器,这些线程不需要直接对应执行引擎实例。 JVM的指令集是其操作的基础,字节码流由一系列指令组成,每个指令由一个操作码和可能的操作数构成。操作...

    jvm内存管理,pdf

    - **根搜索算法(GC Roots Tracing)**:这是现代垃圾收集器普遍采用的方法。它从一组被称为“GC Roots”的对象开始,递归地遍历可达对象。如果一个对象不可达,则认为它是不再使用的,从而可以被回收。 #### 四、GC ...

    jvm分享ppt

    【JVM 分享】——深入理解Java程序的生命周期与执行机制 Java程序的生命周期始于源码,经过编译、加载和执行,最终在Java虚拟机(JVM)上运行。这个过程涉及到了编译器、类文件、虚拟机以及相关的优化技术。下面将...

Global site tag (gtag.js) - Google Analytics