問題タブ [java-memory-model]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - Dalvik VM & Java Memory Model (Android での並行プログラミング)
私は多くの並行プログラミングを含む Android プロジェクトに取り組んでおり、いくつかのカスタムのスレッド間通信を実装する予定です ( java.util.concurentのものは私の目的にはあまり適していません)。
並行プログラミングは一般的に簡単ではありませんが、Dalvik ではさらに難しいようです。正しいコードを取得するには、いくつかの特定のことと、Dalvik で問題が発生する場所を知っておく必要があります。Dalvik VM に関する詳細なドキュメントが見つかりません。ほとんどの Android リソース ( developer.android.comでさえ、プラットフォーム API に焦点を当てており、いくつかの重要な (または低レベルの) ものに関する詳細な情報を提供していません)。
たとえば、Dalvik VM はJava 言語仕様のどのエディションに準拠していますか? 答えに応じて、volatile
変数の扱いは異なり、変数を使用する並行コードに影響しvolatile
ます。
関連する質問がすでにいくつかあります。
faddenによるいくつかの回答は非常に役立ちますが、問題の内容をより詳細かつ完全に理解したいと思っています。
したがって、私が興味を持っている未加工の質問の下に (以前の質問に対する回答が届くので、必要に応じてリストを更新します)。
- 以下の質問に対する回答を提供する可能性のある Dalvik VM に関する詳細はどこにありますか?
- Dalvik VM が準拠しているJava 言語仕様のエディションはどれですか?
- (2) に対する答えが「第 3 版」である場合、Dalviks のJava メモリ モデルのサポートは、この仕様でどの程度完全に無視されていますか? 特に、
volatile
変数のセマンティックのサポートはどの程度完了していますか? Androidのダブル チェック ロックでは、faddenが次のコメントを提供しています。
うん。「volatile」キーワードの追加により、これはユニプロセッサ (Android のすべてのバージョン) および SMP (3.0 "honeycomb" 以降) で動作します。
デュアルコア CPU を搭載しているが Android 2.3 しか搭載していない Samsung Galaxy SII では、同時実行コードが正しく実行されない可能性があるということですか? (もちろん、Galaxy は単なる例です。問題は、Android 3.0 より前のプラットフォームを搭載したマルチコア デバイスに関するものです)。
Dalvikのメモリ モデルは Java のメモリ モデルと同じですか? faddenは、次の文で答えを提供します。
JSR-133に関して完全に正しいDalvikの現在出荷されているバージョンはありません
このコメントの投稿日までにリリースされた Android バージョンで、既存の正しい並行 Java コードが正しく動作しない可能性があるということですか?
更新#1: @gnat のコメントへの回答 (コメントするには長すぎます)
@gnat コメントを投稿:
@Alexey Dalvik は、どの JLS エディションにも準拠していません。準拠には、Dalvik のオプションではない JCK を渡す必要があるためです。標準仕様に準拠しているからといって、標準Javaコンパイラすら適用できないということですか?それは問題ですか?はいの場合、どのように?
さて、私の質問はどういうわけかあいまいでした。私が実際に言いたかったのは、JLSは Java コンパイラー実装のルールであるだけでなく、あらゆるJVM実装の暗黙のガイドラインでもあるということです。実際、たとえばJLSは、一部の型の読み取りと書き込みはアトミック操作であると述べています。読み取り/書き込みは単一のオペコードに変換されるため、コンパイラの作成者にとってはあまり興味深いものではありません。ただし、これらのオペコードを適切に実装する必要があるJVM実装には不可欠です。これで、私が話していることがわかるはずです。Dalvik は標準の Java コンパイラでコンパイルされたプログラムを受け入れて実行しますが、保証はありません。プログラムで使用されているすべての JLS の機能が Dalvik によってサポートされているかどうかを誰も (Dalvik の開発者を除いて) 知らないという理由だけで、(ご想像のとおり)それらが正しく実行されること。
JCKが Dalvik のオプションではないことは明らかですが、プログラマーは、Dalvik でコードを実行するときに依存する可能性のあるJLSの機能を知っておく必要があります。しかし、ドキュメントにはこれについての言葉はありません。=、+、-、* などの最も単純な演算子は、変数のセマンティック( JLSの第 2 版と第 3 版では異なる) のような自明ではない機能については期待どおりに機能することを期待するかもしれません。そして後者は、 JLS、特にJava Memory Modelで見られる最も重要なことではありません。volatile
java - Java は最大スタック サイズを設定します
最大スタックサイズを設定するにはどうすればよいですか?
jEdit を使用して、かなり大きなファイル (73 kb) を正規表現で検索すると、StackOverflowException で失敗します。
-Xss40m を設定しようとしましたが、初期スタック サイズのようで、しばらくすると次の例外で失敗します
OutOfMemory がスローされる理由と、最大スタック サイズの設定方法を説明していただければ幸いです。
java - Java メモリ モデルと C++11 メモリ モデルの類似点は何ですか?
新しい C++ 標準では、メモリ モデルの概念が導入されています。スタック オーバーフローについては、それが何を意味するのか、C++ でのコードの記述方法がどのように変わるのかなど、すでに質問がありました。
私は、C++ メモリ モデルが古いよく知られている Java メモリ モデル (1.5) とどのように関連しているかを知りたいと思っています。それは同じですか?似ていますか?それらに大きな違いはありますか?もしそうなら、なぜですか?
Java のメモリ モデルは昔からあり、よく知っている人も多いので、C++ のメモリ モデルを Java のメモリ モデルと比較して学習することは、私だけでなく参考になるのではないでしょうか。
java - スレッド開始前に Java が発生しました
スレッドを開始すると、発生する前の関係に特別な影響があることをどこかで読みました。今、私のコードが過去の関係を保証しているかどうかわからないので、教えてください。
Dispatcher スレッドと、Runnable
インターフェイスを実装する Worker クラスがあります。Dispatcher スレッドは Worker の新しいインスタンスを作成しLinkedList
、メソッドを介して Worker インスタンスadd
に要素を入力します。
次に、Dispatcher はメソッドExecutorService
を介してWorker インスタンスをに渡します。execute
次に、Worker クラスの run メソッドが .xml ファイルへのアクセスと削除を開始しLinkedList
ます。
Worker の新たに開始されたインスタンスはLinkedList
、Dispatcher が残したのと同じ状態を認識しますか? LinkedList
それとも、何らかの矛盾した状態にある可能性がありますか? LinkedList
同期化されたメソッドに入力する必要がありますか?
java - Java ヒープ スペースの監視 - やり方が間違っているのでしょうか?
一部の Tomcat インスタンスでヒープ メモリの状態をチェックする Nagios チェックがあります。VM からメトリックを取得するために使用するコマンドは次のとおりです。
次のような出力が生成されます。
used
に対する値が に対する値の 90% を超えると、アラートが開始されますmax
。max
主に の値が上下する可能性があるため、これには欠陥があるようです:)
ヒープ スペースの消費を正しく監視するには、どのような情報を使用する必要がありますか?
max
の値と比較する必要がありXmx
ますか?
次のコマンドを使用して、Xmx の値を取得できます。
より良い方法はありますか?
java - Javaロックと発生-関係前
javadocを正しく解釈しているかどうかはわかりません。ReentrantLock
メソッドを呼び出してロックを正常に取得した後を使用する場合lock
、同期されたブロックなしで任意のオブジェクトにアクセスでき、発生前の関係が魔法のように強制されますか?
と作業中のオブジェクトの間に関連性が見当たらないためReentrantLock
、安全に作業できるとは信じられません。しかし、これは事実ですか、それとも私はjavadocを間違って読んでいますか?
java - 非表示変数のガベージ コレクション
私は次のコードを持っています:
o2 オブジェクトは の実行中にガベージ コレクションの対象になりますlong operation
か?
java - Java: 揮発性の暗黙の順序保証
私の質問はこれの拡張です:揮発性の保証と順不同の実行
より具体的にするために、初期化後に 2 つの状態になる単純なクラスがあるとします。
初期化されたフィールドはvolatileと宣言されているため、事前発生の「バリア」が導入され、並べ替えが行われないことが保証されます。状態フィールドは、初期化されたフィールドが書き込まれる前に のみ書き込まれ、初期化されたフィールドが読み取られた後にのみ読み取られるため、状態の宣言からvolatileキーワードを削除しても、古い値が表示されることはありません。質問は次のとおりです。
- この推論は正しいですか?
- 初期化されたフィールドへの書き込みが最適化されず (初回のみ変更されるため)、「バリア」が失われないことが保証されていますか?
フラグの代わりに、次のようにCountDownLatchが初期化子として使用されたとします。
それでもよろしいでしょうか?
java - Executor.execute() JMM保証
次のコード スニペットを検討してください。
Runnable インスタンスがメッセージを取得しようとするまでに、messageQueue にメッセージが含まれていることが保証されていますか? または、もう少し一般的な言い方をすると、JMM に従って JIT/JVM によって 2 つの関数呼び出しを並べ替えることができますか?
java - 同期ブロックでのJavaの前発生
Java メモリ モデルを理解するための助けが必要です。以下は、基本的な概念を理解するための一般的な例です。
Image というオブジェクト インスタンスとShared
、2 つのスレッドA
とがありB
ます。さらにQueue
、同期put
とtake
.
スレッドは、メソッドの前およびメソッド内で-instanceA
を変更します。Shared
put
質問 1:からのすべての変更は、同期メソッドを介してオブジェクト インスタンスを取得するA
ときに表示されますか?B
Shared
take
質問 2: メモリ キャッシュは、同期メソッドShared
を終了するとすぐにフラッシュされます (すべての変更が表示されます) 。が-method で によって呼び出された場合、正確にはどうなりますか? -methodをまだ終了していなくても、変更が行われたことがわかりますか? 呼び出し時にキャッシュもフラッシュされますか?A
put
wait()
put
A
B
Shared
A
synchronized
wait()