繁体   English   中英

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

[英]Java : What is Garbage Collector collecting?

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

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

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

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

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

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

只有对象(实例)才能收集垃圾,而没有其他东西。

  • 变量不是对象-因此它们不会被gc'd
  • 方法不是对象-没有gc。
  • 原语-不是对象,没有gc
  • 线程-线程类实例:是的。

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

垃圾收集仅适用于对象。

•原始类型(int,double,float,char ....)是否获得GC-ed? -是原始类型对象吗? 没有。

•静态变量是否得到GC检验? -是变量对象,是的。

•最终变量是否经过GC检验(我认为由于将其标记为不可变的,因此没有什么可收集的)? -不,他们将接受GC培训

•是否所有方法(静态和非静态)都经过GC检验? -方法和类defs会占用内存,但不会占用由GC管理的内存,这取决于最终将随意创建和销毁的JVM类型。

•线程是否经过GC编辑? -是的,线程是对象,因此它们经过GC处理。

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

  • 基本类型(int,double,float,char ....)是否得到GC-ed? 如果它们所属的对象被GC检验,则它们被GC检验。

  • 静态变量会被GC编辑吗? 没有

  • 最终变量是否经过GC检验(我认为,因为它被标记为不可变的,所以没有什么可收集的)? 如果它们所属的对象被GC检验,则它们被GC检验。

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

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

垃圾回收确实对在堆上分配的对象起作用,这些对象是通过new创建的所有对象。

  • 不确定原始对象,如果在内部使用对象(例如, new Integer(..)管理,则可以对它们进行GC处理,但是我不确定此处是否装箱和装箱,所以我说不,因为JVM有特定的指令来管理它们
  • 静态变量可以进行GC编辑,因为唯一静态的是引用,但不是引用的对象
  • final变量可以是GC-ed,它们是final的事实并不意味着您的程序将永远需要对其进行引用
  • 方法和线程本身并不进行GC,但从这个意义上讲,线程始终包含在具有run()方法的对象中,因此可以对其进行GC

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM