【问题标题】:Memory Scope of Static Members in JAVAJAVA中静态成员的内存范围
【发布时间】:2015-09-11 07:11:04
【问题描述】:

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

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

public class Test {
public static String myVariable;
}

假设 Test.myVariable 在另一个类 Foo 中设置/调用。

只要 Foo 还活着,Test.myVariable 就一直活着吗?

只要应用程序域还在,Test.myVariable 会一直保持活动状态吗?

myVariable 何时会超出范围?

【问题讨论】:

  • 一点也不。任何有权访问Test 的类都可以访问公共静态成员。
  • 我正在考虑 Test.myVariable 被访问一次的场景。
  • 所有,我已经澄清了这个问题,因为它处理的是内存范围而不是访问范围。
  • 您在文档中发现了哪些您不理解的地方?听起来好像只要加载了Test,它就应该在范围内。
  • @PJTrailll 加载是什么意思?测试永远不会自己实例化。只有 Test.myVariable 被调用 - 它在什么时候超出范围?

标签: java variables static scope


【解决方案1】:

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

【讨论】:

【解决方案2】:

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

请注意,只有变量及其技术值(基元或引用)存储在 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.

【讨论】:

  • 谢谢,但您正在解释存储变量的哪些部分。我来自 C# 背景,所以我熟悉堆与堆栈的差异,但对 PermGen 不太熟悉 - 这是否意味着该对象的寿命会更长?
  • 我强烈建议您浏览这些解释内存管理的链接。 docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/geninfo/…journaldev.com/2856/…
  • 如果您在阅读完文档后仍有问题,请告诉我
  • 如果您的问题得到解决,请告诉我,否则请接受答案并关闭问题
  • 对不起@Mudassar,但您的回复虽然内容丰富,但并未回答发布的实际问题。
【解决方案3】:

您的课程是公开的。您的静态成员是公开的。它不会超出范围。

【讨论】:

【解决方案4】:

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

myVariable 何时会超出范围?

不确定变量超出范围是什么意思。范围是公开的,因此它可以在任何地方使用。 JVM 在垃圾回收方面的生命周期取决于对类的引用。

【讨论】:

  • 谢谢我的意思是内存范围。
猜你喜欢
  • 2012-06-25
  • 2011-12-01
  • 2013-02-16
  • 1970-01-01
  • 1970-01-01
  • 2016-01-09
  • 1970-01-01
  • 2011-07-18
  • 1970-01-01
相关资源
最近更新 更多