2012-03-14 9 views
3

私は、いくつかの静的定数がWorkerクラスで宣言されているグループプロジェクトに取り組んでいます。このワーカーの複数のスレッドが生成され、Javaアプリケーションは膨大な量のメモリを使用しているようです。私はこれがこれらの静的定数の多くを割り当てる各スレッドの結果であるかどうか疑問に思っていますが、わかりません。スレッド時にJava静的フィールドが複数回割り当てられますか?

+1

単なるアイデアです。古くなった古いクラスのインスタンスが残っているため、ホットデプロイメントに問題が生じる可能性があります。アプリケーションサーバーを再起動すると、これが表示されます。 –

+1

@MikeBaranczakプログラミングでは、「変数」はしばしば、名前の変化した量が変化するかどうかを表します。 cplusplus.comでは、変数は次のように定義されます。["変数を定義された値を格納するメモリの一部として定義できます"](http://www.cplusplus.com/doc/tutorial/variables/)..何かが変わるかどうかについては何も言いません。意味論的に言えば、英語では変数か定数のどちらかですが、プログラミング用語では "定数変数"と言うのは擬態語ではありません。 – Kiril

答えて

8

いいえ、ClassLoaderごとに静的変数のインスタンスが1つしかありません。

public class Foo { 
     // only 1 of these 
     private static int bar = 10; 
} 

ただし、値が自動的に同期されているわけではありません。スレッドがこの値を変更している場合は、​​にする必要があります。そうしないと、競合状態によって異なる値が表示される可能性があります。

+0

これらの変数は最終的なものなので、私はそれについて心配していません。私は、これは異なる記憶問題を暗示していると思います。 –

+0

@ダンキューそれは後世のためだとは思わなかった。 – Gray

1

スタティック変数は、スレッド数に応じて割り当てられたではなく、です。代わりに、静的変数はClassLoader内で1回割り当てられます。

0

"膨大な"量のメモリを使用している場合など。多くのGB、私はメモリプロファイラーを使用して、原因が何であるかを見つけて、可能ならば修正します。数百MBを使用している場合、これが問題であることがわかっていない限り、私はそれについて心配しません。

関連する問題