动态内存管理
管理的是动态内存,比如c语言可以用malloc()分配动态内存
和同一片内存释放两次以及使用了被释放的内存会导致很多错误。
自动内存管理
Mutator :业务线程,分配解析对象,修改对象指向关系
Serial GC:只有一个collector
在执行GC时会暂停业务线程,而且只有一个collector
Parallel GC:有多个collector同时执行,但还是有暂停
Concurrent GC:业务线程和GC线程可以同时执行
实现“感知对象指向关系的改变”的方法:三色标记 混合写屏障
追踪垃圾回收
首先把静态变量、全局变量、常量、线程栈这些指针所指向的对象标记为存活,因为这些根对象我们之后肯定要使用。
在根据第一步标记的根对象,找到所有可达的对象
copying gc:把存活的对象从当前大的内存区域复制到一个新的内存区域,这样原来大的内存区域就可以清空
mark-sweep gc:使用free list管理内存
Mark-compact gc:没有额外的内存空间了,把存活的内存拷贝压缩到内存空间的最开始,和copying gc很像
分代GC
因为年轻对象和年老对象的生命周期不同,所以我们可以把年轻对象和年老对象分在不同的堆中,使用不同的内存管理策略
引用计数
每个对象都有一个与之关联的引用数目,对象存活的条件是当且仅当引用数大于0。
函数内联
c++中就有这样的操作,需要在函数声明时加inline即可实现函数内联
其实就是用函数体(函数内部的代码),替换原本函数位置的代码,这样做的好处在于能够节省程序返回调用函数的代码的时间,与之相对的,空间复杂度会增加,因为程序每执行一次内联函数就会保存一个函数的复制体。