`
sundful
  • 浏览: 1232666 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java的几种垃圾回收算法

阅读更多

垃圾回收算法要解决的两个基本问题:
1.必须检测到垃圾对象。
2.必须重新声明被垃圾对象占用的堆空间并且让堆空间可用。

两个概念:
A:可达性(reachability):一个对象是可达的,当且仅当从可执行程序的根集开始有引用路径能访问该对象。
B:根集(roots set)包括:
    1.局部变量的对象引用,栈元素以及任何类变量的对象引用。
    2.任何对象引用,如string。
    3.任何传递给本地方法的对象引用。
    4.JVM的运行时数据区的任何部分。


引用记数(referencecounting)
    这是一种不使用根集的垃圾回收算法。基本思想是:当对象创建并赋值时该对象的引用计数器置1,每当对象给任意变量赋值时,引用记数+1;一旦退出作用域则 引用记数-1。一旦引用记数变为0,则该对象可以被垃圾回收。引用记数有其相应的优势:对程序的执行来说,每次操作只需要花费很小块的时间。这对于不能被 过长中断的实时系统来说有着天然的优势。但也有其不足:不能够检测到环(两个对象的互相引用);同时在每次增加或者减少引用记数的时候比较费时间。在现代 的垃圾回收算法中,引用记数已经不再使用。

追踪算法(tracing)
     基于根集的最基本算法。基本思想是:每次从根集出发寻找所有的引用(称为活对象),每找到一个,则对其做出标记,当追踪完成之后,所有的未标记对象 便是需要回收的垃圾。追踪算法基于标记并清除。这个垃圾回收步骤分为两个阶段:在标记阶段,垃圾回收器遍历整棵引用树并标记每一个遇到的对象。在清除阶 段,未标记的对象被释放,并使其在内存中可用。

紧凑算法(compacting)
     在追踪算法中,每次被释放的对象会让堆空间出现碎片,这会使得内存的页面管理变得非常不稳定,可能在还有足够内存空间时就发生溢出,这对于本来就紧 张的JVM内存资源来说是非常不利的。由此出现了紧凑算法。基本思想是:在追踪算法进行垃圾回收的基础上,每次标记清扫时顺便将对象全部整理到内存的一 端,这样每次分配内存时便都能从顺序的空间开始。每次更新时,对象句柄都指向实际的对象,所有参考他的引用都将通过参考对象句柄来得到对象的实际位置。

拷贝算法(copying)
     这是另一种针对内存碎片的算法。基本思想是:将内存划分为两块,一块是当前正在使用;另一块是当前未用。每次分配时使用当前正在使用内存,当无可用 内存时,对该区域内存进行标记,并将标记的对象全部拷贝到当前未用内存区,这是反转两区域,即当前可用区域变为当前未用,而当前未用变为当前可用,继续执 行该算法。拷贝算法需要停止所有的程序活动,然后开始冗长而繁忙的copy工作。这点是其不利的地方。

分代算法(geneational)
     针对拷贝算法的不足,有的最新JVM采用了分代算法。其思想依据是:
     1.被大多数程序创建的大多数对象有着非常短的生存期。
     2.被大多数程序创建的部分对象有着非常长的生存期。
     简单拷贝算法的主要不足是它们花费了更多的时间去拷贝了一些长期生存的对象。分代算法的基本思想是:将内存区域分两块(或更多),其中一块代表年轻 代,另一块代表老的一代。针对不同的特点,对年轻一代的垃圾收集更为频繁,对老代的收集则较少,每次经过年轻一代的垃圾回收总会有未被收集的活对象,这些 活对象经过收集之后会增加成熟度,当成熟度到达一定程度,则将其放进老代内存块中。分代算法很好的实现了垃圾回收的动态性,同时避免了内存碎片,是目前许 多JVM使用的垃圾回收算法。

适应算法(adaptive)
     其主要思想是:在不同的条件下采用不同的回收算法。即动态改变垃圾回收策略。该算法对于垃圾回收的适应性和灵活性有着非常好的调整。

分享到:
评论

相关推荐

    Java垃圾回收算法的简易模拟实现.zip

    Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。

    今天会是有Offer的一天么:面试时被问到的JAVA中的垃圾收集算法

    前几天收到了美团实习生的面试通知...我们在进行垃圾回收的时候,首先要明白一点:什么样的对象会被回收掉?一定是已经“死亡”不再会被使用的对象。那怎么判断对象是否死亡或者存活呢。接下来我们就介绍两种判断对

    经典遗传算法的Java实现以及遗传算法实现自动组卷.zip

    Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。

    JAVA 版本:经典PHash算法.zip

    Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。

    Java版数据结构与算法.zip

    Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。

    java 实现微信抢红包算法.zip

    Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。

    Java实现FP-growth算法.zip

    Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。

    java基础练习demo,算法练习,leetecode操练.zip

    Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。

    java和android 通用的rsa 加密封装 在android中采用java的填充算法.zip

    java和android 通用的rsa 加密...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。

    java数据结构和算法实现.zip

    Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。

    韩顺平JAVA数据结构与算法,重点是算法!.zip

    Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。

    Java Garbage Collection 与各种GC算法.zip

    Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。

    关于学习笔记整理,包括Linux、Java、数据结构和算法,和一些IT工具的使用.zip

    Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。

    用于过滤java层的加密算法.zip

    Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。

    使用 java 进行算法推理.zip

    Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。

    深度学习java算法.zip

    Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。

    常用算法 Java 实现.zip

    Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。

Global site tag (gtag.js) - Google Analytics