問題タブ [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.

0 投票する
11 に答える
5227 参照

c - ヒープを使用せずに C アプリケーションを作成できますか?

組み込み環境でスタック/ヒープの衝突と思われる現象が発生しています (背景については、この質問を参照してください)。

ヒープにメモリを割り当てないようにコードを書き直してみたいと思います。

C でヒープを使用せずにアプリケーションを作成できますか? たとえば、動的メモリ割り当てが必要な場合にのみスタックを使用するにはどうすればよいでしょうか?

0 投票する
6 に答える
15400 参照

c++ - ヒープ上に配列を作成し、ポインターでアドレス指定する

ヒープ上に配列を作成し、9から0までの文字で埋めることを望んでいた次のコードを理解するのに苦労しています([]表記を使用して、通常のスタック配列のように配列にインデックスを付けることができることはわかっていますこれを行うには、ポインターをより深く理解するためにこのようにしています):

完全に予期しない値を出力します。

上記を理解しているように、「new」コマンドはヒープ上に配列を作成し、配列があるアドレスへのポインターを送り返します。割り当てるポインター (ptrHeapArray) は int サイズであるため、ポインター ポスト インクリメントを使用して配列をナビゲートできると想定しました。しかし、結果は私の仮定が間違っていることを示しています。

これにより、おそらく「new」キーワードによって返されたポインターは配列全体への単なるポインターであり、何らかの理由で配列をステップスルーするために使用できないと考えるようになりました。そこで、「new」キーワードによって返されるポインターへの別のポインターを作成して、それを使用して配列の作成を試みました。

これはうまくいきました。なぜ私がこれをしなければならなかったのか、「new」キーワードによって返されたポインターを使用できなかったのか、誰かが説明できますか?

ありがとう

0 投票する
5 に答える
4284 参照

java - できるだけ多くのメモリを節約するように Spring を構成するにはどうすればよいですか?

メモリの制約があるセミエンベデッド デバイスにアプリケーションを展開しています。アプリのヒープダンプを分析し、最大の消費者を攻撃して、できる限り節約しようとしています。

Spring 2.5 を Spring DM 1.1 と一緒に使用していますが、Spring は XML から解析されたすべての BeanDefinitions を含むオブジェクト グラフ全体を保持しているように見えるため、より複雑な Spring コンテキストを持つバンドルの一部がかなりの量のメモリを使い果たしていることに気付きました。 . アプリが初期化され、すべてが注入されたら、これのほとんどは不要であると思います。

この動作を制御できるSpringの構成オプションはありますか? 低メモリモードで実行しますか? 不要なものをすべて捨てる?計算時間をサイズと引き換えに?

0 投票する
1 に答える
9763 参照

c - スタックまたはヒープ上にありますか?

パズルのような C コードがいくつかあります。このコードを使用する理由として、structオブジェクトがヒープまたはスタックで終了しているかどうかをどのように判断できるか疑問に思っています。

オブジェクトはまたはで作成されていません。彼らは配列の形で人生を始めます。この記事では、構造体 Emp を呼び出します。malloccalloc

オブジェクトはさまざまな方法でソートおよび操作され、ある時点でオブジェクトがコピーされ、配列ポインターに渡されます。コピーは を介し​​て行われmemcpyます。次に、オブジェクトは次のように配置されますEmp* emps_a[6]

オブジェクトはコピーから取得され、上記の emps_a に割り当てられます。

これの一部または一部が私の質問に関係しているかどうかはわかりません。私は free() を必要としたり、メモリをクリーンアップしたりする必要はありません... 残念ながら、私は C についてあまり知りません。

助けていただければ幸いです。

0 投票する
15 に答える
161977 参照

java - Java が起動を拒否 - オブジェクト ヒープに十分なスペースを予約できませんでした

バックグラウンド

約 20 の Linux ブレードのプールがあります。Suse を実行している人もいれば、Redhat を実行している人もいます。次の 3 つのフォルダーを含むすべての共有 NAS スペース:

  • /NAS/app/java - Java JDK のインストールを指すシンボリック リンク。現在のバージョン 1.5.0_10
  • /NAS/app/lib - アプリケーションのバージョンを指すシンボリック リンク。
  • /NAS/data - 出力が書き込まれるディレクトリ

すべてのマシンには、4 GB の物理メモリと 4 GB のスワップ スペースを備えた 2 つのプロセッサ (ハイパースレッド) があります。各マシンが一度に処理できる「ジョブ」の数を 6 に制限しています (この数はおそらく変更する必要がありますが、現在の問題には含まれていないため、当面は無視してください)。

一部のジョブでは最大ヒープ サイズを 512mb に設定し、他のジョブでは最大ヒープ サイズを 2048mb に設定しています。繰り返しになりますが、ヒープ サイズが 2048 に設定された同じマシンで 6 つのジョブが開始された場合、使用可能なメモリを超える可能性があることはわかっていますが、私たちの知る限り、これはまだ発生していません。

問題

ジョブがすぐに失敗し、次のメッセージが表示されることがあります。

これは、同じマシンで同時に実行されるジョブが多すぎるためだと考えていました。問題が発生する頻度は非常に低いため ( 1か月に 1 回程度)、再起動するだけで問題ありませんでした。

この問題は最近、さらに悪化しています。2048m の最大ヒープ サイズを要求するすべてのジョブは、ほぼ毎回すぐに失敗し、完了するまでに数回再起動する必要があります。

個々のマシンに出て、手動で実行しようとしましたが、同じ結果が得られました。

デバッグ

この問題は SuSE ボックスにのみ存在することが判明しました。より頻繁に発生している理由は、マシンを追加しているためです。新しいマシンは SuSE です。

SuSEボックスで「cat /proc/version」を実行すると、次のようになります。

RedHat ボックスで「cat /proc/version」を実行すると、次のようになります。

「uname -a」を実行すると、両方のタイプのマシンで次の結果が得られます。

マシン上でジョブが実行されておらず、他のプロセスが多くのメモリを使用していません。現在実行中のすべてのプロセスが合計 100 MB を使用している可能性があります。

'top' は現在、次を示しています。

現在、「vmstat」には次の情報が表示されます。

次のコマンド ライン (1850 MB の最大ヒープ) でジョブを開始すると、正常に開始されます。

最大ヒープ サイズを 1875mb に上げると失敗します。

現在使用されているメモリがバッファリング/キャッシング用であることは明らかであり、そのため「空き」として表示されるメモリはほとんどありません。明確でないのは、1850 mb の魔法のラインがあり、それ以上になると Java が起動できないことを意味する理由です。

説明をいただければ幸いです。

0 投票する
2 に答える
5704 参照

linux - SuSE Linux の最大 Java ヒープ領域とは

この質問はJava Refuses To Start - Could Not Resrve Enough Space for Object Heapに関連しており、簡単に理解できるはずです。でも; 私の検索では、有用なものは何も得られませんでした。

基本的に、同じハードウェアの異なるマシンに 2 つの 32 ビット OS (RedHat と SuSE) があります。どちらも同じ JVM を使用し、同じコマンド ラインを実行します。RedHat は問題なく動作しますが、SuSE は十分なメモリがないと報告します。

これが使用している SuSE のバージョンの制限なのか、それとも別の問題なのかを知る必要があります。

「cat /proc/version」は次のようになります。

「uname -a」を実行すると、両方のタイプのマシンで次の結果が得られます。

0 投票する
5 に答える
14697 参照

java - JVM は System.identityHashCode() が変更されないことをどのように保証しますか?

通常、 のデフォルトの実装はObject.hashCode()、メモリ内のオブジェクトの割り当てられたアドレスの関数です (ただし、これはJLSによって義務付けられていません)。VM がメモリ内でオブジェクトをシャントすることを考えると、System.identityHashCode()オブジェクトの有効期間中に返される値が決して変わらないのはなぜですか?

それが「ワンショット」計算である場合 (オブジェクトhashCodeは 1 回計算され、オブジェクト ヘッダーなどに格納されます)、2 つのオブジェクトが同じものを持つ可能性があることを意味しますidentityHashCodeか?メモリ内の同じアドレス)?

0 投票する
23 に答える
13960 参照

c++ - C++ のすべてにポインターを使用しないのはなぜですか?

いくつかのクラスを定義するとします。

次に、それを使用していくつかのコードを記述します。なぜ私は次のことをするのですか?

Java の世界から来て、私はいつも次のように書いています。

彼らは基本的に同じことをしますよね?1 つはスタック上にあり、もう 1 つはヒープ上にあるため、後で削除する必要があります。両者の間に根本的な違いはありますか?どちらかを優先する必要があるのはなぜですか?

0 投票する
1 に答える
335 参照

java - Javaオブジェクトメソッドスタックフレームパラメータ

したがって、Javaでは、クラス「Foo」に非静的メソッド「bar()」があるとします。

次に、このメソッドを次のように呼び出すとします。

これで、呼び出しのスタックフレームには、整数パラメーターと、オブジェクトへの内部参照として使用される「this」パラメーターが含まれます。

'this'とメソッドパラメータに加えて、他にどのような興味深いパラメータが新しいスタックフレームにコピーされますか?