如果我有一个正在做长时间工作的方法(例如进行 Web 服务调用),垃圾收集器是否查看该方法使用的内存并将其移动到不同的代,或者它是否忽略该方法直到它完成并且然后尝试在以后的数据中收集内存?
我听到一个解释,如果正在进行 Web 服务调用,GC 会查看它,因为它需要很长时间,所以将它标记为第 1 代,然后是第 2 代。现在我们可以拥有大量内存直到稍后阶段才能收集。这个对吗?
如果我有一个正在做长时间工作的方法(例如进行 Web 服务调用),垃圾收集器是否查看该方法使用的内存并将其移动到不同的代,或者它是否忽略该方法直到它完成并且然后尝试在以后的数据中收集内存?
我听到一个解释,如果正在进行 Web 服务调用,GC 会查看它,因为它需要很长时间,所以将它标记为第 1 代,然后是第 2 代。现在我们可以拥有大量内存直到稍后阶段才能收集。这个对吗?
当 GC 启动时,它会查看对象根。它不关心这些根是来自方法变量还是实例/静态字段。它不会释放从该方法引用的资源,因为这些引用在方法退出之前是活动的。
方法对 GC 来说是不直接可见的,即它对它们是无视的。
垃圾收集器不寻找方法。GC 检查引用。
简单的例子:如果你定义一个全局变量,它可以从作用域的每个函数中访问。它不会被收集,直到您离开范围。如果你定义了一个局部变量,比如说在函数内部,这个变量使用的内存将在函数返回后被清除(或者finally
在你从 try/catch 块返回的情况下阻塞)