面试题 java垃圾回收机制

原创 2015年04月18日 17:46:39

前几天面试的时候被问到垃圾回收机制的时候,心里还庆幸这个之前看过,可是答完后就傻了,面试官竟然问还有没有。

好吧,我一直以为面试官是懂我说什么的,加上说的有点快,有点乱,很多东西都省略掉了,估计是我省略掉的被认为是我不懂的了。

所以组织一下语言,下次尽量说的清楚一点。。


内存回收机制:

内存回收就是释放掉在内存中已经没用的对象。

首先,要判断怎样的对象是没用的对象。这里有2种方法:

1.采用标记计数的方法:

给内存中的对象给打上标记,对象被引用一次,计数就加1,引用被释放了,计数就减一,当这个计数为0的时候,这个对象就可以被回收了。当然,这也就引发了一个问题:循环引用的对象是无法被识别出来并且被回收的。所以就有了第二种方法:

2.采用根搜索算法:

从一个根出发,搜索所有的可达对象,这样剩下的那些对象就是需要被回收的

判断完了哪些对象是没用的,这样就可以进行回收了

最简单的,就是直接清空那个需要被回收的对象。但是这又出现了一个问题,就是内存会被分为一块一块的小碎片。

为了解决这个问题,可以采用第二种方法,就是在之前的基础上将存活的对象给整理一下,使他们变成一个连续的内存,从而释放出连续的较大的内存空间。

还有一中回收方法就是采用复制的办法:将内存分为2块,一块用来存放对象,另一块用来放着,当存放对象的那块满了以后就将上面存活的对象给复制过来,然后在这块内存上工作,并且将之前的内存清空,当自己这块满了以后再复制回去,如此反复。


比较效率的一中做法是将以上的几种方法给结合起来。

首先将内存分块,分为新生代,老年代和永久代。

永久代用来存放代码,等一些基本不改变的数据,

新生代用来存放刚产生的一些对象,新生代又可分为3块。分别为Edon区,Survivor0,survivor1,刚产生的对象是放在Edon区中,当这个区块放满了以后就将其存活的部分复制到survivor0块中,并且将Edon区中的数据清空,等到survivor0满了就将其中的存活的数据放到survivor1中,清空survivor0,垃圾回收到了一定次数还未被回收的对象,就可以放到老年区。一般来说,刚才产生的对象大多是要在下一次垃圾回收的时候就要被回收掉的,只有一小部分对象会被保留下来,这些被保留下来的对象都是比较稳定的,所以在老年区中的对象回收方法可以采用整理的方法,而在Edon区等新生代中采用复制的方法比较好。



这里,基本上就讲完了。

万一被问到还有呢。。想了想,还可以扯些其他方面的:

垃圾回收他是在虚拟机空闲的时候或者内存紧张的时候执行的,什么时候回收不是由程序员来控制的,这也就是java比较耗内存的原因之一。

还有在垃圾回收的时候当检测到对象没有用了,需要被回收的时候并不会马上被回收,而是将其放入到一个准备回收的队列,去执行finalize方法。。然等到下次内存回收的时候要是他还是没有被任何人引用的话,就将其给回收了。(如果在finalize方法中重新给对象加个引用,这样对象是有可能不会被回收的)不过finalize方法不推荐使用,他跟C++中的析构函数不同,我们既不能确定什么时候他回被回收,也不能保证这个方法一定会被执行。


好像真的编不出来了。。。

关于Java垃圾回收机制,你所需要知道的一切

本博客转自http://blog.csdn.net/zsuguangh/article/details/6429592 1. 垃圾回收的意义   在C++中,对象所占的内存在程序结束运行之前一直被...
  • u010429311
  • u010429311
  • 2016-03-27 10:20:21
  • 2170

对象的垃圾回收和四种引用

对象在内存中分为三种状态: 可达状态 一个对象创建以后,有一个或者多个引用变量引用该对象,那么这个对象属于可达状态   可恢复状态 如果程序中某个对象不再有任何引用变量引用它,他将进入可恢复状态,此时...
  • Erica_1230
  • Erica_1230
  • 2015-02-19 17:49:31
  • 2520

对象的销毁与垃圾回收机制

每个对象都有生命周期,当对象的生命周期结束时,分配给该对象的内存地址将会被回收,在其他语言中需要手动回收废弃的对象,但是java语言拥有一套完整的垃圾回收机制,用户不必担心废弃的对象占用内存,垃圾回收...
  • hhhhhhhhuang
  • hhhhhhhhuang
  • 2015-06-19 17:03:12
  • 1139

垃圾回收机制

垃圾处理机制 什么情况下对象会被垃圾回收机制处理掉? 对象在内存中不被使用 每个对象都有自己的生命周期,当对象的生命周期结束时 对象超过其引用范围 将对象赋值为null java的垃圾回收机制 j...
  • qq_32143399
  • qq_32143399
  • 2017-12-01 13:21:58
  • 109

java垃圾回收机制

垃圾收集器系统有自己的一套方案来判断哪个内存块是应该被回收 的, 哪个是不符合要求暂不回收的。 垃圾收集器在一个 Java 程序中的执 行是自动的,不能强制执行,即使程序员能明确地判断出有...
  • bao19901210
  • bao19901210
  • 2014-09-16 16:52:18
  • 11145

java垃圾回收策略及对象管理机制

一、java垃圾收集对象的依据 java垃圾回收主要是针对堆内存对象,堆里有很多对象,在垃圾回收之前,需要判断哪些对象是活的的,哪些对象是死的,然后对死的对象进行回收,java GC不可能把活的对象...
  • jiangwei_80
  • jiangwei_80
  • 2017-06-07 06:07:56
  • 157

几种垃圾回收机制

参考 http://www.2cto.com/kf/201110/108419.htmlhttp://www.cnblogs.com/nele/p/5673215.html1.引用计数算法引用计数(...
  • qq_26437925
  • qq_26437925
  • 2016-12-18 16:44:17
  • 2417

Java面试之垃圾回收总结

1. JVM垃圾回收机制与实现 堆:所有的对象实例与数组,GC堆,分为新生代与老年代 栈:栈帧包含局部变量表(基本数据类型 8种、对象引用类型)、操作数栈、动态链接、方法出口 方法区:类信息、常量、静...
  • u014762921
  • u014762921
  • 2017-03-09 15:54:51
  • 5548

java垃圾回收机制---面试的问题

面试过程中遇到一个问题:  java 垃圾回收器,回收没有引用指向的对象实例,那如果是A->B,B->A这种就一直回收不了了吗? Q: Does unreachable m...
  • Happy_wu
  • Happy_wu
  • 2016-09-12 16:48:33
  • 2368

Java垃圾回收机制理解

垃圾回收机制的理解。
  • daguairen
  • daguairen
  • 2016-08-19 10:17:06
  • 6806
收藏助手
不良信息举报
您举报文章:面试题 java垃圾回收机制
举报原因:
原因补充:

(最多只允许输入30个字)