【问题标题】:When do static variables get garbage collected?静态变量什么时候被垃圾回收?
【发布时间】:2015-10-26 13:16:14
【问题描述】:

我有一个静态工厂方法,它将返回一个片段对象。

private static String  final A1="a1";
private static String  final A2="a2";
private static String  final A3="a2";
private static String  final A4="a4";

public static MyFragment newInstance(int index) {
    MyFragment f = new MyFragment();
    Bundle args = new Bundle(4);
    args.putInt(A1, index);
    args.putInt(A2, index);
    args.putInt(A3, index);
    args.putInt(A4, index);
    f.setArguments(args);
    return f;
}

我在oncreate() 内得到它

getArguments().getInt(A1, 0);

现在我的问题是:我正在创建几个 MyFragment 对象,如下所示

List<Fragment> fragments = new ArrayList<>();
fragments.add(MyFragment.newInstance(defaultId));
int i = 1;
for (Categories categories : mCategories) {
    String id = categories.getCategory_id();
    String name = categories.getCategory_name();
    //  String slno = categories.getSlno();
    fragments.add(MyFragment.newInstance(defaultId));
    Titles[i] = name;
    i++;
}

由于变量 A1-A4 是静态的,它会在活动销毁时清除它的内存吗?或者我需要在 onDistroy 中将变量分配为null

请帮我澄清疑问?

【问题讨论】:

  • 你也标记为final。所以你不能给他们任何新的价值。不要担心他们。 final static 是 java 常量的标记。作为一个小练习,在 java 中寻找 static 和 final 的含义。

标签: java android static-members


【解决方案1】:

一个静态变量是在加载类时分配的,只有在加载该类的类加载器本身被释放时才会被垃圾回收。

一个类或接口可以被卸载当且仅当它的定义类 loader 可能会被垃圾收集器回收 [...] 类和 引导加载程序加载的接口可能不会被卸载。

查看类似问题的答案Are static fields open for garbage collection?

【讨论】:

  • 那么,在 onDistroy() 中将其初始化为null 是正确的做法吗?这样垃圾收集器就可以尽快释放内存..
  • @Christ 不,这些是最终的,因此不能分配给null。在 Java 中,您很少需要担心清理对原语(或字符串)的引用,因为 VM 和 GC 对它们的处理方式不同。如果您确实想在 onDestroy 上卸载某些东西,请将它们设为非静态变量,并且它们将与类一起收集,但此示例不是您想要这样做的情况,因为优化器可能会内联当前的实现。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-15
相关资源
最近更新 更多