没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
GC: (Garbage Collecon,垃圾收集,垃圾回收)
程序计数器, 虚拟机栈,本地方法三个区随线程而生,随线程而灭。
其中栈中的栈帧随方法的进入和退出而有条不紊的执行着出栈入栈操作。
垃圾回收针对的区域:
堆和方法区(主要还是堆)
很多人认为方法区(或者 虚拟机中的永久代)是没有垃圾收集的, 虚拟机规
范中确实说过可以不要求虚拟机在方法区实现垃圾收集,而且在 方法区进行垃圾收集的
“性价比”一般比较低:在堆中,尤其是在新生代中,常规应用进行一次垃圾收集一般可以
回收 的空间,而永久代的垃圾收集 效率远低于此。
无用的类”:
该类所有的实例都已经被回收,也就是 Java 堆中不存在该类的任何实例。
加载该类的 ClassLoader 已经被回收。
该类对应的 java.lang.Class 对象没有在任何地方被引用,无法在任何地方通过反射访问
该类的方法。
虚拟机可以对满足上述 3 个条件的无用类进行回收,这里说的仅仅是“可以”,
而不是和对象一样,不使用了就必然会回收。
垃圾收集器:主要处理的问题
)哪些对象需要回收?
)何时回收这些对象?
)如何回收这些对象?
垃圾回收算法:
1.引用计数器法
方法描述:给对象中添加一个计数器,每当有一个地方应用它时,计数器值就加 ;每当
引用失效时,计数器值就减 任何计数器为 的对象就是不可能在使用的对象。
优点:实现简单,判定效率高。
缺点:无法解决对象之间循环引用的问题。(比如 引用了 , 也引用了 ,除此之外这
两个对象再无其他引用。此时这两个对象已经无法在被访问了,但由于计数器不
为 ,无法回收他们。)
注:主流虚拟机不采用引用计数器法管理内存。
采用可达性分析算法(根搜索算法):判断对象是否存活。
即:通过一系列称为“的对象作为起点,从这些节点开始向下搜索,搜索所走
过的路径称为应用链,当一个对象到 没有任何引用链相连(用图论的
话来说就是从 到这个对象不可达)时,则证明此对象是不可用的。
在 Java 语言里,可作为 GC Roots 的对象包括下面几种:
虚拟机栈(栈帧中的本地变量表)中的引用的对象。
方法区中的类静态属性引用的对象。
方法区中的常量引用的对象。
本地方法栈中 JNI(即一般说的 Native 方法)的引用的对象。
2.标记清除算法
方法描述: 算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象一种可行
实现:在标记阶段,首先通过根节点,标记所有从根节点可达的对象 ,在标
记完成后统一回收掉所有被标记的对象
优点:
缺点:一个是效率问题,标记和清除过程的效率都不高;另外一个是空间问题,标记清除
之
后会产生大量不连续的内存碎片,空间碎片太多可能会导致,当程序在以后的运行
过
程中需要分配较大对象时无法找到足够的连续内存而不得不提前触发另一次垃圾收
集动作。
回收后的空间是不连续的。(在对象的堆空间分配过程中,尤其是大对象的内存分
配,不连续空的工作效率要低于连续的空间)
3.复制算法/改进的复制算法 ----------现在的商业虚拟机都采用这种收集算法来回收新生代
复制算法:
方法描述:它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一
块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用
过的内存 空间一次清理掉。这样使得每次都是对其中的一块进行内存回收,内
存分配时也就不用考虑内存碎片等复杂情况,只要移动堆顶指针,按顺序分配
内存即可,实现简 单,运行高效。
缺点: 只是这种算法的代价是将内存缩小为原来的一半,未免太高了一点。
改进的复制算法:
方法描述:新生代中的对象绝大部分是朝生夕死的,并不需要按照 ∶ 的比例来划分内存
空间,而是将内存分为一块较大的 !" 空间和两块较小的 #$%$ 空间,每次
使用 !" 和其中的一块 #$%$。当回收时,将 !" 和 #$%$ 中还存活着的
对象一次性地拷贝到另外一块 #$%$ 空间上,最后清理掉 !" 和刚才用 过的
#$%$ 的空间。 虚拟机默认 !" 和 #$%$ 的大小比例是 &∶,也就
是每次新生代中可用内存空间为整个新生代容量 的 (&'),只有
的内存是会被“浪费”的。当然,&的对象可回收只是一般场景下的数据,
我们没有办法保证每次回收都只有不多于 的对象存活,当 #$%$ 空间不
够 用 时 , 需 要 依 赖 其 他 内 存 ( 这 里 指 老 年 代 ) 进 行 分 配 担 保 ( " (!
)$*+")
内存的分配担保也一样,如果另外一块 #$%$ 空间没有足够的空间存放上一
次新生代收集下来的存活对象,这些对象将直接通过分配担保机制进入老年代。
4.标记压缩算法(标记整理算法)
复制收集算法在对象存活率较高时就要执行较多的复制操作,效率将会变低。
更关键的是,如果不想浪费 的空间,就需要有额外的空间进行分配担保,
以应对被使用的内存中所有对象都 存活的极端情况,所以在老年代一般不
能直接选用这种算法。
方法描述:标记过程仍然与“标记清除”算法一样,但后续步骤不是直接对可回收对象进行
清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内
存
5.增量算法
方法描述:如果一次性将所有垃圾进行处理,需要造成系统长时间的停顿,那么就可以让
垃圾收集线程与应用程序线程交替执行
优点:减少系统停顿时间
缺点: 线程切换,和上下文转换的消耗,会使得垃圾回收的总体成本上升,造成系统吞吐
量下降。
6.分代
方法描述:根据对象的存活周期的不同将内存划分为几块
一般是把 堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集
算法。在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量 存活,那就选用
复制算法,只需要付出少量存活对象的复制成本就可以完成收集。而老年代中因为对象存
活率高、没有额外空间对它进行分配担保,就必须使用“标 记清理”或“标记整理”算法来
进行回收。
垃圾收集器:
新生代串行收集器(!$%(收集器)采用,复制算法
剩余13页未读,继续阅读
资源评论
悠闲饭团
- 粉丝: 151
- 资源: 3303
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功