java中垃圾的定义
当一个对象没有被任何引用指向 或 对象存在循环引用(没有被根部引用),即这个对象会被视作垃圾。
image.png
java垃圾回收机制
自动内存回收
编程相对简单,系统不易出错
但是性能会有一定的影响
如何定位垃圾
引用计数(ReferenceCount)(单个对象):引用的增加和减少都被记录,而引用为0的时候,就认为是垃圾
根可达算法(java RootSearching)(多个对象):以根为起点顺藤摸瓜,能摸到的都不是垃圾。
Java中那些被认为是根呢?
JVMstack:JVM栈里面的(因为栈里面的东西由操作系统自动回收,所有栈里面还有的对象认为是存活的对象)
native method stack:本地方法栈里面的
runtime constant pool:常量池里面的
static:静态的引用
class:加载到内存中的类(类会在new、getstatic、putstatic、invokestatic时加载到内存中,即new类、获取和设置静态变量、调用静态方法时被加载,加载之后将不会被自动回收,也不再重新加载)
常见的垃圾回收算法
标记清除(mark sweep) - 位置不连续 产生碎片 效率偏低(两遍扫描)
image.png
image.png拷贝算法 (copying) - 没有碎片,浪费空间
image.png
image.png
image.png
标记压缩(mark compact) - 没有碎片,效率偏低(两遍扫描,指针需要调整)
image.png
网友评论