6

RemotingCallsが共有オブジェクトの作成の原因であるAppDomainでの共有/静的オブジェクトの有効期間について知りたいです。

サーバーにアクセスするための関数のみを使用する、クライアントによってアクティブ化されたオブジェクトを使用するRemotingセットアップを使用しています。リモーティングオブジェクトはシングルトンとして設定されます。

サーバーはチャネルをセットアップし、RemotingConfiguration.Configureを使用して構成ファイルをロードします。

これらのサーバー機能の一部は、サーバー上の静的(vb.netで共有)変数にアクセスして使用します。これらの静的変数の有効期間がわからないので、初めて触れたときに作成されます(静的コンストラクターが実行されます)。ロギングを使用すると、オブジェクトの破棄/ファイナライズが発生するのを確認できません。

リモーティングサーバーに接続してから数分待つと、共有オブジェクトが正常に動作していることがわかります。

質問:

したがって、このリモート設定での静的オブジェクトの予想ライブ時間はどれくらいですか。それらはAppDomainと同じくらい存続しますか、それともRemotingオブジェクトが交換されたときに循環しますか。そして、必要に応じて彼らの寿命を延ばす正しい方法は何ですか?

答え:

静的タイプは、AppDomainがアンロードされるまで最初にアクセスしてから、AppDomainに存在します。したがって、AppDomainが実行されている限り、存続期間を延長する必要はありません。

4

2 に答える 2

5

リモーティングオブジェクトは、リースの有効期限が切れるまでガベージコレクションされません。オブジェクトへの明確な参照がないため、リースはオブジェクトをGCから保護します。デフォルトのリース期間は5分で、ガベージコレクターはさらに数分で実行される可能性があり(負荷、メモリ使用量などによって異なります)、オブジェクトへの最後の参照がなくなるはずです。これがすべて行われた後でのみ、次のGC実行時にインスタンスオブジェクトを収集する必要があります。ただし、静的オブジェクトはガベージコレクションされません。

質問の2番目の部分については、有効期間を延長する正しい方法は「スポンサーシップ」と呼ばれます。基本的に、リースの期限が切れると、サーバーはクライアントにこのオブジェクトの使用を継続するかどうかを尋ねます。ここに主題に関するかなり詳細な記事があります。寿命を無限大に設定するだけではいけません。

于 2011-05-30T12:02:15.003 に答える
3

静的フィールドがガベージコレクションされることはありません。ジェフリー・リッチターの記事を見てください。
静的フィールドはガベージコレクターによってルートと見なされるため、ガベージコレクターは常に静的フィールドが使用されていると想定します。

静的フィールドは、所有者タイプがロードされるときに初期化されます。JITコンパイラは、メソッドを構築する必要があるときに型をロードし、この型への参照を確認します。ロードされると、タイプはすべてのAppDomainの存続期間中そこにとどまるため、タイプに属するフィールド(静的フィールド)によって参照されるものはすべて、使用済み参照と見なされ、ガベージコレクションされません。

また、この声明に関して:

これらの静的変数の存続期間が何であるかを知ることはできません。それらが初めて触れられたときに作成されます(静的コンストラクターが実行されます)。

技術的に静的変数は、静的コンストラクターで初めて「タッチ」されるとは限りません。次のようなクラスを検討してください。

public static class Test
{
    private static MyType myType;

    static Test()
    {
        myType = new MyType();
    }
}

静的コンストラクター(型コンストラクター)は、この型を実行および参照しているコードがない限り、呼び出されることはありませんvar x = Test.myType;。まあ、これはおそらく「触れられた」が正確に何を意味するかに依存します。

答え:

静的タイプは、AppDomainがアンロードされるまで最初にアクセスしてから、AppDomainに存在します。したがって、AppDomainが実行されている限り、存続期間を延長する必要はありません。

于 2011-05-30T18:27:22.343 に答える