タグ付けされた質問 「memory」

このタグは、メモリ管理やプログラミングの問題に使用します。一般的なソフトウェアのメモリハードウェアの問題またはエラーに関する質問については、https://superuser.com、またはこれがエンタープライズレベルのハードウェアまたはソフトウェアに関連している場合はhttps://serverfault.comにアクセスしてください。


5
Java 8のデフォルトのXmxsize(最大ヒープサイズ)
では、OracleのマニュアルIが見つかりました: -Xmxsizeメモリ割り当てプールの最大サイズ(バイト単位)をバイト単位で指定します...デフォルト値は、システム構成に基づいて実行時に選択されます。 システム構成とはどういう意味ですか?
81 java  memory 

1
C ++のクラスのサイズがデータメンバーのパブリック/プライベートステータスに依存するのはなぜですか?
私が知っていることから、C ++のクラスのサイズは以下の要因に依存します- すべての非静的データメンバーのサイズ。 データメンバーの順序。 バイトパディングが有効かどうか。 直接の基本クラスのサイズ。 仮想機能の存在。 継承のモード(仮想継承)。 今私は以下のように2つのクラスを作成しました- class A{ int a; short s; int b; char d; };// kept a char at last on purpose to leave a "hole" class B : public A{ char c; }; AとBIのサイズを確認する Aのサイズ:16 Bのサイズ:16 私の仮定は、クラスBのchar cがクラスAに残された「穴」に収容されることです。 しかし、私を混乱させているのは、メンバーを公開する以下のシナリオです class A{ public: int a; …

3
static int arr [10]メモリアドレスは常に060で終わる
私はこのようなACプログラムを持っています main.c #include <stdio.h> #define SOME_VAR 10 static int heap[SOME_VAR]; int main(void) { printf("%p", heap); return 0; } コンパイルしたプログラムを数回実行すると、これが出力されます 0x58aa7c49060 0x56555644060 0x2f8d1f8e060 0x92f58280060 0x59551c53060 0xd474ed6e060 0x767c4561060 0xf515aeda060 0xbe62367e060 なぜそれが常に060で終わるのですか?そして、配列はヒープに格納されていますか? 編集:私はLinuxを使用していて、ASLRをオンにしています。gccを使用してプログラムをコンパイルしました
17 c  arrays  memory 

1
1 MB以上のJavaバイト配列がRAMの2倍を占める
Windowsの10の下のコードを実行している/ OpenJDKの11.0.4_x64は出力として生成used: 197とexpected usage: 200。これは、100万要素の200バイト配列が約100を占めることを意味します。200MB RAM。すべて元気です。 コード内のバイト配列割り当てをnew byte[1000000]からnew byte[1048576](つまり、1024 * 1024要素に)変更すると、出力used: 417ととして生成されますexpected usage: 200。一体何ですか? import java.io.IOException; import java.util.ArrayList; public class Mem { private static Runtime rt = Runtime.getRuntime(); private static long free() { return rt.maxMemory() - rt.totalMemory() + rt.freeMemory(); } public static void main(String[] args) throws InterruptedException, IOException { int …

1
Javaのオブジェクト初期化“ Foo f = new Foo()”は、Cのポインターにmallocを使用することと本質的に同じですか?
Javaでのオブジェクト作成の背後にある実際のプロセスを理解しようとしています。他のプログラミング言語もあると思います。 Javaでのオブジェクトの初期化がCで構造体にmallocを使用する場合と同じであると想定するのは間違っているでしょうか? 例: Foo f = new Foo(10); typedef struct foo Foo; Foo *f = malloc(sizeof(Foo)); これが、オブジェクトがスタックではなくヒープ上にあると言われるのはなぜですか?それらは本質的にデータへの単なるポインタなので?

4
揮発性読み取りを取り除くためにJavaでメモリバリアをエミュレートする
同時にアクセスされるフィールドがあり、何度も読み取られ、めったに書き込まれないと仮定します。 public Object myRef = new Object(); スレッドT1がmyRefを1分に1回別の値に設定し、他のN個のスレッドがmyRefを数十億回連続して同時に読み取るとします。myRefが最終的にすべてのスレッドに表示されることだけが必要です。 簡単な解決策は、AtomicReferenceまたは単にvolatileを次のように使用することです。 public volatile Object myRef = new Object(); ただし、afaikの揮発性読み取りではパフォーマンスコストが発生します。非常に小さいことはわかっていますが、これは実際に必要なものというよりは、私が不思議に思っているようなものです。したがって、パフォーマンスに関係なく、これは純粋に理論的な質問であると想定しましょう。 つまり、質問は次のようになります。書き込みサイトで何かを行うことによって、書き込みがほとんどない参照の揮発性読み取りを安全にバイパスする方法はありますか? いくつか読んだ後、メモリの壁が私が必要とするものであるように見える。したがって、このような構成が存在する場合、私の問題は解決されます。 書く バリアを呼び出す(同期) すべてが同期され、すべてのスレッドに新しい値が表示されます。(読み取りサイトでの永続的なコストがないと、キャッシュが同期されるため、古くなったり、一時的なコストが発生する可能性がありますが、その後は通常のフィールドに戻り、次の書き込みまで続きます)。 そのような構造はJava、または一般にありますか?この時点で私は仕方がありませんが、このようなものが存在する場合、それを維持するはるかに賢い人々によってすでにアトミックパッケージに組み込まれていると思います。(不定期に頻繁に読み取りと書き込みを行う必要はなかったのではないでしょうか?)それで、私の考えに何か問題があり、そのような構成はまったく不可能ですか? いくつかのコードサンプルが同様の目的で「揮発性」を使用し、それが契約前に発生することを利用するのを見てきました。別の同期フィールドがあります。例: public Object myRef = new Object(); public volatile int sync = 0; そしてスレッド/サイトを書く時: myRef = new Object(); sync += 1 //volatile write to emulate barrier これが機能するかどうかはわかりませんが、x86アーキテクチャでのみ機能すると主張する人もいます。JMSの関連セクションを読んだ後、その揮発性書き込みがmyRefの新しい値を確認する必要があるスレッドからの揮発性読み取りと結合されている場合にのみ、動作することが保証されていると思います。(したがって、揮発性の読み取りを取り除きません)。 …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.