JVM虚拟机01:程序的栈(栈帧stack frame)和堆
首先我们之前就可以,GC(垃圾回收机制)是针对于内存在堆中的回收的?
所以什么是垃圾?
垃圾就是内存中无用实例。
看下图,如果对象B还指向对象实例B的话,那么就说明,
对象B是被引用的,不是垃圾,但是在图中,变量B已经没有引用对象了,所以实例没有被引用,也就是我们垃圾
GC回收方式一共有两种:
(1)引用计数(Reference Count)Python参考文章:引用计数-百度百科
也就说针对某一个对象进行计数?
引用减少,则计数减少:
当还有三个对象进行引用的时候:
两个对象引用:
一个对象引用:
变成0(垃圾)
当计数为0的时候,就会标记为垃圾
这样有一个不好的地方在于:
特例
三个对象相互引用,则会导致照不出来
也就说,从某个最开始变量或者方法开始,能够找到则不是方法,如果找不到那么就是方法。
如图
自上世纪60年代开始:只有这三种
(1)Mark-Sweep(标记清除)
(2)Copying(拷贝)
(3)Mark-Compact(标记压缩)
详解如下:
在上述中,找到垃圾标记,之后直接清除
、但是这样有一个缺点
标记清除的缺点就是,会造成内存空间碎片化,也就说在开辟一片比较大的连续内存时候,就会出现内存不足的情况。
拷贝,则是将内存分为两块,一边是原生态A,一边是没有动过的空内存B
另外一遍是相较之前比较空的,所以当GC进来之后,就会从Root Search(根寻)找到非垃圾全部复制到另外一半内存B中并且排列好,
将内存A全部清除



