好友
阅读权限10
听众
最后登录1970-1-1
|
java与C/C++最大的不同就是C/C++需要我们自己去管理内存,决定什么时候分配与回收,但是java有jvm虚拟机替我们管理内存的分配与回收,但是jvm又怎么去回收那些不使用的内存呢?
1.判断对象能否被回收算法
1.1 引用计数法
给对象添加一个引用计数器,每当有一个地方引用计数器就加1,当引用失效时计数器减1.任何时刻计数器为0的对象都是可以回收的对象。
1.2 可达性算法
通过一系列被称为“GC Roots”的对象作为起点,从这些节点向下搜索,搜索所走过的路径被称为“引用链”,当一个对象到GC Roots没有引用链相连时,则证明此对象是不可用的,可回收。
2.垃圾收集算法
2.1 标记-清除算法 分为“标记”和“清除”两个阶段,首先标记出需要回收的对象,在标记完后统一回收所有标记的对 象。有两个不足:一个是效率问题,标记和清除过程效率都不高;一个是空间问题,标记清除后会产生大量不连续的内存碎片,内存碎片太多可能会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前出发另一次垃圾收集动作。标记清除算法的执行过程如下:
2.2 复制算法
为了解决效率问题,复制算法出现了。将内存按容量分为大小相等的两块,每次只使用其中的一块,当这一块内存用完了,就将还活着的对象复制到另外一块上面,然后将已使用过的空间一次清理掉。
2.3 标记-整理算法
和标记清除算法差不多,都是先标记要回收的对象,但是接着的操作不是和标记清除算法一样,它是将存活的对象都移到一端,然后清理掉端边界以外的内存。
2.4 分代收集
根据对象存活周期的不同将内存划分为几块。一般把Java堆分为新生代和老年代,这样就可以根据各个代的特点采用最合适的收集算法。新生代中,每次收集都发现有大批对象死去,只有少量存活,就采用复制收集算法。而老年代中对象存活率高,没有额外空间对它进行分配担保,就必须使用标记--清理或标记--整理算法。
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|