0

我是 GC 新手,想知道除了不再被任何变量引用的引用之外,垃圾收集器还会收集什么?以下是我要检查的列表

  • 原始类型(int、double、float、char ....)是否得到 GC-ed ?
  • 静态变量会被 GC 处理吗?
  • 最终变量是否被 GC-ed(我认为因为它被标记为不可变,所以没有什么可收集的)?
  • 是否所有方法(静态和非静态)都经过 GC 处理?
  • 线程是否得到 GC-ed ?
4

7 回答 7

3

GC 不收集任何引用,它只是释放不再可访问的对象(堆上的内存)。

静态是特殊的内存位置,与类/类加载器相关联。如果类/类加载器未部署,则静态内容将从内存中删除。

如果原始类型与对象(类变量)相关联,那么当对象不可访问时它们将被 GC。

如果是局部变量/参数变量,它们将在堆栈上,因此一旦方法执行完成,它们就会被回收。

于 2012-08-07T21:04:42.493 回答
0

GC 只收集程序中没有任何引用的内存空间,因此根据定义,GC 收集原语不会发生。可以收集任何可以引用对象并可以更改其需求的变量,因此可以在某些情况下收集静态变量,但最终不行!我无法想象方法 GC-ed 是什么意思。在一般的答案中,我应该说方法不是要 GC-ed 的对象状态的一部分。

于 2012-08-07T21:07:24.563 回答
0

垃圾收集是一个巨大的话题,对于堆栈溢出答案来说可能太大了。有一本关于这个主题的好书叫做垃圾收集手册

于 2012-08-07T21:08:52.773 回答
0

垃圾收集确实对分配在堆上的对象起作用,这些对象都是通过new.

  • 不确定原始对象,如果在内部使用对象管理它们可能会被 GC(例如new Integer(..),但我不确定这里的装箱和拆箱,所以我会说不,因为 JVM 有管理它们的特定指令
  • 静态变量可以被 GC-ed,因为静态唯一的东西是引用而不是被引用的对象
  • final 变量可以是 GC-ed,它们是 final 的事实并不意味着您的程序将永远需要对它们的引用
  • 方法和线程本身不会被 GC,但从这个意义上说,线程始终包含在具有run()方法的对象中,因此它们可以被 GC
于 2012-08-07T21:06:14.580 回答
0

垃圾收集仅适用于对象。

• 原始类型(int、double、float、char....)是否经过 GC 处理?- 原始类型是对象吗?不。

• 静态变量是否经过 GC 处理?- 是变量对象,是的。

• final 变量是否被 GC-ed(我认为因为它被标记为不可变,所以没有什么可收集的)?- 不,他们会得到 GC-ed

•所有方法(静态和非静态)都经过GC吗?- 方法和类 defs 占用内存,但不占用 GC 管理的内存,它取决于 JVM 的类型,它们最终被随意创建和销毁。

• 线程会被 GC 处理吗?- 是的,线程是对象,所以它们会被 GC-ed。

于 2012-08-07T21:04:43.977 回答
0

垃圾收集器只在堆上工作。鉴于此,您可以排除静态变量。

  • 原始类型(int、double、float、char ....)是否得到 GC-ed ?如果他们所属的对象被 GC-ed,他们就会被 GC-ed

  • 静态变量会被 GC 处理吗?不

  • 最终变量是否被 GC-ed(我认为因为它被标记为不可变,所以没有什么可收集的)?如果他们所属的对象被 GC-ed,他们就会被 GC-ed

  • 是否所有方法(静态和非静态)都经过 GC 处理?这没有多大意义

  • 线程是否得到 GC-ed ?如果它们是不再被引用的对象,是的

于 2012-08-07T21:05:11.797 回答
0

只有对象(实例)可以被垃圾收集,没有别的。

  • 变量不是对象 - 所以它们不会被 gc'd
  • 方法不是对象——没有 gc。
  • 原语 - 不是对象,没有 gc
  • Threads - Thread 类实例:是的。

该关键字static与垃圾收集无关。

于 2012-08-07T21:02:46.113 回答