staticのメモリ共有について
- Javaのstatic変数は、プロセスごとに異なる値を保持することができますが、他のプロセスからの書き換えはできません。
- マルチスレッドな処理が行われていない場合、static変数の値の不整合については考慮する必要がありません。
- ただし、複数プロセスでシングルスレッドな処理を行っている場合でも、性能などの問題上、static変数の使用には注意する必要があります。
- ベストアンサー
staticのメモリ共有について
staticについて調べたのですが、その内容があっているのかどうか 間違い・アドバイスなどありましたら是非伺いたいと思います。 よろしくお願い致します。 ------------------------------------------------------------ シェルから起動されるJavaでバッチ処理を行うアプリケーションを 作成していまして、サーバマシンの複数のプロセスから起動されます。 (つまりjavaコマンドが複数回同時に実行されます) 1回の実行の間保持しておきたい値をstaticなクラス変数に格納しています。 そしてそれは、1回の実行の間はずっと同じなのですが、 プロセスごとに異なる値です 。 この時、この1回の実行の間に保持しておきたい"static"な変数は 次のプロセスから実行された時に書き換えられるのか? という疑問がでたのが始まりです。 マルチスレッドの処理はありません。 ------------------------------------------------------------ 調べたところ、 ■1台で2つ以上のJavaアプリケーションを実行する場合、 それぞれのアプリケーションを個別にjavaコマンドで起動・・・ =>javaコマンド毎に"個別のJVMが"それぞれのプロセス上で動作する。 ■フィールドをstatic指定するとクラス変数となり、 ロードされたクラスごとに"JVM上に"1つしか存在しない変数となる。 ・以上の2点から、staticの変数がメモリ上で共有されるのは 1つのJVM(1プロセス)内での話しであり、他のプロセスから その値を書き換えられる事はないと考えています。 そして、1プロセス内でのマルチスレッドな処理を行っている場合、 staticな変数の値は注意が必要だけど、 複数プロセスでシングルスレッドな処理を行っている場合、 (性能などの問題上staticにするかどうか良し悪しはあるとしても) staticな変数の値の不整合について 考慮は不要と考えても宜しいのでしょうか? 経験が浅い為、確信が持てずにいる状況です。 宜しくお願い致します。
- njomojo
- お礼率44% (4/9)
- Java
- 回答数1
- ありがとう数3
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
メモリは、JVMごとに割り当てられるので、 別プロセスから起動された場合のメモリは干渉しません(できません)。
関連するQ&A
- Staticイニシャライズについて質問
JAVA初心者です、宜しくお願いします。 Staticについて質問します。 ある本には、「static変数の初期化方法は、変数の初期化と同じステートメントで実行する方法と、JVMによってクラスがロードされるときに実行される特別なコードブロックを作成して変数を初期化する方法があります」とかかれていました。 ・ 「変数の初期化と同じステートメントで実行する方法」と「クラスがロードされ るときに初期化する方法」とは、どのように違うのでしょうか。 クラスがロードされる時とはどのような時なのでしょうか。 ・ 「変数の初期化と同じステートメントで実行する方法」については通常の方法な ので理解できるのですが、「クラスがロードされるときに初期化する方法」を行う と、どのようなメリットがあるのでしょうか。 何故このような方法があるのでしょうか。 以上、宜しくお願いします。
- ベストアンサー
- Java
- static 変数について
static 変数について 今、C++を勉強しているのですか、static変数がどのように動くのかよくわかりません。 下のプログラムのint a はローカル変数だから、ブロックを抜けたら、初期化されるためstatic変数にして、ブロックを抜けても値を保持するようにすってことはわかるのですが 毎回このブロックに入る度、static int a = 0;を読むことになり、その前に入っていた値はなくなるのではないでしょうか?それとも,static int a と書かれていると,1度しか実行されないから、値が保持され続けるのでしょうか? int add (int x ) { int a = 0; a += x; return a; }
- 締切済み
- C・C++・C#
- C言語のStatic変数について
現在、C言語の勉強しながらゲームプログラムにチャレンジしています。 二つの関数で利用する変数を作りたかったので、Static宣言された変数を容易しました。 ですが、この変数、一度処理が終わると当面使わない変数なのです。 (ただし、処理途中は何度も呼び出されるので値は保持しなければいけません) よって、メモリ上に延々居座られるのが邪魔に思えて仕方ありません。 実際、大したことないだろうとは思うのですが。 このStaticで宣言された変数を、自分の好きなタイミングでメモリ上から解放するような処理はできませんか? もしくはメモリ上に居座ることのない処理の仕方などありましたら、 考え方を教えていただけるとうれしいです。よろしくお願いします。
- ベストアンサー
- C・C++・C#
- staticの動作について
C++で趣味でゲームを作っているのですが、staticを使ったときのローカル変数の動作について質問があります。 いまいち、ローカル変数の動作が分かっていないのですが、大雑把には、関数が読み出される毎に空いてるメモリを探して、そこを確保する物だと思ってます。 で、staticを用いて宣言すると内容が保持されると言うことは、これは始めに一回だけメモリの確保をして、以降はそれを継続して使っているというものなのでしょうか? だとすると、staticをつかったローカル変数の方が、繰り返しメモリの確保が行われ無い分、処理が早いということでしょうか? いま、ゲーム内では、描画用の関数描画基準座標とサイズを受け渡して入るのですが、どうしても内部で描画終了点と開始点のクリップを計算する必要があり、そのためにどうしても計算した開始点、終了点を保持する変数が必要になっています。 しかし、描画関数はキャラの分と背景描画の分とパーティクルの描画の分と、ゲーム1ループないでも1000回近く(多いときは2000回ぐらい)呼び出されてます。 その度にメモりの確保をされるのはなんか気分が悪いなぁと思ってstaticを何となくつているのですが、実際の所staticを着けたら動作がはやくなるとかと言うことは無いのでしょうか? 宜しくおねがします。
- ベストアンサー
- C・C++・C#
- 不要なstaticメソッドの見分け方。。
実は既に構築されているJavaアプリケーションで異様にstaticを多様しており 要・不要を分けてstaticの意味がないものはstaticを削除する事になりました。 staticの変数だけでも1300以上あり、まずは機械的に振分けたいと思っています。 思いつくのは、アクセス修飾がprivateか、省略されている場合にはローカル 使用と判断してstatic不要と判断出来ると思っているのですが。。。 その他によい見分け方がありましたら、是非、ご教授下さい。 実は、私が作ったものでもなく、突然の依頼でオロオロしているため、 アドバイス等でも何でも頂けると嬉しいです。 どうぞ宜しくお願い致します。
- ベストアンサー
- Java
- マルチスレッド下でのインスタンス変数・クラス変数
よろしくお願いします。 マルチスレッド下で動作するクラスを作成しています。データにアクセスするためのオブジェクトを クラスのフィールド値として保持し、使い回しを行いたいと考えています。このデータアクセスオブジェクト(以下Dao)内では特にフィールドは使用せず、全てローカル変数のみで動作するようになっています。Dao自体は初回のクラス生成時にstatic処理にてフィールドにセットされます。 このDaoを保持するフィールドは、staticなクラス変数が良いのか、インスタンス変数として保持する方が良いのか迷っております。 クラス変数ならばPermanent領域をオブジェクト1つ分のメモリ使用で済み、インスタンス変数だとスレッド毎にheapを使い、処理数が増えるとメモリ圧迫しちゃう?と安易に考えてしまったりしています。 ご意見・ご助言よろしくお願い致します。
- ベストアンサー
- Java
- 関数内、ファイルのstatic変数
関数内で、static変数を宣言した場合に、その値は保持されると 思いますが、その関数の外からポインタで見る場合にその値は 保証されるのでしょうか? (必ず同じメモリ上に配置されるのでしょうか?) また、関数とファイル内static変数においてスコープ以外に 取り扱いが変わったりするのでしょうか? (配置されるメモリ空間等) よろしくお願い致します。
- ベストアンサー
- C・C++・C#
- 違うクラスからの変数の共有化
一つのクラスの中にある変数の値を、二つの別なクラスから呼び出して、その二つのクラスのどちらから変数を参照しても同じ値が帰ってくるようにしたいのですが、いろいろ調べてもできなかったので質問させていただきますm(_ _)m // 共有化させたい変数を持つクラス // Var.java public class Var{ public static int i; public Var(int i){ this.i = i; } public Var(){} public static void getI(){ return i; } } //クラス1 //Class1.java public class Class1{ Var var = new Var(1); } //クラス2 //Class2.java public class Class2{ Var var = new Var(); System.out.println(var.getI()); } とした場合、Class1を実行し、次にClass2を実行すると、クラス1で定義した変数の値である 1 が戻ってくるようにしたいのですが、上記の方法では、Class2を実行すると結果は 0 になってしまいました。 まだまだ習い始めたばかりでいまいちstaticを使い切れていないと思います・・・ たとえば、PrintStreamクラスの public static final PrintStream out というのはどこから参照しても同じ結果なのでそのようなやり方で大丈夫だろうと思ったのですが・・・ このような方法では共有化させることはできないのでしょうか?またできないのでしたらほかのやり方がもしあった場合は教えていただきたいと思います。 どうかお願いします。
- ベストアンサー
- Java
- static変数を持ったクラスを継承した複数のクラスで、独立してその変
static変数を持ったクラスを継承した複数のクラスで、独立してその変数を使いたい。 例えば、 class AbstractStatic{ public static String str; } class Ex1 extends AbstractStatic{} class Ex2 extends AbstractStatic{} というクラスがあったとして、 Ex1 e1 = new Ex1(); ex1.str = "hoge"; といれると、 ex2.str で、hogeが入ってしまいます。同じようなstatic変数を持つクラスを複数作りたいのですが、継承させると、独立して変数を持たせられません。 同じようなクラスに直接static変数を、記述するしかないのでしょうか?
- ベストアンサー
- Java
- SAStrutsでServiceのStatic変数
SAStrutsでServiceのStatic変数の動作で疑問があります。 Eclipse+TomcatでサンプルWebアプリを作成し、以下のサービスをActionから呼び出しています。 これは、Staticなint型の変数に、インスタンスを生成した回数を格納する物です。 public class SampleService{ private static int instanceCnt = 0; public SampleService(){ instanceCnt++; System.out.println(instanceCnt); } } これを何度も呼び出すと、何故かある時突然、出力する数値が1にリセットされるのです。 Static変数はスレッド間で共通で使われているはずなので、これは起こらないはずではないでしょうか? 考えられるとすれば、Tomcatが複数のJavaVMを呼び出して、Webアプリケーションを実行しているのでは、と思うのですが、いまいち確信が持てないのです。 なぜこういう事が起こるのか、詳しい方、教えてもらえないでしょうか。
- ベストアンサー
- Java
お礼
そうですよね。 そうじゃないと開発機なんて大変なことになってしまいますよね。 専門家の方の意見が聞けてとても勉強になりました。 ありがとうございました。