热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

gc算法和种类

2019独角兽企业重金招聘Python工程师标准>>> gc算法和种类

gc概念

 Java堆中各代分布:

gc算法和种类

图1:Java堆中各代分布

Young:主要是用来存放新生的对象。

Old:主要存放应用程序中生命周期长的内存对象。

Permanent:是指内存的永久保存区域,主要存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域. 它和和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。

根节点:

java通过可达性分析来判断对象是否存活。基本思想是通过一系列称为“GC roots”的对象作为起始点,可以作为根节点的是:

  •   虚拟机栈(栈帧中的本地变量表)中引用的对象
  •   本地方法栈中JNI(即一般说的Native方法)引用的对象
  •   方法区中类静态属性引用的对象
  •   方法区中常量引用的对象

作为GC Roots的节点主要在全局性的引用(例如常量或类静态属性)与执行上下文(例如栈帧中的本地变量)中。
虚拟机、本地方法栈这都是局部变量,某个方法执行完,某些局部使用的对象可以被回收。

引用计数法

对于一个对象A,只要有任何一个对象引用了A,则A的引用计数器就+1,当引用失效,引用计数器就减1.对象A的引用计数器的值为0时,则对象就不可能再被使用。

使用者:com,actionScript3,python 

gc算法和种类

引用计数法缺点:

1,引用和去引用伴随加法和减法,影响性能。

2,很难处理循环引用:

gc算法和种类

如上图:最后一张图的三个对象互相引用,虽然根对象无法达到这些对象,但是引用计数都是1,仍然无法被GC回收。

 

标记清除法

适用老年代

该算法有两个阶段:标记阶段、清除阶段。

标记阶段:从根节点开始搜索,但凡是根节点可以到达的对象,则标记为可达对象。

清除阶段:清除未被标记的对象。

gc算法和种类

标记压缩算法

该算法适用于存活对象较多的场合,如:老年代。

标记阶段:从根节点开始搜索,但凡是根节点可以到达的对象,则标记为可达对象。

清除阶段:将所有的存活对象压缩到内存的一端。然后清除边界外的所有空间。

gc算法和种类

 

优点

  1. 相对复制算法提高堆的利用率。
  2. 相对清除算法不会产生碎片。

 

复制算法

将原有的内存空间分为两块(两个绝对大小相等,实际有额外一块空间老年代做担保,用于存放大对象和老年对象),每次使用其中一块,在垃圾回收时,将正在使用的内存中的存活对象复制到未使用的内存块中,之后,清除正在使用的内存中所有对象,交换两个内存角色,完成垃圾回收。

 

gc算法和种类

小的对象,年轻的对象复制到对面的空间中。大对象、老年对象复制到老年代中。

优缺点:

与标记-清除算法相比,复制算法是一种相对高效的回收算法

不适合存活对象较多的场合 如老年代

浪费内存空间

 

分代思想

根据对象的生命周期进行分类,短命对象归为新生代,长命对象归为老年代。

根据不通代的特点,选取合适的收集算法:

1,少量存活对象,适合用复制算法

2,大量存活对象,适合标记清除或者标记压缩算法。

 

可触性

1,可以触及的

    从根节点可以触及到这个对象。

gc算法和种类

2,可以复活的

    一旦所有引用被释放,就是可复活状态,因为在finalize()中可能复活该对象。finalize()方法调用后,该对象就不可以复活了。

3,不可以触及的

    在finalize()后,可能会进入不可触及状态,不可以触及的对象不可能复活,但是可以回收。

 

stop-the-world

java中一种全局暂停的现象,全局停顿,所有java代码停止,native代码可以执行,但是不能与jvm交互。

被引起的原因:

     GC,Dump线程,死锁检查,堆Dump

gc算法和种类

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

转载于:https://my.oschina.net/appleliu/blog/1631698


推荐阅读
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • 初识java关于JDK、JRE、JVM 了解一下 ... [详细]
  • 生产环境下JVM调优参数的设置实例
     正文前先来一波福利推荐: 福利一:百万年薪架构师视频,该视频可以学到很多东西,是本人花钱买的VIP课程,学习消化了一年,为了支持一下女朋友公众号也方便大家学习,共享给大家。福利二 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
  • 本文介绍了RxJava在Android开发中的广泛应用以及其在事件总线(Event Bus)实现中的使用方法。RxJava是一种基于观察者模式的异步java库,可以提高开发效率、降低维护成本。通过RxJava,开发者可以实现事件的异步处理和链式操作。对于已经具备RxJava基础的开发者来说,本文将详细介绍如何利用RxJava实现事件总线,并提供了使用建议。 ... [详细]
  • Mono为何能跨平台
    概念JIT编译(JITcompilation),运行时需要代码时,将Microsoft中间语言(MSIL)转换为机器码的编译。CLR(CommonLa ... [详细]
  • Python中程序员的面试题有哪些
    小编给大家分享一下Python中程序员的面试题有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有 ... [详细]
  • PriorityQueue源码分析
     publicbooleanhasNext(){returncursor<size||(forgetMeNot!null&am ... [详细]
  • 尾部|柜台_Java并发线程池篇附场景分析
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java并发-线程池篇-附场景分析相关的知识,希望对你有一定的参考价值。作者:汤圆个人博客 ... [详细]
  • java实例,java实例化对象的方法
    本文目录一览:1、java中实例和对象有什么区别 ... [详细]
  • CentOs 7.3中搭建RabbitMQ 3.6单机多实例服务的步骤与使用
    CentOs7.3中搭建RabbitMQ3.6单机多实例服务的步骤与使用-RabbitMQ简介RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户 ... [详细]
  • 现在不少人开始关注并学习Flex了(至少比以前多了),但是现在关于Flex的资料并不多,国内的资料就更少了,而 ... [详细]
author-avatar
yico承诺
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有