問題タブ [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.
java - 4GBと8GBのRAMとこれの計算について言及できる-XX:MaxPermSizeサイズはどれくらいですか?
4GBと8GBのRAMについて言及できる-XX:MaxPermSizeサイズ。これが私のシステムの他の詳細です
OS:-ウィンドウXP(32ビット)RAM:-4 GB java_opt- -Xms1536m -Xmx1536m //(環境変数として言及):tomcatバージョン:-6.0.26
私は他の詳細がまったく同じである8GBのRAMを備えた別のシステムを持っています。はいosは64ビットのWindow7です。
これに加えて、両方のシステムの-Xmxパラメーターの最大値を教えてください。
この図を詰め込む必要がないように、誰かが図に到達するための計算を教えてくれるといいのですが、RAMシステムが持っていることに基づいて論理的に計算できますか?
私は実際に人々がpermgenエラーまたはヒープエラーを取得するのを見てきましたが、問題を解決することがわかるまで、すべての体がこのパラメーターで遊んでいます。
java - システム構成の最大ヒープサイズと最大 perm gen サイズを見つけるためのプログラム/アプローチ?
最大ヒープ サイズと最大 permgen スペースをテストするには、Gilliが Windows の Java プロセスあたりの最大メモリ量で提案した返信に従って? 、システムを出力するだけのmainメソッドを持つ単純なJavaクラスを作成しました
以下のパラメーターを使用してコンソールからクラスを実行すると、正常に実行されましたが、2048 で、エラー could not reserve が発生しました オブジェクト ヒープに十分なスペースを予約できませんでした。これは、システムの最大ヒープ サイズが 1536 から 2048 の間で許容されることを意味します。
64 ビット Java を実行している場合、オペレーティング システムが Java プロセスに提供するメモリ空間は非常に大きくなります。したがって、Java ヒープとネイティブ ヒープの間のメモリ リソースの競合により、Java ヒープの最大サイズに制限が課されていないと見なすことができます。
だから私は 8 GB のメモリを持っているので、なぜ VM はオブジェクト ヒープに十分なスペースを予約できなかったのでしょうか?
2 番目に必要なのは、システムの最大 permgen サイズを見つけることです。だから私は以下のパラメータで同じプログラムを実行しました
しかし、再び、オブジェクトヒープに十分なスペースを予約できませんでしたと表示されます。Windows7 64ビットOSで8GB RAMを持っているので、どうすればそれが可能ですか。そして、permgen に 128m も許可しないのですか? 私はここで何かが欠けていると確信していますが、それを理解することはできませんか?
java - スレッド間でデータを渡すときに Java でメモリの可視性を確保する方法
一部のスレッドがデータを作成し、そのデータのチャンクを他のスレッドによって消費されるように定期的に渡すパターンのような生産者消費者があります。
Java メモリ モデルを念頭に置いて、コンシューマ スレッドに渡されるデータが完全に「可視化」されるようにするにはどうすればよいですか?
このために特別に構築された ConcurrentLinkedQueue のような java.util.concurrent のデータ構造があることは知っていますが、それらを利用せずにできるだけ低レベルでこれを行い、カバーの下で何が起こっているかを完全に透過的にしたいと考えています。メモリ可視化部分。
android - アプリケーションのアクティビティ メソッドを渡すコマンド パターンは?
@RomainGuy によるメモリ リークの回避の記事を読んだ後、現在の Android アプリケーションが、アプリケーションのメイン アクティビティを渡すという間違いに悩まされていることに気付きました。そのため、いつでもそのアクティビティ パラメータをActivity.getApplicationContext()に置き換えることができます。
しかし、私のアプリケーションには、アプリケーションのメイン アクティビティのメンバーにしかできないメソッドを実行する必要がある特定のクラスがあります。
したがって、コマンド パターンを使用してこの制限を回避することを考えていました。
問題は、その例を見ると、次のことです。
私は再びアクティビティの周りのパスを必要とする行き止まりに直面しています (今回はObject
データとして偽装されています)。
この「鶏が先か卵が先か」の状況から抜け出すにはどうすればよいでしょうか。
この問題にアプローチするより良い方法はありますか?
java - Javaメモリモデルで説明されている初期化の安全性について説明してください
- Javaメモリモデルで必要とされる初期化の安全性を説明できる人はいますか?
- 最終フィールドは、初期化の安全性を達成するのにどのように役立ちますか?
- 初期化の安全性を確保する上でコンストラクターはどのような役割を果たしますか?
java - 巻き上げと並べ替えは同じですか?
私はEffectiveJavaから、同期がない場合、以下のシーケンスAを仮想マシンによってシーケンスBに変換できることを読みました。これは、と呼ばれhoisting
ます。また、変数が揮発性命令として宣言されていない場合、変数を含む命令を並べ替えることができることもどこかで読みました。巻き上げと並べ替えは同じですか?
java - メインメモリへの/からの同期データ読み取り/書き込み
同期メソッドが完了すると、それによって変更されたデータのみがメイン メモリにプッシュされますか、それともすべてのメンバー変数がプッシュされますか?キャッシュ内のメンバー変数とその値をメイン メモリから読み取りますか? 例えば
上記のコードでは、compute が threadA によって実行され、getResult が threadB によって実行されると想定しています。compute の実行後、threadA はメイン メモリを a と b で更新するか、a、b、c と d を更新します。getResult を実行する前に、threadB はメイン メモリから b と c の値のみを取得しますか、それともキャッシュをクリアしてすべてのメンバー変数 a、b、c、および d の値をフェッチしますか?
java - 可視性の適時性に関する volatile の詳細なセマンティクス
を検討してくださいvolatile int sharedVar
。私たちは、JLS が次の保証を提供することを知っています。
- プログラム順で値の
w
書き込みに先行する書き込みスレッドのすべてのアクションは、書き込みアクションです。i
sharedVar
happens-before
- 読み取りスレッドによる値の読み取りの成功
i
による値の書き込み。w
happens-before
i
sharedVar
r
- 読み取りスレッドによる
i
からの読み取りの成功プログラム順の後続のすべてのアクション。sharedVar
r
happens-before
r
ただし、読み取りスレッドがいつvalue を監視するかについては、実時間の保証はまだありませんi
。値がこのコントラクトに準拠していることを読み取りスレッドに認識させない実装。
私はこれについてしばらく考えましたが、抜け穴は見当たりませんが、抜け穴があるに違いないと思います。私の推論の抜け穴を指摘してください。
java - Javaでのメモリ割り当て-Android
私が持っている場合:
このコードが実行されると、4つのインスタンスのうちどれがまだメモリに残っていますか?.recycle()がネイティブコードにすべてのリソースの割り当てを解除するように指示していることは知っていますが、それがいつ発生するかは保証されていません。
私が尋ねている理由は、次のループを見てみましょう:
これは最終的にアプリをクラッシュさせる(メモリ不足)と思いますか?もしそうなら、このループはどのように書き直されるべきですか?(ビットマップを使用して、変更された状態をアニメーション化および表示している場合)。