• 深入JVM内核---GC算法


            GC(Garbage Collection)垃圾收集,即将内存分为几个区域,将不同的生命周期的对象放在不同区域里,在GC收集的时候,频繁收集生命周期短的区域(young).比较少的收集生命周期较长的区域(old),基本不收集的永久区(perm).1960年List使用了GC,java中,GC的对象是堆空间和永久区,GC的作用是自动检测对象是否超过作用域从而自动回收内存.防止人为的引入导致内存的泄露.

    GC算法:

           ---标记清除法

           ---标记压缩法

           ---复制算法

           ---引用计数法


    1.标记---清除

            标记---清除算法是现代垃圾回收算法的思想基础.标记---清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段.一种可行的实现是,在标记阶段,首先通过根节点,标记所有从根节点开始的可达对象.因此,未被标记的对象就是未被引用的垃圾对象.然后,在清除阶段,清除所有为被标记的对象.




    优点:

             解决了循环引用的问题

    缺点:

            (1)暂停整个应用

            (2)会产生内存碎片

            (3)不管这个对象是否可达,是否为垃圾,都要在清除阶段被检查一遍,非常耗时.

    2.标记---压缩

           标记---压缩算法适合用于存活对象比较多的场合,如老年代.它在标记---清除算法的基础上做了一些优化.和标记---清除算法一样,标记---压缩算法也首先需要从根节点开始,对所有可达对象做一次标记.但之后它并不简单的清理未标记的对象,而是将所有的存活对象压缩到内存的一端.之后,清理边界外所有的空间.




    优点:

            (1)避免标记扫描的碎片问题

            (2)避免停止复制的空间问题

    缺点:

            同标记---清除法.

    3.复制算法

    与标记---清除算法相比,复制算法是一种相对高效的回收方法.不适用于存活对象较多的场合 如老年代.

    复制算法是将原有的内存空间分为两块,每次只使用其中一块,在垃圾回收时,将正在使用的内存中的存活对象复制到未使用的内存块中,之后,清除正在使用的内存块中的所有对象,交换两个内存的角色,完成垃圾回收.



    优点:

            不会出现碎片问题

    缺点:

            (1)暂停整个应用

            (2)需要2倍的内存空间


    4.引用计数法

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






    缺点:

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

             很难处理循环引用.    


    分代思想:

    依据对象的存活周期进行分类,短命对象归为新生代,长命对象归为老年代.


    young:主要用来存放新生的对象

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

    permanent:内存的永久保存区域,主要存放class和meta的信息.class在被load的时候被放到永久保存区域,他和存放instance的堆区域不同,GC不会在主程序运行期对永久保存区域进行清理.所以如果你的APP会load很多class的话,就会出现PermGen space错误.在java8中,已经没有了这个permanent代,只有在HotspotVM中有.

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

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

            大量对象存活,适合标记清理或者标记压缩

  • 相关阅读:
    网站变灰代码,网页整体变灰源代码方法表示哀悼(站点哀悼代码之用)
    前端应该了解的hosts文件作用
    谷歌打开 产品的原型文件
    把网页打包成APP
    HBuilderX连接安卓模拟器
    EBS: Form Tab Canvas的时候遇到的问题(frm41053:找不到画布)
    EBS: Form Builder 的公式程序中不支持over()分组
    EBS: ORA01658: unable to create INITIAL extent
    WPS不能编辑
    Excel: 从左边对字符串使用指定的字符进行填充LPAD()
  • 原文地址:https://www.cnblogs.com/chenxiaochan/p/7253399.html
Copyright © 2020-2023  润新知