問題タブ [out-of-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.
java - 十分なメモリが残っているにもかかわらず、JVM が gc 中に OutOfMemory をスローする
5G メモリを使用するように Java アプリケーションを構成しています。突然 OutOfMemory が発生しました。gc ログを調べたところ、十分なメモリが残っていることがわかりました。若い世代は割り当てられた領域の 4% を占有し、終身世代の占有率は 5% であり、perm 世代は 43% です。JVM が gc 時に OutOfMemory をスローする理由がわかりません。なぜこれが起こっているのか誰にも分かりますか?よろしくお願いいたします。
JVM メモリと gc の設定:
gc.log
私は 64 ビット Linux と JRE 1.6.0_10 を使用しています。
debugging - ERROR_NOT_ENOUGH_MEMORYのトラブルシューティング
私たちのアプリケーションは、特定のユーザーのコンピューターで失敗していますERROR_NOT_ENOUGH_MEMORY
(「このコマンドを処理するのに十分なストレージがありません」)。
エラーは、使用しているDelphi VCLフレームワークのどこかで発生しているようです。そのため、どのWindowsAPI関数が原因であるかわかりません。
メモリは問題ですか? を呼び出すとGlobalMemoryStatus
、次の情報が得られます。
- dwTotalPhys-1063150000(〜1 GB)
- dwAvailPhys-26735000(〜27 MB)
- dwAvailPage-1489000000(〜1.4 GB)
ページングファイルに十分なスペースがある場合にWindowsが使用可能な物理メモリを非常に少なくするのは奇妙に思えますが、Windowsの仮想メモリ管理については、これが正常かどうかを知るのに十分な知識がありません。それは...ですか?
メモリでない場合、どのリソース制限に達していますか?私がオンラインで読んだものからERROR_NOT_ENOUGH_MEMORY
、アプリケーションがいくつかの制限(GDIオブジェクト、USERオブジェクト、ハンドルなど)のいずれかに達した結果である可能性があり、必ずしもメモリではありません。Windowsが適用する制限の包括的なリストはありますか?どの制限に達しているかを確認する方法はありますか?Googleを試しましたが、体系的な概要が見つかりませんでした。
java - 別のJavaスレッドでのOutOfMemoryError
新しいスレッドで新しいRunnableを実行するメインスレッドがあると考えてください。これで、新しいスレッドの実行中に、Java VMのメモリが不足し、OutOfMemoryErrorがスローされます。
何が起こるのですか?ターゲットスレッドは停止しますか?メインスレッドは続行されますか?新しいスレッドがクラッシュした場合、VMはそのスレッドからメモリを再利用し、実行を続行しますか?
.net - OutOfMemoryですが、多くのオブジェクトのgcrootはありません
かなり大きなWindowsフォームアプリケーションを開発しています。いくつかの顧客のコンピュータでは、OutOfMemory例外でクラッシュすることがよくあります。例外(UnhandledExceptionハンドラーから呼び出されたclrdump)の直後のアプリケーションの完全なメモリダンプを取得した後、「。NETMemoryProfiler」とwindbgを使用して分析しました。
メモリプロファイラーは、ライブオブジェクトインスタンスで130MBしか表示していません。興味深いのは、多くのオブジェクトタイプで、非常に多くの到達不能インスタンス(たとえば、22000到達不能Byte []インスタンス)が表示されていることです。ネイティブメモリの統計では、データのすべてのヒープで合計127MB(これは問題ありません)ですが、第2世代のヒープでは到達不能な133MB、大きなヒープでは640MB(問題ありません)を示しています。
windbgを使用してダンプを分析すると、上記の統計が確認されます。
アプリケーションは、実行時に多数の短いバッファーを使用しますが、それらをリークしません。!gcrootを使用してByte []インスタンスの多くをテストすると、ルートがなくなります。明らかに、これらのアレイのほとんどは、メモリプロファイラーによって示されるように到達不能です。
すべてが正常であることを確認するために、!finalizequeueは、ファイナライズを待機しているオブジェクトがないことを示します
また、ネイティブファイナライザーのスレッドスタックトレースをチェックして、ブロックされていないことを示します。
現時点では、GCがデータを収集しない理由を診断する方法はありません(プロセスのメモリが不足しているため、診断したいと思います。)
編集:以下の入力に基づいて、ラージオブジェクトヒープの断片化についてもう少し読みましたが、これが当てはまるようです。
この種のデータ(私の場合はさまざまなbyte [])に大きなメモリブロックを割り当て、この領域のメモリを自分で管理するためのアドバイスを見てきましたが、これはかなりハックな解決策のようで、私が期待するものではありませんそれほど特別ではないデスクトップアプリケーションの問題を解決するため。
断片化の問題は、LOH上のオブジェクトが存在中に再配置されないという事実(少なくともMicrosoftの多くの人々がブログで述べていること)によって引き起こされます。これは理解できますが、次のようなメモリのプレッシャーに達すると論理的に見えます。 OOMを取得する恐れがある場合は、再配置を実行する必要があります。
断片化が原因であると完全に信頼する前に私が心配する唯一のことは、LOH上の非常に多くのオブジェクトがgcroot参照を持たないことです-これは、LOHのガベージコレクションでも部分的にしか実行されないためですか?
現時点で私が知っている唯一の解決策は、事前に割り当てられたメモリブロックのカスタム管理であるため、興味深い解決策を紹介できれば幸いです。
どんなアイデアでも大歓迎です。ありがとう。
c++ - CComBSTR メモリ割り当て
非常に長い文字列を持つ「const char* str」があります。cpp クライアントから、BSTR タイプを想定する .Net COM メソッドに渡す必要があります。現在私は使用しています:
これには次の問題があります。
- この行がメモリ不足のメッセージで失敗することがあります
- bstr を COM クラスに渡すと、大量のメモリ (文字列サイズよりもはるかに多く) が必要になるため、メモリ不足で失敗する可能性があります。
質問:
- 賢明に CComBSTR に変換していますか? たとえば、ヒープなどを使用する方法はありますか
- 代わりに BSTR を使用する方が良いですか?
その他のご提案も大歓迎です...
java - java.lang.OutOfMemoryError:Javaヒープスペース
マルチスレッドプログラムの実行時に次のエラーが発生します
上記のエラーは、スレッドの1つで発生しました。
私の知る限り、ヒープスペースはインスタンス変数のみで占められています。これが正しければ、オブジェクトの作成時にインスタンス変数のスペースが割り当てられるため、しばらくの間正常に実行された後にこのエラーが発生した理由。
ヒープスペースを増やす方法はありますか?
ヒープスペースを少なくするために、プログラムにどのような変更を加える必要がありますか?
c# - OutOfMemory 例外
OutofMemory
例外の考えられる理由は何ですか。メモリ割り当ては GC で処理する必要があります。
通常の .NET/C# アプリケーションに割り当てられている/使用可能なメモリの量
私たちのアプリケーションでは、Stream.ReadToEnd()
やDataTable.WriteXml(Memory stream)
関数などのさまざまな場所にあります。
環境は.Net C#
java - Javaメモリリーク
誰かがEclipseメモリマネージャを使用してJavaコードのメモリリークを検出しましたか?メモリマネージャの使用に関する情報を探すのに適した場所を誰かが勧めることはできますか?オンラインで何かを読んだところ、クラッシュするまで(メモリ不足エラーが発生するまで)プログラムを実行する必要があることがわかりました。これにより、クラッシュレポートが生成されます。次に、メモリマネージャを使用してこのレポートを開き、メモリリークが発生する可能性のある場所を調べます。これは誰もがメモリマネージャを使用する方法ですか?
c++ - Linux 楽観的な malloc: new はメモリ不足のときに常にスローしますか?
Linux でのメモリ不足の状態について読んでいて、man ページの次の段落で考えさせられました。
デフォルトでは、Linux は楽観的なメモリ割り当て戦略に従います。これは、malloc() が非 NULL を返す場合、メモリが実際に使用可能であるという保証がないことを意味します。これは本当に悪いバグです。システムのメモリが不足していることが判明した場合、悪名高い OOM キラーによって 1 つまたは複数のプロセスが強制終了されます。[...]
オペレーターの new 実装がある時点で malloc を呼び出すことになることを考えると、Linux で new が実際にスローされるという保証はありますか? そうでない場合、この明らかに検出できないエラー状況をどのように処理しますか?