Java垃圾回收机制

转载 2015年11月17日 21:38:19

经典的垃圾回收方法


Java虚拟机规范并没有对如何实现垃圾收集器做出明确的规定,因此各个厂商的虚拟机可以采用不同的方式来实现垃圾收集器,所以在此只讨论几种常见的垃圾收集算法的核心思想。


1.Mark-Sweep(标记-清除)算法

      这是最基础的垃圾回收算法,之所以说它是最基础的是因为它最容易实现,思想也是最简单的。标记-清除算法分为两个阶段:

标记阶段和清除阶段。标记阶段的任务是标记出所有需要被回收的对象,清除阶段就是回收被标记的对象所占用的空间。


    标记-清除算法实现起来比较容易,但是有一个比较严重的问题就是容易产生内存碎片,碎片太多可能会导致后续过程中需要为大对象分配空间时无法找到足够的空间而提前触发新的一次垃圾收集动作。


2.Copying(复制)算法


      为了解决Mark-Sweep算法的缺陷,Copying算法就被提了出来。它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用的内存空间一次清理掉,这样一来就不容易出现内存碎片的问题。


       这种算法虽然实现简单,运行高效且不容易产生内存碎片,但是却对内存空间的使用做出了高昂的代价,因为能够使用的内存缩减到原来的一半。

       Copying算法的效率跟存活对象的数目多少有很大的关系,如果存活对象很多,那么Copying算法的效率将会大大降低。


3.Mark-Compact(标记-整理)算法

  为了解决Copying算法的缺陷,充分利用内存空间,提出了Mark-Compact算法。该算法标记阶段和Mark-Sweep一样,但是在完成标记之后,它不是直接清理可回收对象,而是将存活对象都向一端移动,然后清理掉端边界以外的内存。具体过程如下图所示:


4.Generational Collection(分代收集)算法

分代收集算法是目前大部分JVM的垃圾收集器采用的算法。它的核心思想是根据对象存活的生命周期将内存划分为若干个不同的区域。一般情况下将堆区划分为老年代(Tenured Generation)和新生代(Young Generation),老年代的特点是每次垃圾收集时只有少量对象需要被回收,而新生代的特点是每次垃圾回收时都有大量的对象需要被回收,那么就可以根据不同代的特点采取最适合的收集算法。

  目前大部分垃圾收集器对于新生代都采取Copying算法,因为新生代中每次垃圾回收都要回收大部分对象,也就是说需要复制的操作次数较少,但是实际中并不是按照1:1的比例来划分新生代的空间的,一般来说是将新生代划分为一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden空间和其中的一块Survivor空间,当进行回收时,将Eden和Survivor中还存活的对象复制到另一块Survivor空间中,然后清理掉Eden和刚才使用过的Survivor空间。

  而由于老年代的特点是每次回收都只回收少量对象,一般使用的是Mark-Compact算法。

  注意,在堆区之外还有一个代就是永久代(Permanet Generation),它用来存储class类、常量、方法描述等。对永久代的回收主要回收两部分内容:废弃常量和无用的类。


简述java垃圾回收机制

简述java垃圾回收机制 一.谁在做Garbage Collection?         一种流行的说法:在C++里,是系统在做垃圾回收;而在Java里,是Java自身在做。 ...
  • oHuiJia1
  • oHuiJia1
  • 2014年05月05日 15:32
  • 1703

简单理解了下java中的垃圾回收机制

准备找工作,所以各种看书了,对于java开发岗来说垃圾回收机制的份量很重的说。看了以下几本书中对垃圾回收机制的描述:《深入理解java虚拟机》、《java编程思想》、《疯狂Java讲义》、《Java程...
  • NIMANCY
  • NIMANCY
  • 2016年07月14日 17:12
  • 990

Java垃圾回收机制理解

垃圾回收机制的理解。
  • daguairen
  • daguairen
  • 2016年08月19日 10:17
  • 5199

面试题 java垃圾回收机制

前几天面试的时候被问到垃圾回收机制的时候,心里还庆幸这个之前看过,可是答完后就傻了,面试官竟然问还有没有。 好吧,我一直以为面试官是懂我说什么的,加上说的有点快,有点乱,很多东西都省略掉了,估计是我...
  • q291611265
  • q291611265
  • 2015年04月18日 17:46
  • 12252

Java面试之垃圾回收总结

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

【Java 基础】Java垃圾回收机制 finalize() 方法

finalize() 方法   Java允许定义这样的方法,它在对象被垃圾收集器析构(回收)之前调用,这个方法叫做finalize( ),它用来清除回收对象(一些东西,不一定是对象)。 例如,你可...
  • leaf_130
  • leaf_130
  • 2016年05月18日 09:42
  • 453

浅谈JAVA垃圾回收机制及其回收时机

众所周知,Java与C++相比有一个明显的不同就是:Java拥有自动垃圾回收机制,而C++的垃圾回收则完全由程序员自己手动完成,这不仅对程序员本身素质有一定的要求,还提高了内存泄漏的风险。     ...
  • wk51920
  • wk51920
  • 2016年06月01日 00:09
  • 1744

【Java】finalize()和垃圾回收机制

finalize()方法:一旦gc准备释放对象占用的存储空间,将首先调用finalize()方法,并在下一次垃圾回收动作发生时才会真正回收内存。可在此进行重要的清理操作。gc只能释放那些经由new分配...
  • youyaecho
  • youyaecho
  • 2016年05月19日 11:22
  • 388

java内存管理和垃圾回收机制

我们知道,java所谓的跨平台特性(hardware- and operating system-independence)是依赖于JVM的。也就是,JAVA代码写好了之后会被编译成java的字节,一...
  • u010223904
  • u010223904
  • 2015年08月28日 10:48
  • 2081

怎么在面试时回答Java垃圾回收机制(GC)相关问题?

作者:郭无心 链接:https://www.zhihu.com/question/35164211/answer/68265045 来源:知乎 著作权归作者所有,转载请联系作者获得授权。 ...
  • u012767369
  • u012767369
  • 2017年02月10日 09:31
  • 614
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java垃圾回收机制
举报原因:
原因补充:

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