一尘不染

垃圾收集器是否在Enum类型上运行?

java

根据
jls§8.9.2枚举主体声明

枚举声明声明终结器是编译时错误。枚举类型的实例可能永远不会完成。

由于finalizer在Garbage
Collector运行之前执行,如果不存在finalizer,这是否意味着enum类型始终保持加载在内存中,而Garbage
Collector不适用于该enum类型?


阅读 198

收藏
2020-12-03

共1个答案

一尘不染

如果编译像这样的枚举

enum Suit {SPADES, HEARTS, CLUBS, DIAMONDS}

您将看到生成的字节码(即javap -p Suit)对应于合成类:

final class Suit extends java.lang.Enum<Suit> {
  public static final Suit SPADES;
  public static final Suit HEARTS;
  public static final Suit CLUBS;
  public static final Suit DIAMONDS;
  private static final Suit[] $VALUES;
  public static Suit[] values();
  public static Suit valueOf(java.lang.String);
  private Suit();
}

因此,枚举的实例是类本身的静态成员。然后,我认为可以进行垃圾回收的唯一方法是,如果类本身是垃圾回收,那么如果它是由系统类加载器加载的,则不太可能发生。

2020-12-03