問題タブ [unmanaged-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 - Java のメモリ不足
.NET の GC.AddMemoryPressure メソッドのように、アンマネージ メモリの割り当てについてランタイムに通知する Java の機能はありますか?
c# - マネージコードへのアンマネージ配列の入力
アンマネージDLLライブラリと連携するマネージプログラムがあります。
ライブラリはオブジェクトを構築します。オブジェクトは、(コールバック関数によってデリゲートに変換されて)管理対象ホストに管理対象外の配列を埋めるように要求します。配列自体は、そのサイズに関する情報とともにポインター(IntPtr)を介して渡されます。タイプは両側に知られています。重要なのは、マネージコードのデータでアンマネージ配列を安全に埋めるにはどうすればよいのでしょうか。2つの制限が適用されます。安全でないコードがないことと、できれば追加の配列が作成されないことです。そのようなものが存在する場合、配列は別の方法で渡される可能性があります。
コールバックに次のプロトタイプを持たせます。
デリゲートに次のプロトタイプを持たせます。
c# - アンマネージメモリをマネージバイトアレイにコピーする
アンマネージメモリをマネージバイト配列に読み込む必要があります。
このために、アンマネージメモリへのIntPtr参照と、関心のあるアンマネージメモリのサイズを表す長さがあります。
次のコードを使用して、それをマネージドバイト配列に読み込みます。
ただし、これによりパフォーマンスが非常に低下します。256KBのアンマネージメモリを使用してこのメソッドを1000回呼び出すと、7秒以上かかります。これを行うにはもっと効率的な方法があるはずだと思います。
事前に読み取る必要のあるメモリのサイズがわからないため、Marshal.PtrToStructureを使用できませんでした。
この機能のパフォーマンスをどのように改善できるかについてのアイデアはありますか?
wpf - 管理されていないオブジェクトでの WPF パフォーマンスの問題
C# を使用して WPF でアプリケーションを開発しました。アプリケーションには、特定のウィンドウにカメラを表示するためのサードパーティの dll が含まれています。
通常、アプリケーションは、カメラ オブジェクト (管理対象外オブジェクト) なしで 90 MB ~ 135 MB のメモリを使用します。つまり、デザインとコード ページ (xaml と xaml.cs) でカメラ オブジェクトに関するすべてのコードを削除しました。メモリが増加し、1 つの最大値で停止します。
アプリケーションでカメラ オブジェクトを使用すると、メモリが徐々に増加しています。毎回カメラウィンドウを開くと、メモリが135MB→141MB→143MB…と徐々に増えていきます。
管理されたメモリをクリアするために必要なすべての場所にGC.CollectとUsingステートメントを使用しました。メモリの増加を減らすことも、停止することもできません。
この問題を解決するには?
任意の提案をいただければ幸いです
前もって感謝します。
c# - .NET アプリケーションでアンマネージ メモリが急激に増加する
非常に奇妙な問題を示すアプリケーションを実行しています。約 2.5 時間は正常に動作しますが、突然、管理されていないメモリが増加し始め、急速に増加します。さらに約 30 分以内に、アプリがクラッシュします。
アプリケーションはアンマネージ DLL を使用していません。外部アプリケーションと通信しています。ソケット (ストリーム経由で使用) を使用して書き込み、WCF ストリームを介して読み取ります。
ANTSでプロファイリングしました。アンマネージ メモリ使用率の突然の変化は非常に印象的です。永久に完全にフラットなままで、その後突然増加し始め、アプリケーションが失敗するまで一定の速度で増加し続けます。マネージ メモリ内には、場違いに見えるものはありません。
アンマネージ コードを意図的に使用しているわけではないので、リークの原因を特定するのは困難です。ANTSは役に立ちません。最初から着実に増加していない場合、コードをスクラブして問題を解決するのは困難です (アプリは常にアイドル状態のままですが、非常に小さなデータでソケットを介して毎秒 1 回サーバーに ping を実行します)。
繰り返しになりますが、この間、アプリケーションとサーバーは両方ともアイドル状態です。これは、分離されたテスト システム (サーバーとクライアントの両方) で実行されています。漏れているのはクライアントです。
c# - UTF8エンコーディングを使用して、事前に割り当てられたアンマネージバッファにC#文字列を書き込む
Utf8としてエンコードされた事前に割り当てられたアンマネージバッファにC#文字列を書き込む必要があります。回答する前に、次の要件をお読みください。
- 新しい割り当てはありません(バイト配列やその他のインスタンス化の作成に関する回答に私を誘導しないでください)
- アンマネージコードへの移行なし(pinvoke / calliなし)
現在、OpCodes.Cpblkを使用して、生の文字列をC#からアンマネージバッファに16ビット文字を使用してコピーしています。これにより、x64アーキテクチャでアンマネージドmemcpyを使用する場合とほぼ同じパフォーマンスが得られ、スループットをそれに近づける必要があります。
文字列をchar *として修正し、それを反復処理することを検討していますが、ジャンプテーブルなしでエンコーダーを実装することは、パフォーマンスに関しては面倒であり、最適とは言えません。
c++ - 管理されたバイト配列を管理されていない文字列に変換する
C ++/CLIラッパーでマネージドバイト配列をstd::stringに変換しようとしています。ただし、後でヒープ内に破損したメモリが表示されます。変換が正しく行われているかどうかを確認したかっただけです。以下は私のメソッドですCLIです:
上記のコードに何か問題があるように見えますか?
c# - 外部 API のエラーは、メイン アプリケーションでの GC.Collect() の呼び出しにどのように依存しますか?
私は、C# 最適化ルーチンでこの動作を説明しようとしています。
このプログラムは、サブルーチンで cplex 12.2 API を使用して大規模な LP を作成および解決します。このバグを追跡する目的で、同じ問題を繰り返し解決するように変更しました。解決後、インスタンスで cplex.End() を呼び出すと、cplex インスタンスがスコープ外になるため、メモリの割り当てが解除されます。
2 回目にモデルを作成して cplex.Solve() を呼び出すと、モデルが解決されません。「CPLEX エラー 1217: 解決策がありません」というエラーが表示されますが、これは最初に同じ問題を解決したため信頼できません。(クラッシュ時のメモリ要件はわずか 1.3 GIG でした)
ここで、2 つの解決の間にガベージ コレクションを強制すると、cplex は最初と同じように 2 回目にモデルを解決します。
誰かが私にこの動作を説明できますか? そして、それを適切に修正する方法は?
c++ - ファイナライザーからアンマネージ メモリへのアクセス違反
c++/cli ファイナライザーからアンマネージ クラスのメモリをクリーンアップしようとしたところ、AcessViolation エラーが発生しました。私はこのようなことをします:
誰が知っていますか、何が問題なのですか?回答ありがとうございます。
.net - .NETアプリケーションのネイティブヒープ関連のメモリリーク
サービスである.NET2.0アプリケーションがあり、主に.NETリモーティングを介して複数のクライアントが接続されています。サービスは、本番環境中にクライアントサイトでOutOfMemory例外を使用してクラッシュするため、現在、予期しないクラッシュを回避するために、毎日かそこらでサービスを再起動する必要があります。
以前は、マネージコード(静的コレクションが保存されているオブジェクトをクリーンアップしない静的コレクションと、論理スレッド数が継続的に増加している別のケース)で、メモリリークのいくつかのケースを正常に解決しました。したがって、私はメモリダンプをキャプチャし、WinDbg+SOSでそれらを検索することにかなり精通しています。
ただし、この場合、プライベートバイトは増加していますが、すべてのヒープのバイトは安定したままであり、アンマネージコードのメモリリークを示しています。実際のOOM例外を伴うクラッシュダンプを受け取りました。これにより、次のことがより明確になります。
.NETアプリケーションのアンマネージコードのリークの処理に関するTessFerandezのブログ、およびネット上の他のリソースを確認して、多くのダイナミックアセンブリ、一般的なXmlSerializerの問題、またはサードパーティのネイティブDLL(そこにある)などの問題を除外しました。ありません)。ただし、周りにはかなりの数のP/Invokesがあります。先に進むと、ヒープをチェックすると、次のように返されます。
2番目のコマンドは、すべてのエントリも返しました。今、私が読んだいくつかのものによると、スタックを取得するには!heap -p -aを実行する必要がありますが、取得するのは
この質問によると、これは誤ったgflagsの使用法などです。ただし、サービスをローカルで開始し、それにデバッガーを接続することは、現在のところオプションではありません。簡単に言うと、クライアントと同様の構成と負荷で環境をセットアップして実行する必要がありますが、これは準備ができていません。
だから、私はかなり立ち往生しています。ここから先に進むか、またはその問題のトラブルシューティングに正しいアプローチを使用している場合でも、わかりません。どんなポインタでも大歓迎です。
編集#1:外部リソースを使用するスレッドのThread.abort。具体的には、OracleのODP.NETプロバイダーを介したデータベース接続。それがネイティブヒープのリークの原因である可能性がありますか?