GC垃圾回收不会涉及到虚拟机栈的
GC垃圾回收的几种基础算法
先言-将内存空间比喻为一个excel表格,每个单元格为存储的数据。
标记清除法:遍历,将非垃圾存储单元格进行标记,再将所有未标记的对象当做垃圾清除。这将带来内存碎片问题(因为存活对象的位置变得杂乱无章)
复制:将excel表一份为二,只用其一,在进行垃圾清扫时,将存活对象放到另一个侧,从新排列。这样就解决了会出现内存碎片问题。
标记整理法:前期同标记清除法一样去除垃圾,而后将存活对象向一端进行移动整理。
GC是如何判断垃圾的
判断对象是否为垃圾通常有两种方式
1.引用计数法 给对象一个引用计数器,用到它则+1,失效时-1,值为0即代表其为垃圾。
2.可达性分析法 想像一棵以GC Roots对象为根节点的树,子节点为其包含关联的对象。凡未在树中的对象,即为不可能被引用的对象,即垃圾。
JVM中,可作为GC Roots的有
虚拟机栈中引用的对象
本地方法栈中引用的对象
方法区中类静态属性引用的对象
方法区中常量引用的对象
java采用的是可达性分析法来判断垃圾。
Java内存分配和回收的机制
分代分配和回收,它综合了GC基础算法中的标记清除法和复制法。