zoukankan      html  css  js  c++  java
  • 垃圾收集器与内存分配策略

    垃圾收集器与内存分配策略

    一、GC收集器

    1、GC回收需要思考的三件事:

    a) 如何判断哪些内存需要回收?

    b) 用什么回收?

    c) 什么时候进行回收?

    以下分别针对这个几个问题进行说明。

    问题1:如何判断哪些内存需要回收?

    判断方法有两种(HotSpot默认采用第二种):

    1.引用计数算法

    给对象添加一个引用计数器,每当一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器都为0的对象就是不可能再被使用的。

    2. 根搜索算法

    通过“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用堆,当一个对象到GCRoots 没有任何引用链相连,则证明此对象是不可用的。在java中可以做为GC Root对象的引用对象有下面几种:

    虚拟机栈中引用的对象;

    方法区中的类静态属性引用的对象;

    方法区中常量引用的对象;

    native方法引用的对象;

    注:1) 每个对象的finalize()方法都只会被系统自动调用一次。

    2) 在根搜索算法中不可达的对象,并不是“非死不可”的。这种对象可以进行自我拯救,在调用finalize()方法时将自己重新与引用链上的任何一个对象建立关联即可。但是如果面临对象的下一次回收,就无法进行自救了。

    问题2:用什么回收?

    用垃圾收集器进行回收,垃圾收集器基于垃圾算法进行垃圾回收的。

    下面先介绍垃圾收集算法:

    1. 标记-清除算法(最基础算法、适用于老年代)

    原理: 算法分为两个标记和清除两个阶段,首先标记(根搜索算法)出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。

    缺点:效率问题,在标记和清除过程中的效率都不高;空间问题,标记清除之后会产生大量的碎片,给以后的运行程序无法分配连续的内存.

    2.复制算法(适用于新生代)

    原理: 将可用的内存按容量分为大小相等的两块,每次只使用其中的一块,当这一块内存用完了,就将还存活着的对象复制到另一块上去,然后再把已使用过的内存空间一次清理掉。

    1. 标记-整理算法(适用于老年代)

    标记过程基于标记-清除算法一样,后续步骤是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。

    接下来介绍垃圾收集器:

    1. Serial收集器(复制算法):最悠久的收集器。特性:单线程收集器,在进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束(STW)。在Client模式下的虚拟机中选择Serial收集器是个很好的选择。

    2. ParNew收集器(复制算法):Serial收集器的多线程版本。是许多运行在Server模式下的虚拟机中首选的新生代收集器。

    3. Parallel Scanvenge收集器(复制算法):并行又多线程的收集器,高吞吐量(运行代码时间/运行代码时间+垃圾收集时间)。

    4. Serial old收集器(标记整理)

    5. Parallel old收集器(标记整理算法):主要与Parallel scanvenge收集器进行合并使用。

    6. CMS收集器(标记清除法)

    二、内存分配与回收策略  

    1、对象优先在Eden分配;当Eden区没有足够的空间进行分配时,虚拟机将发起一次MinorGC(新生代GC)。

    2、大对象直接进入老年代。(有参数设置允许分配最大对象的内存大小)

    3、长期存活的对象将进入老年代。(默认年龄15,也可设置)

    4、动态年龄判断:如果在Survivor空间中相同年龄所有对象的大小的综合大于 Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代(不受参数限制了)

    5、空间分配担保

    Minor GC时,vm会检测每次晋升老年代的平均大小是否大于老年代的剩余空间大小,如果大于,直接改为Full GC。如果小于,查看是否允许担保;如果允许则进行Minor GC;如果不允许则进行Full GC。(问题3:什么时候回收? )

  • 相关阅读:
    模拟登陆江西理工大学教务系统
    python3爬虫 -----华东交大校园新闻爬取与数据分析
    以selenium模拟登陆12306
    PAT (Basic Level) Practice (中文)1076 Wifi密码 (15 分)
    PAT (Basic Level) Practice (中文)1047 编程团体赛 (20 分)
    PAT (Basic Level) Practice (中文)1029 旧键盘 (20 分)
    PAT (Basic Level) Practice (中文)1016 部分A+B (15 分)
    PAT (Basic Level) Practice (中文)1031 查验身份证 (15 分)
    PAT (Basic Level) Practice (中文)1041 考试座位号 (15 分)
    PAT (Basic Level) Practice (中文)1037 在霍格沃茨找零钱 (20 分)
  • 原文地址:https://www.cnblogs.com/yuanfy008/p/6130384.html
Copyright © 2011-2022 走看看