.NET / C#のコンパイルは、ごみ出しGCリサイクルされた文字列のスクラッチプール内の文字列を決定することができません

私たちは、もはやオブジェクトを使用すると、オブジェクトがGCオフゴミをリサイクルすることはできません。もちろん、前提はあなたがメモリリークにコードを記述する必要はありませんです。我々はまた、文字列が多数発生した場合、GCは多くの圧力を引き起こすことがわかっています。

文字列を決定するために、コンパイル時の場合は、それはGCガベージアウトを回復することはありません。

サンプルコード

次に、私は私の懸念があるいくつかの文字列、文字列の作成  "walterlv" 、  "lindexi" および現在の時刻を。

その後、確認するために、次のコードを使用します。

システムを使用しました。
System.Linqのを使用しました。
System.Runtime.CompilerServicesを使用しました。

名前空間Walterlv.Demo 
{ 
    クラスプログラム
    { 
        静的な無効メイン(文字列[] args)
        { 
            VARテーブル=新しいConditionalWeakTable <文字列、フー> 
            { 
                { "walterlv"、新しいフー( "吕毅")}、
                { "lindexi"、新FOO( "林德熙")} 
            }。
            VAR時間= DateTime.Now.ToString( "T")。
            table.Add(時間、新しいフー( "时间")); 
            時間= NULL; 

            Console.WriteLineを($ "开始个数:{table.Count()}"); 
            GC.Collect();
            Console.WriteLineを($ "剩余个数:{table.Count()}"); 
    } 

    publicクラスはFoo 
    { 
        パブリック文字列値{得ます。} 
        公共のFoo(string値)=>値=値。
    } 
}

"walterlv" そして、  "lindexi" それは完全にコンパイル時の文字列、文字列、我々はすべて知っているが、コンパイル時の文字列では決定できない現在の時点で決定されます。

コレクションの前と後のGC、  ConditionalWeakTable 2までの3からオブジェクトの数。

そしてそれは、文字列は依然として重要な引用されていることを示す、0にクリアされていません。

それはまだ参照する何ですか?文字列のスクラッチプール。文字列のスクラッチプールを理解するために、あなたは私の他のブログの記事を読むことができます:

さらに、提供される場合であっても  CompilationRelaxations.NoStringInterning 、上記符号列にコンパイル時に決定することができるごみを収集することはありません。

参考資料

589348389、:あなたは、C ++プログラマを学びたいと思っている場合は、私たちのC / C ++学習バックルqunに来ることができる
無料配達C ++ビデオチュートリアルああ!
各Iは、C / C ++の知識を説明するためにグループに住んでます20:00、ああを学ぶために皆を歓迎します。

 

おすすめ

転載: blog.csdn.net/XZQ121963/article/details/90742560