Java:什么是垃圾收集器收集?

时间:2012-08-07 21:00:26

标签: java garbage-collection jvm

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

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

7 个答案:

答案 0 :(得分:3)

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

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

如果与对象(类变量)相关联的原始类型,则在无法访问对象时它们将被GC。

如果是局部变量/参数变量,它们将在堆栈中,所以只要方法执行完成,它们就会被回收。

答案 1 :(得分:0)

只有对象(实例)才能收集垃圾,没有别的。

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

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

答案 2 :(得分:0)

垃圾收集仅适用于对象。

•原始类型(int,double,float,char ....)是否得到了GC-ed? - 是原始类型的对象吗?号

•静态变量是否被GC编辑? - 是变量对象,是的。

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

•所有方法(静态和非静态)是否都可以进行GC编辑?   - 方法和类defs占用内存但不占用GC管理的内存,它是JVM的类型,它们最终会随意创建和销毁。

•线程是否被GC编辑? - 是线程是对象,所以它们得到GC编辑。

答案 3 :(得分:0)

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

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

  • ,他们将获得GC编辑
  • 静态变量是否被GC编辑? 否

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

  • ,他们将获得GC编辑
  • 所有方法(静态和非静态)都是GC-ed吗? 这没有多大意义

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

答案 4 :(得分:0)

垃圾收集可以对堆上分配的对象起作用,这些对象是通过new创建的所有对象。

  • 不确定原始对象,如果用对象进行内部管理(例如new Integer(..)),它们可以被GCed,但是我不确定这里的装箱和拆箱所以我说不,因为JVM具有特定的管理它们的说明
  • 静态变量可以进行GC编辑,因为静态唯一的是引用而不是引用的对象
  • 最终变量可以进行GC编辑,事实上它们是最终的并不意味着您的程序将需要永久引用它们
  • 方法和线程本身不是GC,但在这种意义上,线程总是包含在一个具有run()方法的对象中,因此它们可以被GCed

答案 5 :(得分:0)

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

答案 6 :(得分:0)

垃圾收集是一个很大的主题,可能对于堆栈溢出答案来说太大了。该主题有一个名为good bookGarbage Collection Handbook