問題タブ [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.
c# - アンマネージド メモリで C# クラスをインスタンス化する方法は? (可能?)
更新:「機能する」という受け入れられた回答があります。絶対に、絶対に、絶対に使用しないでください。今まで。
最初に、私がゲーム開発者であることを述べて、質問の前置きをさせてください。これを実行したいのには、正当な (非常に珍しい場合でも) パフォーマンス関連の理由があります。
次のような C# クラスがあるとします。
派手なものはありません。値型のみを含む参照型であることに注意してください。
マネージド コードでは、次のようなものが必要です。
関数はNewInUnmanagedMemory
どのように見えますか?C# でできない場合は、IL で実行できますか? (または、C++/CLI でしょうか?)
基本的に:どんなにハックであっても、完全に任意のポインタをオブジェクト参照に変える方法はありますか。そして-CLRを爆発させることを除いて-結果を気にします。
(私の質問の別の言い方は、「C# 用のカスタム アロケーターを実装したい」です)。
これは、フォローアップの質問につながります: 管理されたメモリの外部を指す参照に直面した場合、ガベージ コレクターは (必要に応じて実装固有の) 何をしますか?
Foo
それに関連して、メンバ フィールドとして参照があるとどうなるでしょうか。マネージ メモリを指している場合はどうなるでしょうか。アンマネージ メモリに割り当てられた他のオブジェクトのみを指している場合はどうなるでしょうか。
最後に、これが不可能な場合: なぜですか?
更新:これまでのところ「欠けている部分」は次のとおりです。
#1:IntPtr
をオブジェクト参照に変換する方法は? 検証不可能なIL(コメントを参照)でも可能かもしれません。これまでのところ、私はこれで運がありませんでした。フレームワークは、これが起こらないように非常に注意を払っているようです。
(blittable でないマネージド型のサイズとレイアウト情報を実行時に取得できると便利です。繰り返しますが、フレームワークはこれを不可能にしようとします。)
#2:問題 1 を解決できると仮定すると、GC ヒープの外部を指すオブジェクト参照に遭遇した場合、GC はどうしますか? クラッシュしますか?Anton Tykhyy は、彼の答えで、そうなると推測しています。フレームワークが#1を防ぐためにどれほど注意を払っているかを考えると、そうなる可能性が高いようです. これを確認する何かがいいでしょう。
(または、オブジェクト参照が GC ヒープ内の固定メモリを指すこともできます。違いはありますか?)
これに基づいて、私はこのハッキングのアイデアは不可能であると考える傾向があります-または少なくとも努力する価値はありません. しかし、#1または#2、またはその両方の技術的な詳細に入る答えを得たいと思います.
c# - .net4アプリケーションプールのアンマネージドメモリ
.net4アプリケーションで管理されていないメモリのソースを追跡しようとしています
(これは好奇心です...私はそれに大きな問題はありません、私はそれが何であるかを知りたいだけです)
私のアプリケーションは現在1つのファイルで構成されています:index.html-「helloworld」が含まれています
メモリプロファイラーからindex.htmlをロードしましたが、消費量はごくわずかです(実際、プロファイルはintをキックしていません)。
次に、/ fish(存在しません)をロードすると、突然、合計で約57MBの使用量になり、そのうち54MBはアンマネージメモリです。
これは、空のアプリケーションには大量のメモリのように見えます-そして、アンマネージメモリには何がありますか
2.4MBの「.NETに割り当てられた未使用のメモリ」がありますが、これは完全に予想されます。
不思議なことに、アプリプールを.net 2に切り替えても、メモリはこのようにジャンプしません
私が言ったように、私は興味があります、しかし私はそれについて何もオンラインで見つけることができません。
.net - .net でのメモリ管理に関するいくつかの質問
.net でのメモリ管理に関するいくつかのアイデアを読みましたが、次の 3 つの質問には回答がありません
- アンマネージド リソースは、マネージド リソースに使用されるのと同じマネージド ヒープでメモリを取得し、誰がそれを割り当てますか (OS または CLR またはその他)?
- 管理対象リソース R で Dispose() メソッドを呼び出すと、この R が占有しているメモリと、R が占有している他のすべての非管理対象リソースがすぐに解放されますか
- 誰が unmanages リソース (OS または CLR またはその他) によって占有されているメモリをクリアします。
どんな助けでも大歓迎です。
wpf - 高いアンマネージメモリ-WPFアプリケーション
新しいWPFアプリケーションを展開しようとしていますが、タスクマネージャーで大量のメモリを消費していることに気づきました。そこで、RedGate Antzの試用版をダウンロードして、この問題の原因を突き止めました。管理されていないメモリ使用量が約90MBであることにショックを受けました。Antzは損傷していないメモリをサポートしていないため、使用率が高いこと自体を示さないWindbgを使用しようとしました。これにより、ロードしているDLLの1つである必要があると思います。アプリケーションでDevExpressコントロールを使用しています。
興味深い機能は、アプリケーションを最小化すると、メモリがたとえば110 MBから約6〜10MBに減少することです。
私は心配/心配する必要がありますか?
これは私の最初のWPFアプリケーションであり、メモリ使用量の観点から何を期待できるか完全にはわかりません。このメモリを最小化すると、すべてが正常であるという兆候が回復/与えられますか?
これを引き起こしている可能性のあるものについての考えやアイデアが最も役立ちます。
memory-management - 管理データを変換してメモリにしばらく保持する
C# から呼び出すことができるように、C++ プロジェクトの周りに C++/cli ラッパーを作成しています。C# 側は、CLI メソッド [Put(String^ key, String^ value) など] を何百万回も呼び出して、キー/値管理データの大規模なセットを渡し、続いて別の呼び出し [Commit()] を呼び出して、C++ オブジェクトに要求します。データを使って何かをする。最後の呼び出しまですべてのデータをメモリに保持できる必要があるため、std::vector を使用し、管理されているすべての文字列を管理されていない std::string に変換して、cli のベクトルに保持しようとしています。コード。
私の質問は - このシナリオで管理されたデータを変換する最良の方法は何ですか? 管理されていないポインターを有効に保つために管理されたデータを固定することは、データがすぐに使用されないため、非常に悪い考えのようです (また、関数呼び出しの直後に固定が範囲外になると、これは機能しません。その結果、アクセス違反が発生します)。もう 1 つのオプションは、malloc を使用して「十分な大きさ」のバッファを割り当て、それにデータを追加し続けることです。(1) pin-ptr の後に memcpy が続きます (ピニングは一度 Put メソッドの範囲外になります)。戻り値) 単一の String^ データを変換/コピーする最良の方法は? (2) malloc の合計サイズが事前にわからないので、最初の malloc からメモリを拡張する最良の方法は何ですか? このシナリオの優れた設計ソリューションへのポインタをいただければ幸いです。
android - Java によるネイティブ メモリの使用
場合によっては、アプリのヒープ メモリ制限をバイパスして、許容量を超えて使用する必要があります。
私は、バイトをネイティブ メモリ (ヒープ メモリではなく、管理されていないメモリ) に格納するキャッシュ メカニズムを含むソリューションを考えました。
もちろん、システムの最大利用可能サイズを考慮に入れます。
したがって、 direct buffersについて少し知っていたので、これを使用してバイト配列をネイティブ メモリに格納しました。
ただし、Android では、これに使用されるメモリはネイティブ メモリではなくヒープで使用されるようです。
何が起こっている?ネイティブメモリからデータを保存およびロードするための簡単な代替手段はありますか?
.net - .Net アプリケーションでの極端なプライベート バイト使用量の分析、ネイティブ メモリ リーク?
実行中の .Net Web サイトでは、4.45 GB 以上の大量のプライベート バイトが使用されています。これは複数の Web サーバーで発生していますが、パターンはないようです。
他のいくつかの回答と、もちろんTess Ferrandez のブログの助けを借りて、 DebugDiagと WinDbg ( Win8 SDKの一部)を使用して、すでに多くの情報を取得しています。
3 GB を超えて消費している割り当ては 1 つだけであることがわかっています。
それがネイティブ メモリであることはわかっています。
ヒープ 1 に割り当てられていることがわかっています。
ここから先は行き詰まります。推奨されるコマンド (!heap -stat -h、!heap -flt s、および !heap -p -a) もここにありますが、この動作の原因に関する情報は提供されません。
誰もこれを見たことがありますか?nativerd (IIS のネイティブ コード構成リーダー) が暴走する原因を確認する他の方法やコマンドはありますか?
c# - メモリ ロケーションへの無効なアクセス - マネージ コードからアンマネージ コードへ
私はDLLによってエクスポートしたC ++でこのコードを持っています:
私はC#からdllを呼び出しています。これは私がそこに書いたものです:
これは Init の呼び出しです。
上記のすべてのコードについて、c# アプリケーションを実行しているときに、x64 マシンで次の例外が発生することがあります。
コンパイルからセキュリティ フラグを削除せずにこのコードを修正するにはどうすればよいですか? 修正のためのコードサンプルは本当に歓迎です!
ありがとう!
vb.net - メモリ不足の例外-アンマネージメモリ
私はウェブスクレイパーに取り組んでいます、そしてそれは一般的に非常にうまく機能します。ほとんどのサイトで数千ページを通過し、問題なく正常に完了します。
いくつかのサイトで、同じ問題が繰り返し発生しています。
編集: perfmonを使用して、リークが管理されていないメモリで発生していることを確認しました。「プライベートバイト」はプログラムの実行中に増加し続けますが、すべてのヒープのバイトは安定しているため、私は知っています。
(実際には、上下しますが、徐々に上昇します。通常、上記のコードセクションのメモリが不足しますが、このセクションが原因ではなく、大量のメモリを使用するため、最初の犠牲者になる可能性があります。 ...後でリリースすると思いますが)
編集2:
私はこのサイトの指示に従いました:http: //www.codeproject.com/Articles/42721/Best-Practices-No-5-Detecting-NET-application-memo
そして私はdebugDiagを使ってプログラムを調べました。
データを分析した後、debugdiagはリークの原因を教えてくれました。
アプリケーションでjscript.dllを参照していません。使用しているWebブラウザコントロールで使用されている必要があります。
少なくとも、それは私の推測です。
また、「X行のメモリ不足」の影響を示す「Webページからのメッセージ」というタイトルのメッセージボックスが表示されます。
だから、私はウェブブラウザオブジェクトを破棄してメモリを取り戻すことができると考えました-それで私は次のコードでボタンを追加しました:
それで、しばらくそれを実行した後、私はこするのをやめて、私の新しいボタンをクリックしました...それはまったく違いがありませんでした。perfmonで「PrivateBytes」の合計を見ていましたが、動かなかったのです。
何かアイデアはありますか?
編集3:
私はたくさんの推奨される解決策を試しましたが、どれも機能していないようです。
誰かが画像がキャッシュからクリアされていないことが原因である可能性があると示唆しましたが、画像の読み込みを無効にしたので、それは問題ではないことを知っています。
また、IE7に問題があり、IE8にアップグレードすると問題が解決すると聞きました。私はIE8を持っていますが、それでもメモリリークが発生します。
誰かが、webbrowserコントロールでフォームを最小化するとメモリが解放されると提案しました。試してみましたが、違いはありません。
また、ガベージコレクターを待たなければならないので、メモリ使用量が減少することを期待すべきではないと言われました。マネージコードのリークではないため、GC.Collect()は何もしません。管理されていないメモリにあります。どうやらjavascript機能は異なるメモリを使用しており、コレクションを強制する手動の方法はありません。しかし、クラッシュするところまで来ているので、明らかに問題があります。
私はこの質問に50の賞金を追加しています、そして私がリークを解決するのを手伝ってくれる人にそれを授与します。このソリューションを試してみたかった:http: //www.codeproject.com/Questions/322884/WPF-WebBrowser-control-vs-Internet-Explorer-browse しかし、vb.netに相当するものが何であるかを理解できません。オンラインコンバーターを試しましたが、このコードを変換するとエラーが発生します(過去に変換した他のコードでは正常に機能しますが)
リークを解決できない場合は、上記のページをc#からvb.netに変換した人に賞を授与します。
私のフォールバックプランは、Webブラウザーのみを含む別のアプリケーションを作成し、メモリが不足するまでそのプロセスと通信し、その時点で再起動します(アプリケーションを完全に終了すると、メモリが解放されます)。Webブラウザーは私のプロジェクトにかなりしっかりと組み込まれているため、これは私のアプリケーションにとって理想的とはほど遠いものです。
編集4
提案されたjavascriptインジェクションを実装しようとしました-これが私のコードです:
(新しいページに移動する直前に起動します)
残念ながら、私はまだperfmonでプライベートバイトが増加しているのを見ています。
誰かが私の論理の欠陥を見ることができますか?私はこの修正を実装しようとしています:http: //www.codeproject.com/Questions/322884/WPF-WebBrowser-control-vs-Internet-Explorer-browse
ところで-私はこのような単純なコードを使用してそれをテストしました:
この:
両方のテストケースでメッセージが表示されました。
不思議なことに、これを実行してスクリプトインジェクションをテストしようとすると、次のようになります。
挿入されたコードがテキストボックスに反映されていませんでした。表示された唯一の変更は、「test」という単語が表示されたことです(documentCompletedイベントからのページの読み込みが終了したときにコードRTB_RawHTML.Text = wbMain.DocumentTextを実行します...)
c# - C++ から C# へのデータの受け渡し - マッピング ファイルと CLI+UnmanagedMemoryStream
C++ から C# に頻繁にデータを渡す必要があります。超低レイテンシの取引アプリケーションを書いているので、できるだけ速くする必要があります。
私は純粋な C++ プロジェクトを持っています (後で Linux に移植されます)。そこから C# プロジェクトにデータを渡す必要があります。私は常に同じ構造を渡す必要があります (これが重要な場合)。
構造は次のようになります: ティッカー = "MSFT" 価格 = "30" 出来高 = "10" サイド = "買い"
私は2つのオプションを想像します:
- UnmanagedMemoryStream を C++ から C# に渡す C++-CLI ラッパーを作成する
- メモリ マップト ファイルを使用する
次のようになります。
- もっと早く
- 実装が容易
- Linuxへの移植が容易ですか?