JAVA垃圾回收机制

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

判断怎样的对象是没用的对象(2种方法 标记计数/根搜索

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

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

2.采用根搜索算法:

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

内存回收策略(直接回收/整理/复制)

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

在此基础上将存活的对象给整理一下,使他们变成一个连续的内存,从而释放出连续的较大的内存空间。

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

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

补充: 垃圾回收他是在虚拟机空闲的时候或者内存紧张的时候执行的,什么时候回收不是由程序员来控制的,这也就是java比较耗内存的原因之一。还有在垃圾回收的时候当检测到对象没有用了,需要被回收的时候并不会马上被回收,而是将其放入到一个准备回收的队列,去执行finalize方法,然等到下次内存回收的时候要是他还是没有被任何人引用的话,就将其给回收了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 如果你想要从太空观察地球,卫星技术就能够做到这一点。图中的海洋流是卫星地图展现的,紫色和粉红色的漩涡代表更暖的洋流...
    allever阅读 5,237评论 0 8
  • 来自: Android梦想特工队作者: Aaron主页: http://www.wxtlife.com/原...
    技术特工队阅读 9,879评论 0 28
  • 垃圾回收机制让开发者不需要考虑内存管理,这样不仅提高了开发效率,还改善了内存的使用状况。 Java堆内存 堆在JV...
    谢随安阅读 3,873评论 0 0
  • 一:垃圾回收机制的意义 java 语言中一个显著的特点就是引入了java回收机制,是c++程序员最头疼的内存管理...
    FTOLsXD阅读 3,520评论 0 2
  • 最近,上海一家经营了34年的葱油饼店成了网红,此前更因BBC的报道名满上海滩。可是,这家店的主人阿大现在高兴不起来...
    彼得猫乌金阅读 2,875评论 0 1