构造性能的度量,原则与方法
1.内存管理模式:堆 栈
操作系统的内存映射已经在深入理解计算机系统这门课中学习过了。
内存对象模型
每个对象存储在内存的一段连续空间之中。
对象在堆中分配内存,对象引用指向对象指向对象在堆中的起始地址,非基本数据类型的变量等价于对象引用。一个引用指向一个其他对象,一个对象可以被多个引用指向。
对象管理的模式
三种:静态,基于堆,基于栈
静态内存分配:在编译阶段就已经确定分配的内存
基于栈的和基于堆的都是动态内存分配:运行时分配内存,建立新的内存对象。
static mode
将程序load进内存的时候或开始执行的时候,确定所有对象的分配,不支持递归,不支持动态创建可边长的复杂数据类型。
stack-based mode
栈存储方法调用及方法执行过程中的内部数据,新进后出,无法支持复杂的数据类型。
heap-based mode
堆:将内存分为多个小块,每块包含一个对象或者未被占用。自由的内存管理模式,可管理复杂的动态数据结构。
Java内存管理模型
主要问题:如何在堆上创建新对象,当对象不再有引用指向时,如何删除对象,释放内存
(1)Stack:
每个线程之间都有自己的栈,各线程之间彼此不可见,多线程之间传递数据,是通过复制而非引用
所有的基本数据类型都在栈上创建
(2)Heap:
所有的对象都在堆上创建,局部变量的对象也是在堆上创建。
堆上创建的对象可以被所有线程共享引用,如果两个线程同时调用同一个对象的某个方法,他们分别保留这个方法的局部拷贝。
GC
三种模式下的内存回收:
(1)static:无需内存回收,所有的都是已经确定的
(2)stack:按照block整体进行
(3)heap:较复杂
内存回收:
(1)对象的活性:
对象之间的引用关系构成了有向图,从root可以到达的对象成为活对象,不可达的对象为死对象
(2)垃圾回收
垃圾回收器根据对象活性判断是否需要回收,死对象需要被回收。
非自动垃圾回收
全靠程序员手动回收垃圾,主要有一下方法
1.防御式编程:复制对象而非引用,在局部回收内存
2.配对原则:有new操作就有对应的delete()操作
GC的四种基本算法
引用计数
为每个object