JAVA中静态成员的内存范围

时间:2015-06-24 21:32:29

标签: java variables static scope

这个问题是关于内存管理的问题。 GC中的GC。

由于java没有像C#这样的真正的静态类,所以类中的静态成员的范围如下所示:

public class Test {
public static String myVariable;
}

让我们说在另一个类Foo中设置/调用Test.myVariable。

只要Foo还活着,Test.myVariable会继续活着吗?

OR

只要应用程序域是,Test.myVariable是否会保持活动状态?

myVariable什么时候会超出范围?

4 个答案:

答案 0 :(得分:2)

我猜你的意思是什么时候它可用于垃圾收集。当负责加载类的类加载器本身是垃圾收集的候选者时,静态成员是垃圾收集的候选者。 例如,假设类Test由类加载器对象加载,例如loader1.So当loader1符合GC条件时,类Test和它的静态变量,在这种情况下myVariable也适用于GC 查看here

答案 1 :(得分:0)

public访问意味着它可供所有人使用。 publicstatic变量之间没有instance的区别。

  

myVariable什么时候会超出范围?

不确定变量超出范围是什么意思。范围是公开的,因此它将随处可用。垃圾收集方面的JVM生存期取决于对类的引用。

答案 2 :(得分:0)

你的班级是公开的。你的静态成员是公开的。它不会超出范围。

答案 3 :(得分:0)

我理解您关注的是垃圾收集时间。在继续之前,您需要了解内存管理

请注意,只有变量及其技术值(基元或引用)存储在PermGen空间中。

如果您的静态变量是对象的引用,则对象本身存储在堆的正常部分(年轻/老一代或幸存者空间)中。这些对象(除非它们是类等内部对象)不存储在PermGen空间中。

示例:

static int i = 1; //the value 1 is stored in the permgen section 
static Object o = new SomeObject(); //the reference(pointer/memory address) is stored in the permgen section, the object itself is not.