需要静态变量及其在jvm上的开销

时间:2011-06-01 03:43:25

标签: java interface jvm static-members

根据静态成员的概念,当第一次调用它的类时,它们被创建/加载到内存中。它们在该类的所有实例中都很常见。意味着它们不会被重新创建或重新初始化等。此外,它们只能通过类名访问。不需要为该类创建对象来访问它们。

现在我的问题是;

  1. 是否有静态成员 记忆直到应用程序 运行?即使所有的实例 那个班的收集是由 GC(垃圾收集器)。
  2. 对于一个大型项目,8-10个团队 他们在一起工作,他们不在乎 关于其他团队的编码。 他们可以创建静态成员 根据他们的需要。如果是所有成员 是缓存在内存中,不是 通过JVM创建开销?
  3. 默认情况下,接口的所有成员都是STATIC,并且在很多情况下接口的使用都很好。但如果我记住上述问题,我还应该使用接口吗?

3 个答案:

答案 0 :(得分:6)

1)静态成员只有在定义它们的类本身被收集时才被垃圾收集;这反过来只有在收集定义的ClassLoader时才会发生。这在Web应用程序容器和插件体系结构中很常见。

2)是的,定义大量静态数据可能是一个坏主意。但它就像很多其他的东西:如果你需要它会很好,如果你滥用它会很糟糕。只需使用常识。

3)同样,一个定义了一千个字符串数组的接口将是一个坏主意,但当然这通常不是人们所做的。只需使用常识。一般来说,没有(与内存相关的)理由来避免静态变量。

答案 1 :(得分:1)

  1. 是肯定的。没有GC会清理静态变量。这很重要,否则就不能依赖存储在静态变量中的值。像“Singleton”这样的设计模式依赖于静态变量。

  2. 静态变量占用与实例变量中存储的相同值的mem,因此只要存储在变量中的值对于abblication确实是必需的,静态变量中就没有特定的存储开销。但是,当谈到线程安全等时,使用静态变量所产生的副作用需要更多地考虑到内存问题。

  3. 是肯定的。但是Interfaces用于描述提供者和用户之间的功能合同,而不是用于存储任何数据。

答案 2 :(得分:0)

  1. 不,他们是在课堂上收集的。

  2. 开销比较什么?有什么替代方案?

  3. 是的,但是没有人说你必须用静态成员来填补它们。