我是 GC 新手,想知道除了不再被任何变量引用的引用之外,垃圾收集器还会收集什么?以下是我要检查的列表
- 原始类型(int、double、float、char ....)是否得到 GC-ed ?
- 静态变量会被 GC 处理吗?
- 最终变量是否被 GC-ed(我认为因为它被标记为不可变,所以没有什么可收集的)?
- 是否所有方法(静态和非静态)都经过 GC 处理?
- 线程是否得到 GC-ed ?
我是 GC 新手,想知道除了不再被任何变量引用的引用之外,垃圾收集器还会收集什么?以下是我要检查的列表
GC 不收集任何引用,它只是释放不再可访问的对象(堆上的内存)。
静态是特殊的内存位置,与类/类加载器相关联。如果类/类加载器未部署,则静态内容将从内存中删除。
如果原始类型与对象(类变量)相关联,那么当对象不可访问时它们将被 GC。
如果是局部变量/参数变量,它们将在堆栈上,因此一旦方法执行完成,它们就会被回收。
GC 只收集程序中没有任何引用的内存空间,因此根据定义,GC 收集原语不会发生。可以收集任何可以引用对象并可以更改其需求的变量,因此可以在某些情况下收集静态变量,但最终不行!我无法想象方法 GC-ed 是什么意思。在一般的答案中,我应该说方法不是要 GC-ed 的对象状态的一部分。
垃圾收集确实对分配在堆上的对象起作用,这些对象都是通过new
.
new Integer(..)
,但我不确定这里的装箱和拆箱,所以我会说不,因为 JVM 有管理它们的特定指令run()
方法的对象中,因此它们可以被 GC垃圾收集仅适用于对象。
• 原始类型(int、double、float、char....)是否经过 GC 处理?- 原始类型是对象吗?不。
• 静态变量是否经过 GC 处理?- 是变量对象,是的。
• final 变量是否被 GC-ed(我认为因为它被标记为不可变,所以没有什么可收集的)?- 不,他们会得到 GC-ed
•所有方法(静态和非静态)都经过GC吗?- 方法和类 defs 占用内存,但不占用 GC 管理的内存,它取决于 JVM 的类型,它们最终被随意创建和销毁。
• 线程会被 GC 处理吗?- 是的,线程是对象,所以它们会被 GC-ed。
垃圾收集器只在堆上工作。鉴于此,您可以排除静态变量。
原始类型(int、double、float、char ....)是否得到 GC-ed ?如果他们所属的对象被 GC-ed,他们就会被 GC-ed
静态变量会被 GC 处理吗?不
最终变量是否被 GC-ed(我认为因为它被标记为不可变,所以没有什么可收集的)?如果他们所属的对象被 GC-ed,他们就会被 GC-ed
是否所有方法(静态和非静态)都经过 GC 处理?这没有多大意义
线程是否得到 GC-ed ?如果它们是不再被引用的对象,是的
只有对象(实例)可以被垃圾收集,没有别的。
该关键字static
与垃圾收集无关。