Java静态字段在线程中分配多次吗?

3

我正在参与一个小组项目,其中我们在Worker类中声明了几个静态常量。多个工作线程被创建,我们的Java应用程序似乎使用了大量内存。我想知道这是否是每个线程分配更多这些静态常量的结果,但我不确定。


1
只是一个想法。热部署可能会出现问题,旧的类实例可能会残留。重新启动应用服务器应该能够展示这一问题。 - Joop Eggen
1
在编程中,“变量”通常意味着任何命名的数量,无论它是否变化。在cplusplus.com中,变量被定义为:“我们可以将变量定义为存储确定值的一部分内存”(http://www.cplusplus.com/doc/tutorial/variables/)......几乎没有关于某些东西是否变化的说明。从语义上讲,在英语中,它要么是变量要么是常量,但在编程术语中,说“常量变量”并不真正是矛盾的。 - Kiril
3个回答

8
不,每个ClassLoader只有一个静态变量实例。
 public class Foo {
      // only 1 of these
      private static int bar = 10;
 }

然而,必须认识到这并不意味着该值会自动同步。如果线程正在更改此值,则需要进行同步,否则根据竞争条件,它们可能看到不同的值。

这些变量是final的,所以我不担心那个。我猜这暗示了一个不同的内存问题。 - Dan Q
@DanQ 没有这样想,但那是为了后世留名。 - Gray

1

静态变量不是根据线程数量显式地分配的。相反,静态变量在类加载器中只分配一次。


0
如果您正在使用大量内存(例如多GB),我建议使用内存分析器找出原因并尝试修复。如果您只使用几百MB的内存,那么除非您知道这是一个问题,否则不必担心。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接