タグ付けされた質問 「garbage-collection」

7
メモリ管理に関するエントリーレベルのエンジニアの質問
入門レベルのソフトウェア開発者としてのポジションを始めてから数ヶ月になります。いくつかの学習曲線(言語、専門用語、VBやC#の構文など)を過ぎた今、より優れたソフトウェアを書くために、より難解なトピックに焦点を合わせ始めています。 同僚に簡単な質問をしたところ、「間違ったことに集中している」と答えました。私はこの同僚を尊重していますが、これが「間違ったこと」に焦点を当てていることには同意しません。 ここにコード(VB)があり、その後に質問が続きました。 注:関数GenerateAlert()は整数を返します。 Dim alertID as Integer = GenerateAlert() _errorDictionary.Add(argErrorID, NewErrorInfo(Now(), alertID)) 対... _errorDictionary.Add(argErrorID, New ErrorInfo(Now(), GenerateAlert())) 私は後者を最初に作成し、「Dim alertID」を使用して書き直したので、他の誰かが読みやすくなっています。しかし、ここに私の懸念と質問がありました: Dim AlertIDでこれを書き込むと、実際にはより多くのメモリを消費します。有限ではありますが、このメソッドを何度も呼び出す必要がありますか?.NETはこのオブジェクトAlertIDをどのように処理しますか。.NETの外では、使用後にオブジェクトを手動で破棄する必要があります(サブの末尾近く)。 ガベージコレクションだけに頼らない知識豊富なプログラマーになりたいです。私はこれを考えすぎていますか?私は間違ったことに集中していますか?

8
C ++削除とJava GC
Javaガベージコレクションは、ヒープ上のデッドオブジェクトを処理しますが、時々世界を凍結します。C ++ではdelete、作成したオブジェクトをそのライフサイクルの最後に破棄するために呼び出す必要があります。 これdeleteは、非凍結環境に支払うには非常に低価格のようです。関連deleteするすべてのキーワードを配置することは、機械的な作業です。新しいブランチが特定のオブジェクトを使用しなくなったら、コードを移動して削除を実行するスクリプトを作成できます。 では、ガベージコレクションのJavaビルドインとC ++ diyモデルの賛否両論は何ですか。 C ++対Javaスレッドを開始したくありません。私の質問は違います。 この全体的なGCのことは、「単純に、作成したオブジェクトを削除することを忘れないでください。専用のGCは必要ありません。それとも、「C ++でオブジェクトを破棄するのは本当にトリッキーです。私の時間の20%をそれに費やしますが、それでもメモリリークは一般的な場所です」

4
C#のソフトリアルタイムコードに対してどのような最適化を行うことができますか?
C#でソフトリアルタイムアプリケーションを作成しています。ネットワークからのハードウェア要求への応答などの特定のタスクは、特定のミリ秒以内に完了する必要があります。ただし、そうすることは100%ミッションクリティカルではありません(つまり、ほとんどの時間に時間どおりにあることを許容でき、1%は望ましくありませんが失敗ではありません)。したがって、「ソフト」な部分です。 C#はマネージ言語であり、マネージ言語はリアルタイムアプリケーションには特に適していません。ただし、C#で物事を成し遂げることができる速度、およびリフレクションやメモリ管理などの言語機能により、このアプリケーションを構築するタスクがはるかに簡単になります。 オーバーヘッドの量を減らして確定性を高めるために実行できる最適化または設計戦略はありますか?理想的には私は次の目標を持っているでしょう 「安全」になるまでガベージコレクションを遅らせる ガベージコレクターがリアルタイムプロセスに干渉することなく動作できるようにする さまざまなタスクのスレッド/プロセスの優先順位 C#でこれらを行う方法はありますか、C#を使用するときにリアルタイムに関して他に注意する点はありますか? アプリケーションのプラットフォームターゲットは、Windows 7 64ビットの.NET 4.0クライアントプロファイルです。現在はクライアントプロファイルに設定していますが、これはデフォルトのオプションであり、特別な理由で選択されませんでした。

2
コンカレントガベージコレクターは変数をどのように処理しますか?
それが並行マークアンドスイープガベージコレクタであるとしましょう。 そのようなGCが定数ポインターを処理するとき、それはそれらを(ルートから開始して)ウォークスルーし、遭遇したすべてのデータブロックにマークを付けます。次に、マークされていないものをすべてスイープします。クライアントコードは、使用するデータブロックをルートとしてマークする必要があります。 しかし、変数をどうすればよいでしょうか。ここに状況があります: Vオブジェクトへのポインタを格納する変数ですA。 Thread 1読み取りVと中断。 Thread 2変更しV、オブジェクトを指すようにしますB。 ガベージコレクターは、「マーク」フェーズを実行し、A参照されなくなった遭遇した後、「スイープ」フェーズ中に割り当てを解除します。 Thread 1目覚めさせ、ルートとしてマークすることにより(ステップ2でA既に読み取った)使用を試みVます。そして、Aもう存在しないので失敗します。 それで、これをどのように処理するのですか? Thread 2置換オブジェクトをマークすることができるA(同様のフラグが新たに割り当てられたオブジェクトのために使用される)特殊なDO-未削除フラグで。しかし、このフラグを削除する必要があるのはいつですか?もちろんそれThread 1は可能です。しかし、Thread 2についてThread 1は何も知らないため、これが行われるかどうかはわかりません。これはA解放されないことにつながる可能性があります。そして、GCがそのフラグを削除する場合、GCがA2回目に実行されたときに何も削除されることを妨げるものはありません... 私が読んだオンザフライのマークアンドスイープガベージコレクターの説明では、置き換えられたオブジェクトは「グレー表示」である必要があると述べています。しかし、詳細はありません。ソリューションのより詳細な説明へのリンクをいただければ幸いです。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.