2017-03-11 10 views
0

私はこれを勉強しました.GCはMark and Sweepアルゴリズムを使用して未使用のメモリ参照を収集します。すべてのオブジェクトが使用されている場合のガベージコレクタの処理方法

あなたは多数のオブジェクトを作成し、変数に割り当てられている、のようなケースを想定してみましょう、あなたは
ケース1.頻繁間隔
ケース2まれ間隔でこれらの変数を使用している

これらのオブジェクトのタイプは次のとおりです。

ケース1:すべての管理対象リソースのみ。
ケース2:すべて管理されていないリソースのみ。
ケース3:管理リソースと非管理リソースの両方を混在させます。

また、デストラクタとDisposeでアンマネージリソースをクリアするのに十分なロジックがプログラムにあるとします。

しきい値に達し、それ以上の物理メモリがありません。

どのように.Net GCがこれらの2つのケース(間隔とオブジェクトの種類の両方)を処理するのですか?

言語(例:.Net、Java)に関係なく、私はこのケースを処理する方法があると信じています。

誰かが私にこのことを理解させてくれますか?

ありがとうございました。

+0

「マネージド・リソース」、「アンマネージド・リソース」、「デストラクタ」、「廃棄」などの用語は、Javaでは意味を持ちませんので、これは「言語に関係なく」ではありません。 – Holger

答えて

1

ガベージコレクタは、使用中のオブジェクトを解放できません。メモリが足りなくなった場合、メモリが不足します。無限のメモリが可能だった場合は、OutOfMemoryError(JavaではSystem.OutOfMemoryException)は存在せず、memory leaksはプログラムをクラッシュさせませんでした。

1

私は、GCがMark and Sweepアルゴリズムを使用して未使用のメモリ参照を収集することを検討しました。

は(他のアルゴリズムがある...とJavaは、通常、世代アルゴリズムではなく、マーク・スイープのいくつかの種類を使用しています。)

しきい値の制限に達していると、それはこれ以上の物理メモリを搭載しています。

オブジェクトはすべて、まだ(強く)到達可能である場合、.NET GCは、Javaの場合はこれらの2例

を扱いますどのように、そして最終的にオブジェクトを作成するための要求はOutOfMemoryError例外がスローされます。これは、通常、アプリケーションをクラッシュさせます。

合併症:

  • アプリケーションがソフト参照を使用する場合、GCは、いくつかのヒープ領域を解放しようとする破られるために、これらの参考文献の一部またはすべてが発生します。

  • アプリケーションはスタック上の上位のOOMEを検出する可能性があります。そのため、一部の変数が範囲外になる可能性があります。または、OOMEハンドラが変数などにステップを踏む可能性があります。十分なオブジェクトが到達不能になると、アプリケーションを続行できます。


注:純粋なJavaは、マネージリソースとアンマネージリソースの間の区別をしていません。 .NETの意味では、すべてのJavaオブジェクトが管理されます。

Javaアプリケーションは、ネイティブ・ヒープ内のものを割り当てたネイティブ・コード・ライブラリーを呼び出すことができます。その場合、GCは割り当てに関与せず、クリーンアップできません。クリーンアップは図書館の責任です。

関連する問題