【发布时间】:2015-03-11 00:26:05
【问题描述】:
我想以编程方式销毁静态对象。可能吗?如果是,那么我该如何实现这一目标。请建议。
【问题讨论】:
-
你说的“破坏”是什么意思?
-
我的意思是释放运行时内存。
-
然后将其设置为 null 并让垃圾收集器完成其工作。
标签: java
我想以编程方式销毁静态对象。可能吗?如果是,那么我该如何实现这一目标。请建议。
【问题讨论】:
标签: java
您需要了解的是 - 引用是静态的,而对象不是。我的意思是,在
static SomeClass someClassInstance = new SomeClassInstance();
static 属性位于 reference someClassInstance 上,GC 作用于 instances / objects。
someClassInstance =null 将使第一个 SomeClassInstance 符合 GC 条件。
【讨论】:
如果你说的“破坏”是指摆脱对象本身,那就很容易了。
假设您的对象在 ExampleClass 类中定义如下
public class ExampleClass{
public static Object toBeDestroyed;
}
你只需要这样做
ExampleClass.toBeDestroyed = null;
第一行删除对对象的引用(假设没有其他人在使用它)。垃圾收集器将在对象上调用finalize() 并释放内存。
【讨论】:
根据定义,每个类都定义一个静态变量,并且(如果声明为 final)具有不可变的值......并且不能被“销毁”。
你真正想做什么?
【讨论】:
final 和 immutable 是两个不同的东西。除非您使用 primitives 或 immutable 类。
在java中我不认为你可以销毁一个变量,如果你真的想释放内存空间,那么JVM就是收集或释放未使用变量的内存的那个。这个过程称为垃圾收集。这个怎么做?参考:https://stackoverflow.com/a/1567996/1904479
【讨论】:
您不能破坏静态变量。每个人都可以在不声明类实例的情况下访问静态变量。它是一个共享内存概念。你可以阅读,如果你有足够的权限可以改变。
因此,您需要将 null 或空值或类似的值分配给该变量。您必须对其进行一些技巧来维护或检查该变量是否已设置。您可以设置一个标志来检查值是否存在。
您可以从Where are static class variables stored in memory?和static allocation in java - heap, stack and permanent generation获得更多信息
【讨论】: