五、按生命周期划分数据(二)
变量的生命周期,大概的意思就是这个变量的有效期。
神仙阶层:global和static数据,能拥有和程序世界等长的
亲信部队:分配在栈区(空间不大,一个线程对应一个),栈区空间的分配和回收由操作系统直接接管。
int function(int a ){ int count = 10; }
这个count的生命周期以进入这个函数体开始,离开这个函数体便结束了。从开始到结束的过程完全不需要程序员控制。
平民百姓:他们分配在堆区,堆区数据的生死,操作系统是不管的,必须由程序自己管理。在手动或半手动管理内存的语言里,了解每个对象的生命周期是基本功,并时刻注意管理内存。
例如:
Person person = new Person();
或者通过反射
Person person = personClass.newInstance();
这个引用既可能在栈区,也可能在堆区,但她所指的内存空间一定在堆区。
垃圾回收机制
很多高级语言都有强大的垃圾收集器辅助,实现了全自动内存管理,所以堆区数据带来的麻烦并不明显。其中最主流的算法有两种:
引用计数算法;
可达性遍历算法。
引用计数算法的核心是计算引用计数。当一个对象没有任何引用时,就可以消亡了。但是解决不了循环引用的对象。
可达性遍历算法,就要用到全局数据和静态数据“与天同寿”的特点了,以他们为起点,建立一条条访问链条,如果有对象不存在任何一条访问链条,就意味着它将是可被清除的。