由于阅读的资料较少,先写下现在的肤浅认识,待以后有更深层次的理解再修改。
关于垃圾回收机制,本人现在知道的是三种。
1.引用计数机制。(浅显的看了下Object-C语法,貌似其对象回用的是这种机制)
2.标记-清理机制。(C采用了保守的标记-清理机制)
3.java的自适应回收机制,综合用了引用计数,标记-清理,核心是停止-复制。
引用计数机制中每个对象都有一个引用计数器,当有对象指向该引用时,引用计数器加1.一个列表记录着对象和其引用数(估计组织成搜索树吧),垃圾回收期在程序的生命进程中一直修改引用计数器和遍历列表,出现循环引用相当麻烦。
标记-清理机制,对C来说从每个根节点(个人理解为进程虚拟地址空间中的栈区最先被malloc的块??)出发,遍历该块(根节点块)并对该快的每个字递归调用mark方法。清理以后,堆空间是不连续的。(产生了内部碎片)有点是垃圾少的时候很管用,块分配的越多,产生外部碎片越多,管理也越吃力。
停止-复制机制对于碎片整理相当给力,因为它停止程序,将它认为是活的对象从当前堆复制到另外一个堆,没被复制的都垃圾,而且复制以后的对象都是紧密排列的。看起来挺棒的,问题是怎样它怎样判断对象是或的;可能还存在一个问题,垃圾很少的时候或者没垃圾的时候,垃圾回收器来回的停止-复制(取决于垃圾回收器的回收策略),看起来有点傻的。
据java编程思想介绍,java虚拟机的垃圾回收采用的是自适应的,分代的,停止-复制,标记-清理的方法回收。详细来说将JVM内存以较大“块”为单位分配(减少碎片),引用计数给“块”而非对象,对快进行处理。当某块引用计数较多时,说明这个快上堆分配的多。JVM会监视垃圾回收器的效率,当对象稳定但回收期效率却低,肯定是停止-复制在俩个堆里来回倒。这时候切换到标记-清理的机制划算。标记-清理机制用了很久了,碎片一大堆的时候,这种机制肯定慢下来了。这时候就是停止-复制表现了。
基本这样,由于本人没看过JVM相关资料,以后看了再补。
浙公网安备 33010602011771号