《深入理解Java虚拟机》笔记2

都知道Java对内存是自动垃圾回收的,什么样的内存是可以回收的?

这个问题是值得思考的。

对象已死的判定方法有两种:

(1)引用计数器法

给对象添加一个引用计数器,有一个地方用到此对象,计数器加一。

引用失效,计数器减一。这个判断方法实现应该简单,但是Java不用。

因为对象间的循环引用不好解决。

但是作者说微软的com技术,python等用的是这种算法。

com完全不懂,但是python难道不会遇到循环引用的问题吗?

等有时间研究下python的内存管理。

(2)根搜索算法

从gc roots开始搜索,可达的对象是存活的,不可达的对象进行回收。

这个也很容易理解。当执行到某个方法某个命令时,如果需要垃圾回收,

则把当前的方法栈当做分析开始点。当然一些全局性的对象需要考虑。

如果是函数式编程应该只考虑当前栈,我感觉。

可作为gc roots的对错有下面几种:

①虚拟机栈中引用的对象

在方法中创建的局部引用关联对象

②本地方法栈jni的引用对象

方法换成了native,道理同①。

③方法区中类静态属性引用的对象

所谓方法区在上篇中写过了,其实就是存放常态信息的

下面代码中的a如果有引用的对象,就是这种情况

④方法区中常量引用的对象

下面代码中b应该是这种情况

class   AClass{
    static AClass  a;
    final static AClass   b=  new   AClass();

     //当前执行方法method…
}
原文地址:https://www.cnblogs.com/zwm512327/p/3525717.html