CSDN|超详解读:垃圾回收机制 | 原力计划( 二 )
本文插图
3、复制(Coping)算法为了解决标记清除(Mark-Sweep)算法内存碎片化的缺陷而被提出的算法 。 按内存容量将内存划分为等大小的两块 。 每次只使用其中一块 , 当这一块内存满后将尚存活的对象复制到另一块上去 , 把已使用的内存清掉 , 如图 。 这种算法虽然实现简单 , 内存效率高 , 不易产生碎片 , 但是最大的问题是可用内存被压缩到了原本的一半 。 且存活对象增多的话 , Copying算法的效率会大大降低 。
本文插图
4、分代收集(Generational Collection)算法分代收集法是目前大部分JVM所采用的方法 , 其核心思想是根据对象存活的不同生命周期将内存划分为不同的域 , 一般情况下将GC堆划分为老生代(Tenured/Old Generation)和新生代(YoungGeneration) 。 老生代的特点是每次垃圾回收时只有少量对象需要被回收 , 新生代的特点是每次垃圾回收时都有大量垃圾需要被回收 , 因此可以根据不同区域选择不同的算法 。目前大部分JVM的GC对于新生代都采取Copying算法 , 因为新生代中每次垃圾回收都要回收大部分对象 , 即要复制的操作比较少 , 但通常并不是按照1:1来划分新生代 。 一般将新生代划分为一块较大的Eden空间和两个较小的Survivor空间(From Space, To Space) , 每次使用Eden空间和其中的一块Survivor空间 , 当进行回收时 , 将该两块空间中还存活的对象复制到另一块Survivor空间中 。而老生代因为每次只回收少量对象 , 因而采用Mark-Compact算法 。
- Young区分为Eden区和两个Survivor区域 , 其中所有新创建的对象都在Eden区 , 当Eden区满后会触发minor GC将仍然存活的对象复制到其中一个Survivor区域中 , 另外一个Survivor区域中的存活对象也复制到这个Survivor区域中 , 保证始终有一个Survivor区域时空的 。
- 当Eden区域满后会将对象存放到Survivor区域中 , 如果Survivor区域仍然存放不下这些对象 , GC收集器会将这些对象直接存放到Old区域 。 如果在Survivor区域中的对象足够老 , 也直接存放到Old区域中 。 如果Old区域也满了 , 将会触发Full GC , 回收整个堆内存 。
- Perm区域存放的主要是类的Class对象 , 如果一个类被频繁地加载 , 也可能会导致Perm区满 , Perm区的垃圾回收也是由Full GC触发的 。
你点的每个“在看” , 我都认真当成了喜欢
推荐阅读
- 区块链|欧科云链任煜男做客西安广电电台节目,解读区块链如何赋能实体产业
- 京东,折叠屏手机|围绕柔性屏的技术、特性、应用、产业化进行了非常专业的解读
- CSDN|由 Apache 说开,中国开源项目已经走向世界!
- CSDN|软件对于英特尔意味着什么?
- 中年|语音识别技术发展迅速,你需要全方位解读语音识别的最新著作
- CSDN|中国首家苹果零售店重开业,苹果CEO库克发文揭幕;“携号转网”服务用户破千万;GitHub 完成北极源代码存档|极客头条
- 智能机器人|快商通智能客服云平台荣获CSDN“AI优秀案例实践奖”
- CSDN|万亿美元软件浪潮来临,开发者是核心!
- 行业互联网|快商通智能客服云平台荣获CSDN“AI优秀案例实践奖”
- CSDN|OpenInfra Days China 2020 官网正式上线,含免费注册通道!
