五、按生命周期划分数据(二)

变量的生命周期,大概的意思就是这个变量的有效期。

神仙阶层:global和static数据,能拥有和程序世界等长的

亲信部队:分配在栈区(空间不大,一个线程对应一个),栈区空间的分配和回收由操作系统直接接管。

int function(int a ){
     int count  = 10;  
}

这个count的生命周期以进入这个函数体开始,离开这个函数体便结束了。从开始到结束的过程完全不需要程序员控制。

平民百姓:他们分配在堆区,堆区数据的生死,操作系统是不管的,必须由程序自己管理。在手动或半手动管理内存的语言里,了解每个对象的生命周期是基本功,并时刻注意管理内存。

例如:

Person person = new Person();

或者通过反射

Person person = personClass.newInstance();

这个引用既可能在栈区,也可能在堆区,但她所指的内存空间一定在堆区。

垃圾回收机制

  很多高级语言都有强大的垃圾收集器辅助,实现了全自动内存管理,所以堆区数据带来的麻烦并不明显。其中最主流的算法有两种:

  引用计数算法;

  可达性遍历算法。

  引用计数算法的核心是计算引用计数。当一个对象没有任何引用时,就可以消亡了。但是解决不了循环引用的对象。

  可达性遍历算法,就要用到全局数据和静态数据“与天同寿”的特点了,以他们为起点,建立一条条访问链条,如果有对象不存在任何一条访问链条,就意味着它将是可被清除的。

 

posted @ 2020-02-25 21:04  天凉好个秋秋  阅读(263)  评论(0编辑  收藏  举报