二、垃圾收集与内存分配策略

1. 执行GC时,需要做的几件事

(1). 哪些内存需要回收

(2). 什么时候回收

(3). 如何回收

2. 判断对象已无引用的几种方法
(1). 引用计数法
给对象增加一个计数器,每当被引用一次,计数器值就加1,如果不存在引用后,计数器值为0,此时表明对象已经无引用,可被回收。
这种方法简单,但是不是最好的方法。如果两个对象之间互相引用,那这样永远无法被垃圾回收器回收
(2). 可达性分析算法
可达性分析算法,主要是以树的形式来判断对象是否存在引用。先从根节点GC Root出发向下搜索,搜索走过的路径被称为引用链,当一个对象和GCRoot不存在引用链时,称此对象无引用。如下图:


可作为GC Root的对象包括以下几个:
  ● 虚拟机栈中的引用对象
  ● 方法区中静态属性引用的对象
  ● 方法区中常量引用的对象

理解:Java程序都是从main方法中开始的。当创建第一个对象时,这个对象可作为GC Root,通过调用这个对象的其他方法或许会创建各种不同类型的对象。以这个对象为根节点向下搜索,如果在这个方法还没有结束时,存在与GC Root不存在引用链的对象,即认为这个对象是可被回收的。

3. 回收方法区
方法区(或者堆中的永久代)中存放的都是一些常量,一般认为是没有垃圾的,其实也不能说没有垃圾,一些无用的类、常量如果废弃了,也算是垃圾。最典型的就是String字符串,它的每一个值都存放在常量池中,当一个字符串使用过一次之后,或许以后都不会再被使用,这个字符串就成了无用的常量了,需要被垃圾回收。判断一个常量是否废弃很简单,没有引用即废弃。但是判断一个类是否废弃,比较麻烦。

4. 垃圾收集算法
  ● 标记—清除算法
标记—清除算法,是最基本的一个算法。其他算法都是在此基础上发展起来的。算法的实现正如它的名字一样,先对可被回收的对象进行标记,再把这部分标记过的对象进行清除。
它的不足之处是,一方面,标记和清除过程,效率都比较低,另一方面,回收产生的内存碎片比较多。怎么理解内存碎片呢,可以把一块内存想象成一个长方形,每创建一个对象时,在这个长方形中划分一块面积出来,用来存储这个对象。当创建的对象过多,回收不连续的对象后,整个内存将不连续,如果再创建一个比较大的对象时,或许在这些内存碎片中找不到一个碎片能容纳这个对象,这样便导致了OutOfMemoryException,但是其实所有的内存碎片加起来,是可以存下这个对象的。
  ● 复制算法
复制算法,即将内存分为大小相等的两块,在进行垃圾回收时,将其中一块内存中需要回收的对象全部复制到另一块内存,然后再全部清除这一块内存。下一次回收时,则使用同样的方式。即两块内存交替工作。
这样的好处是,解决了标记清除算法的不足,效率方面,不再进行逐个标记,逐个清除。内存碎片方面,不会产生内存碎片,所有的对象都是连续存放的。
但是复制算法有一个不足是,内存进行了减半,这样很浪费内存。幸运的是,研究表明,大多对象都是朝生夕灭,其中有98%的对象是可以进行回收的。也就是说,存活的对象,仅仅占2%左右。所以,虚拟机设计者,又将新生代内存细分为:一个Eden区,占内存的80%,和两个大小相等的Survivor区,每个Survivor占10%。Survivor区中用来存储复制存活的对象。而整个内存中,有90%(一个Eden区加一个Survivor区)的内存可用来创建对象。当然,在从新生代中复制存活对象到另一个空闲Survivor区时,并不能保证这个空闲的Survivor区大小一定能保存下这些被对象,这时,老年代将会分担出一部分内存来帮助Survivor存储。
复制算法是一个很好的算法,大部分虚拟机在对新生代堆内存进行回收时使用的都是这种算法。
  ● 标记—整理算法
标记整理算法是通过标记清除算法延伸过来的,它主要的清除对象是老年代,通过上面的复制算法可以看出,复制交换时,如果Survivor区存不下存活的对象,一部分对象将会被存在老年代中,所以老年代也需要进行回收,当然老年代的垃圾回收远没有新生代频繁。
标记整理算法,主要是用来弥补标记清除算法空间碎片的不足,它的过程是:先将存活的对象标记,然后再进行移动,将所有存活的对象移动到某一端(可以想象从一个矩形的左边移动到右边),然后以这一段为边界,集中清理端以外的对象。这样就没有内存碎片产生了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值