問題タブ [heap-memory]
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.
c++ - どちらが速いですか: スタック割り当てまたはヒープ割り当て
この質問はかなり初歩的なものに聞こえるかもしれませんが、これは私が一緒に働いている別の開発者との議論です。
ヒープ割り当てではなく、可能な限りスタック割り当てに注意していました。彼は私に話しかけ、私の肩越しに見守っていて、パフォーマンスに関しては同じなので必要ないとコメントしました。
私は常に、スタックの成長は一定の時間であり、ヒープ割り当てのパフォーマンスは、割り当て (適切なサイズの穴を見つける) と割り当て解除 (断片化を減らすために穴を折りたたむ) の両方の現在のヒープの複雑さに依存するという印象を受けていました。私が間違っていなければ、多くの標準ライブラリの実装では、削除中にこれを行うのに時間がかかります)。
これは、おそらくコンパイラに大きく依存するものだと思います。特にこのプロジェクトでは、 PPCアーキテクチャ用のMetrowerksコンパイラを使用しています。この組み合わせに関する洞察は最も役に立ちますが、一般的に、GCC と MSVC++ の場合はどうでしょうか? ヒープ割り当てはスタック割り当てほどパフォーマンスが高くないですか? 違いはありませんか?または、違いが非常に小さいため、無意味なマイクロ最適化になります。
java - .hprof ファイルを分析するにはどうすればよいですか?
次のフラグで運用サーバーを実行しています: - XX:+HeapDumpOnOutOfMemoryError
昨夜、サーバーでヒープ エラーが発生したときに、java-38942.hprof ファイルが生成されました。システムの開発者はフラグを知っていましたが、そこから有用な情報を取得する方法がありませんでした。
何か案は?
operating-system - malloc/free 以外に、プログラムは OS が何かを提供する必要がありますか?
私が取り組んでいる OS 用のカーネル (実際には「コア」と呼んでいますが、基本的には同じです) の設計に取り組んでいます。マルチタスキングやメモリ管理などの基本的なことができなければ、OS 自体の詳細は関係ないので、まずはそこから取り組む必要があります。malloc ルーチンの設計について質問があります。
malloc() はカーネル自体の一部 (私はこれに傾倒しています) またはプログラムの一部になると考えていますが、C 標準ライブラリの独自の実装を作成する必要があります。というわけで、malloc を書きます。この点に関して、私の質問は実際にはかなり単純です。C (または C++) はそのヒープをどのように管理しますか?
私が理論の授業でいつも教えられてきたのは、ヒープは指定されたアドレスから始まり、多くの意味でスタックのように振る舞うメモリの断片であるということです。このようにして、グローバルスコープで宣言された変数が最初にあり、それぞれのスコープで宣言されると、より多くの変数がヒープに「プッシュ」され、スコープ外に出る変数は単にメモリ空間に残されることがわかります。ただし、そのスペースは空きとしてマークされているため、必要に応じてヒープをさらに拡張できます。
私が知る必要があるのは、C がこのように動的に拡大するヒープを実際にどのように処理するのかということです。コンパイルされた C プログラムは、malloc ルーチンへの独自の呼び出しを行い、独自のヒープを処理しますか? それとも、自動的に拡張するスペースを提供する必要がありますか? また、C プログラムはヒープの開始位置をどのように認識していますか?
ああ、同じ概念が他の言語にも当てはまることは知っていますが、私はその言語に最も慣れているので、例を C/C++ にしたいと思います。スタックなど他のことも気にしないようにしたいと思います。このようなことは自分で処理できると思います。
したがって、私の本当の質問は、malloc/free (ページ自体の取得と解放などを処理する) 以外に、プログラムは OS が他に何かを提供する必要があるのでしょうか?
ありがとう!
EDIT mallocルーチン自体の実際の動作よりも、Cがヒープに関連してmallocを使用する方法に興味があります。それが役立つ場合、私はこれを x86 で実行していますが、C はクロス コンパイラであるため、問題にはなりません。^_^
さらに編集:用語が混乱している可能性があることを理解しています。「ヒープ」は、プログラムがグローバル/ローカル変数などを格納する場所であると教えられました。私はアセンブリ プログラミングで「スタック」を扱うことに慣れていましたが、代わりにおそらくそれを意味していることに気付きました。私のちょっとした調査によると、「ヒープ」は、プログラムがそれ自体に割り当てた合計メモリ、または OS が提供したメモリのページの合計数 (および順序) を指すのによく使用されます。
それで、それを念頭に置いて、拡大し続けるスタックにどのように対処すればよいでしょうか? (私の C 理論の授業は軽度の... 欠陥があったようです。)
java - Java の非常に大きなヒープ サイズ
Java で 12 GB 以上の非常に大きなヒープを使用した経験のある人はいますか?
- GC はプログラムを使用不能にしますか?
- どのGCパラメータを使用していますか?
- これには、どの JVM、Sun、または BEA が適していますか?
- このような条件下で、Linux と Windows のどちらのプラットフォームのパフォーマンスが優れているでしょうか?
- Windows の場合、64 ビット Vista と XP では、このような高いメモリ負荷の下でパフォーマンスに違いはありますか?
c - 大量のチャーン、小さな割り当てのための効率的なヒープマネージャー?
非常に特殊な状況を処理するためのヒープマネージャーのアイデアを探しています。それぞれ12〜64バイトの範囲の非常に小さな割り当てがたくさんあります。それよりも大きいものは、通常のヒープマネージャーに渡すので、小さなブロックだけに対応する必要があります。4バイトのアライメントのみが必要です。
私の主な関心事は
- オーバーヘッド。通常のlibcヒープは通常、割り当てを16バイトの倍数に切り上げてから、別の16バイトヘッダーを追加します。これは、20バイトの割り当てで50%を超えるオーバーヘッドを意味します。
- パフォーマンス
1つの有用な側面は、Lua(このヒープのユーザー)がfree()を呼び出すときに解放するブロックのサイズを通知することです。これにより、特定の最適化が可能になる場合があります。
現在のアプローチを投稿します。これは問題なく機能しますが、可能な限り改善したいと思います。何か案は?
c++ - なぜ「delete[]」演算子が必要なのですか?
これは、しばらくの間私を悩ませてきた質問です。delete
C ++は、演算子(角かっこなし)が演算子でも機能するように設計されているべきだといつも思っていましたnew[]
。
私の意見では、これを書く:
1つの要素の配列を割り当てることと同等である必要があります。
これが当てはまる場合、delete
演算子は常に配列を削除している可能性があり、演算子は必要ありませんdelete[]
。
delete[]
演算子がC++で導入された理由はありますか?私が考えることができる唯一の理由は、配列の割り当てはメモリフットプリントが小さいため(配列サイズをどこかに保存する必要がある)、delete
vsを区別することdelete[]
はメモリの最適化が小さいことです。
java - 一般的な質問: Java にはヒープとローカル スタックがあります。ヒープから任意のオブジェクトにアクセスできますか?
値渡しと、Java がオブジェクトを割り当てる方法と、オブジェクトをスタックに置くために Java が行うこととの違いを実際に調べていました。
ヒープに割り当てられたオブジェクトにアクセスする方法はありますか? 適切なメソッドがヒープから適切なデータにアクセスできることを保証するために、Java が強制するメカニズムは何ですか?
あなたが狡猾で、実行時に Java バイトコードを操作することさえできれば、想定されていないときにヒープからデータを操作できる可能性がありますか?
.net - .net で最大ヒープ サイズを設定できますか?
Java のバックグラウンドを持つ私が慣れ親しんでいることの 1 つは、JVM に最大ヒープ サイズを指定することです。実行中のプログラムが許可されている以上のリソースを飲み込もうとし、ガベージ コレクターがこれ以上リソースを解放できない場合、OutOfMemoryError がスローされ、すべてが爆発します。そのため、Java では最大ヒープ サイズを設定することが重要です。
これは .net に適用されますか? ヒープ サイズの制限を設定できますか? CLR は、マシンの物理的な限界に達するまでヒープを増やし続けますか? それとも、Java ウィンカーが原因で見えなくなったのは、何らかの微妙な理由で .net の問題ではないのでしょうか?
java - Java オブジェクトのメモリ割り当てプロセスの手順
クラスが次のオブジェクトをインスタンス化すると、メモリ内で何が起こりますか?
クラスでSomeClass1
:
クラスでSomeClass2
:
新しくインスタンス化されたオブジェクトとそのプロパティにメモリがどのように割り当てられるか?
c++ - ヒープ上の C++ 多次元配列
多次元配列を動的に割り当てるにはどうすればよいですか?