java - 为什么不收集垃圾
问题描述
看下面这行代码
myClass.myMethod(new MyObject());
在这里,我在参数中传递了一个匿名对象,因此该对象没有引用,因此应该有资格进行垃圾收集(我不确定),但是在分配给的参数myMethod(MyObject obj)
,可能只是在创建此对象并且上下文立即切换到某个其他线程以及当上下文返回到创建该对象的线程时,该对象不存在的情况。
喜欢
thread1 |
|
| myClass.myMethod(new MyObject()); <- called, and immediately
thread2|
|
|
| // doing some work
meanwhile GC sees new MyObject(); and eats it
thread1| //gets chance again
|
| myClass.myMethod(null); object gone
可能看起来像一个愚蠢的问题,它从来没有发生在我身上,但我只是好奇。
如果你回答请解释
谢谢
解决方案
只有当您拥有的对象符合 GC 条件时,垃圾收集才会启动。如果正在处理以下一种(或多种)情况,您可能需要 GC:
- 取消您的参考变量
- 重新分配参考变量
- 孤立岛
- 在方法内部创建的对象
您提供的代码片段似乎是第三种情况。MyObject()
你在里面实例化myMethod()
。因此,当myMethod()
被调用时,它会进入堆栈框架。如果您的方法被弹出(通过取消引用),myObject
变得无法访问并有资格进行垃圾收集
class Test
{
// to store object name
String obj_name;
public Test(String obj_name)
{
this.obj_name = obj_name;
}
static void myMethod1(Test t)
{
//object t1 inside method becomes unreachable when myMethod1(...) removed
myMethod2(new Test("t2"));
}
static void myMethod2(Test t)
{
// dereference myMethod2(...)
return;
}
// Driver method
public static void main(String args[])
{
myMethod1(new Test("t1"));
// calling garbage collector
System.gc();
}
@Override
// Overriding finalize method to check which object is garbage collected
protected void finalize() throws Throwable
{
// will print name of object
System.out.println(this.obj_name + " successfully garbage collected!");
}
}
推荐阅读
- android - 如何在 Windows 的 android studio 中执行 gradle wrapper/gradlew 命令
- apache-spark - 具有大量特征的 pyspark PCA
- c - 如何将 uint8_t 显示为整数或字符串?
- julia - 如何在 Julia 中的两组顶点之间添加元素边
- c# - Fire and Forget 没有安排好
- python - 如何通过浏览器在服务器上运行 python 应用程序
- python - 二维数组中的 Python 循环
- scala - Spark 不符合预期类型 TraversableOnce
- arrays - 如何在foreach循环中为perl创建变量数组名
- c# - 我可以从命令行按顺序运行多个 nunit 测试吗?(使用 nunit 控制台运行程序)