(57)【要約】  コンピューティング環境内のオブジェクトは、多くの場合、オブジェクトライフサイクルを通してスレッドによって利用され、オブジェクトによって使用されるコンピューティングリソースを取り戻すためにオブジェクトライフサイクルの最後に破棄される。いくつかの場合において、オブジェクトのオブジェクト破棄を開始するスレッドは、破棄を完了することができない場合がある（例えば、第２のスレッドが、オブジェクトのオブジェクトリソースに対して同期ロックを保持する場合がある）。オブジェクト破棄ワークフローは、スレッドの代わりにオブジェクトの破棄を開始する。オブジェクト破棄ワークフローが、オブジェクト破棄を完了することの失敗に遭遇した場合、オブジェクトへの新規参照がオブジェクトへの最後の参照としてオブジェクト破棄リスト内へ挿入される。第２のスレッドは、オブジェクト破棄リスト内の最後の参照を発見して解放し、オブジェクト破棄ワークフローに第２のスレッドの代わりにオブジェクトを破棄しようとする試みを再開するように促す。
2019525321.tif 000002
【特許請求の範囲】
【請求項１】
デバイスの参照カウント環境内のオブジェクトを破棄するデバイスであって、
プロセッサと、
メモリと、を備え、前記メモリが、
破棄されるべきオブジェクトへの参照のオブジェクト破棄リストと、
第１のスレッドの代わりに前記プロセッサによって実行されるオブジェクト破棄ワークフローとを格納し、前記オブジェクト破棄ワークフローが、
前記第１のスレッドによってアクセスされるオブジェクトへの最後の参照を解放することに応答して、
前記オブジェクトを破棄することを試み、
前記オブジェクトの破棄を完了できないことに応答して、前記オブジェクトへの新規参照を、前記オブジェクトへの前記最後の参照として、前記オブジェクト破棄リストに追加し、
前記オブジェクトに関して、第２のスレッドによって前記オブジェクト破棄リストに追加された前記オブジェクトへの前記最後の参照を識別することに応答して、前記オブジェクトへの前記最後の参照を解放する、デバイス。
【請求項２】
前記オブジェクトの選択された部分が、前記第２のスレッドのオブジェクト破棄プロセスと関連付けられ、
前記オブジェクトの前記破棄を完了できないことが、前記選択された部分が、前記第２のスレッド内で呼び出されるべき前記オブジェクト破棄プロセスと関連付けられていることを決定することをさらに含む、請求項１に記載のデバイス。
【請求項３】
前記オブジェクトの選択された部分が、前記第１のスレッド以外のスレッドによって排他的に予約され、
前記オブジェクトの前記破棄を完了できないことが、前記オブジェクトの前記選択された部分が、前記第１のスレッド以外のスレッドによって排他的に予約されていることを決定することをさらに含む、請求項１に記載のデバイス。
【請求項４】
前記オブジェクト破棄ワークフローが、
前記オブジェクトを破棄するために実施されるべきタスクのセット、ならびに
それぞれのタスクに関して、
前記タスクのタスク基準、および
前記タスクのステータスをさらに含む、請求項１に記載のデバイス。
【請求項５】
前記オブジェクト破棄ワークフローが、オブジェクトのオブジェクト破棄を開始することに応答して、前記オブジェクトにゾンビ状態でマークし、
前記オブジェクトが、ゾンビ状態とマークされている間に前記オブジェクトにアクセスする第２のスレッドに応答して、前記第２のスレッドに前記オブジェクトのゾンビ状態を示す警告を返す、請求項１に記載のデバイス。
【請求項６】
前記デバイスが、サイクリックオブジェクトグラフを含むオブジェクトのオブジェクトセットをさらに格納し、
前記オブジェクト破棄ワークフローが、前記オブジェクトを破棄することを試みることに応答して、
前記オブジェクトを、前記サイクリックオブジェクトグラフを含む前記オブジェクトのオブジェクトセットのメンバとして識別し、
前記サイクリックオブジェクトグラフの前記オブジェクトセットへの排他的アクセスを獲得するために同期メカニズムを呼び出し、
前記同期メカニズムの前記排他的アクセスを保持しながら、破棄シーケンスに従って前記オブジェクトセットの前記オブジェクトを破棄し、
前記サイクリックオブジェクトグラフの前記オブジェクトのすべてを破棄することに応答して、前記同期メカニズムの前記排他的アクセスを解放する、請求項１に記載のデバイス。
【請求項７】
破棄動作を受信することが、前記オブジェクトが前記第１のスレッド以外の選択されたスレッドによってのみ破棄可能である保護オブジェクトとしてマークされていることを決定すること、および
前記決定に応答して、前記オブジェクトを破棄することを拒否することをさらに含む、請求項６に記載のデバイス。
【請求項８】
プロセッサを含むデバイスの参照カウント環境内のオブジェクトを破棄する方法であって、前記方法が、
前記プロセッサ上でオブジェクト破棄ワークフローを実行することを含み、前記オブジェクト破棄ワークフローが、
破棄されるべきオブジェクトへの参照のオブジェクト破棄リストを生成し、
第１のスレッドの代わりに、および前記第１のスレッドによってアクセスされるオブジェクトへの最後の参照を解放することに応答して、
前記オブジェクトを破棄することを試み、
前記オブジェクトの破棄を完了できないことに応答して、前記オブジェクトへの新規参照を、前記オブジェクトへの前記最後の参照として、前記オブジェクト破棄リストに追加し、前記オブジェクト破棄リスト内への前記オブジェクトへの前記最後の参照の包含が、前記オブジェクトにアクセスする他のスレッドに前記オブジェクトを破棄することを試みるように促す、方法。
【請求項９】
前記命令を実行することがさらに、前記オブジェクトへの前記新規参照を前記オブジェクト破棄リストに追加することに応答して、前記デバイスに、同様に前記オブジェクトにアクセスする第２のスレッドに、前記オブジェクトへの前記新規参照の前記オブジェクトへの前記最後の参照としての前記オブジェクト破棄リストへの追加を通知させる、請求項８に記載の方法。
【請求項１０】
解放可能なオブジェクトリストが、前記解放可能なオブジェクトリストに対する前記オブジェクトへの前記最後の参照を受信することに応答して、前記第２のスレッドに、前記オブジェクトへの前記新規参照の前記オブジェクトへの前記最後の参照としての前記解放可能なオブジェクトリストへの追加を通知する、請求項８に記載の方法。
【請求項１１】
前記第２のスレッドに通知することが、前記第２のスレッドの保留状態を識別することに応答して、前記解放可能なオブジェクトリスト内の前記オブジェクトへの前記最後の参照を処理するために前記第２のスレッドを有効にすることをさらに含む、請求項１０に記載の方法。
【請求項１２】
デバイスの参照カウント環境内のオブジェクトを破棄するためのシステムであって、
破棄されるべきオブジェクトへの参照のオブジェクト破棄リストと、
オブジェクト破棄ワークフローとを備え、前記オブジェクト破棄ワークフローが、第１のスレッドが前記スレッドによってアクセスされるオブジェクトへの最後の参照を解放することに応答して、
前記オブジェクトを破棄することを試み、
前記オブジェクトの破棄を完了できないことに応答して、前記オブジェクトへの新規参照を、前記オブジェクトへの前記最後の参照として、前記オブジェクト破棄リストに追加し、前記オブジェクト破棄リスト内への前記オブジェクトへの前記最後の参照の包含が、前記オブジェクトにアクセスする他のスレッドに前記オブジェクトを破棄することを試みるように促す、システム。
【請求項１３】
前記デバイスの前記参照カウント環境内の前記オブジェクトのうち、コンテキストセッション内で利用されるオブジェクトのコンテキストセッションオブジェクトセット、
前記解放可能な参照リストが、前記コンテキストセッションの前記コンテキストセッションオブジェクトセットの前記オブジェクトへの最後の参照を格納するために前記コンテキストセッションと関連付けられる、請求項１２に記載のシステム。
【請求項１４】
前記オブジェクトが、前記第１のスレッドが前記オブジェクトへの前記最後の参照を解放する際に保持されることになる保持オブジェクトであり、
前記システムが、前記第１のスレッドおよび第２のスレッドの外側の前記オブジェクトへのキャッシュされた参照を格納する保持オブジェクトキャッシュをさらに備える、請求項１２に記載のシステム。
【請求項１５】
前記保持オブジェクトキャッシュが前記保持オブジェクトへの前記キャッシュされた参照を格納する一方、それぞれのスレッド内の前記保持オブジェクトへの他の参照は、前記保持オブジェクトへの弱い参照としてマークされ、
前記オブジェクト破棄ワークフローが、前記保持オブジェクトへの前記キャッシュされた参照を削除することに応答して、前記それぞれのスレッド内の前記保持オブジェクトへの前記弱い参照を強い参照に変える、請求項１４に記載のシステム。
【発明の詳細な説明】
【背景技術】
【０００１】
[0001]  コンピューティングの分野では、多くのシナリオは、関数、基本データ型、他のオブジェクトへの参照、ならびにアレイ、ハッシュテーブル、およびツリーなどのデータコンテナなどの、典型的にはオブジェクトリソースのセットを含む、オブジェクトのセットを格納するデバイスに関与する。１つまたは複数の実行環境内で実行する様々なスレッド（例えば、異なるプログラミング言語、実行ドメイン、および／またはプラットフォームを利用すること）は、それぞれのスレッドによって現在使用中のオブジェクトへの参照（例えば、メモリアドレスまたはハンドル）を格納することなど、オブジェクトを作成して、それにアクセスすることができる。オブジェクトは、同時におよび／または連続的にいくつかのスレッドおよび／またはオブジェクトによってアクセスされ得、スレッドによって保持され他のオブジェクト内に格納される各オブジェクトへの参照の数を追跡するために参照カウンタが使用され得る。いくつかの場合において、ある特定の共有リソースへの同時アクセスは、一度に１つのスレッドによるオブジェクトリソースへの排他的アクセスを確実にする同期メカニズムによって達成され得る。ミューテックス、セマフォ、またはクリティカルセクションなどの同期メカニズムは、ペンディング要求をトリアージすることができ、選択されたスレッドにオブジェクトリソースへの排他的アクセスを付与すると同時にオブジェクトへのアクセスを要求する他のスレッドを拒否することができ、選択されたスレッドによるアクセスの完了を待ってから、ペンディングアクセス要求を有する第２のスレッドに排他的アクセスを転送することができる。
【０００２】
[0002]  あるスレッドがオブジェクトの使用を完了すると、それはその参照を解放し（暗黙的または明示的に）、参照カウントが１つ減らされる。あるオブジェクトの参照カウントがゼロまで減少すると、そのオブジェクトは、もはや使用中ではなく破棄の準備ができていると見なされる。デバイスは、オブジェクトのオブジェクトリソースを終了させることができ、そのオブジェクトによって予約および／または消費されたメモリおよびコンピューティングリソースを取り戻すことができる。代替的に、スレッドが、オブジェクトの破棄を明示的に要求することができ、デバイスは、終了プロセスを開始することができ、このプロセスは、他のスレッドおよび／または他のオブジェクトに保有される、オブジェクトへの任意の既存の参照を変更することを含み得る。
【発明の概要】
【０００３】
[0003]  この発明の概要は、発明を実施する形態において以下に詳細に説明される概念の選択を単純化した形態で紹介するために提供されるものである。この発明の概要は、特許請求される主題の主となる因子または本質的特徴を特定することを意図するものでも、特許請求される主題の範囲を制限するために使用することを意図するものでもない。
【０００４】
[0004]  あるスレッドがオブジェクトを破棄しようとするとき、そのスレッドがオブジェクト破棄プロセスを完了することを防ぐいくつかの状況が生じる場合がある。第１のそのような例として、オブジェクトは、異なる実行環境内で第２のスレッドによって作成されたオブジェクトリソースを含むことができ、この場合異なる実行環境の取り決めに従ってオブジェクトリソースを破棄するためのプロセスは、開始スレッドにとっては完全に利用可能ではない場合がある。第２のそのような例として、オブジェクトは、同期ロックなど、第２のスレッドによる使用のために排他的に予約されるオブジェクトリソースを含むことができ、第１のスレッドは、第２のスレッドを壊すことなく、またはデバイスの予期せぬ挙動を誘発することなく、第２のスレッドに提供される排他的アクセスに割り込むことはできない場合がある。第３のそのような例として、オブジェクトは、現在ビジーであるオブジェクトリソース（例えば、解放するのにしばらく時間がかかり得るリソースに対するリソースハンドル）を含み得、オブジェクトリソースが破棄のために利用可能になるまでスレッドをブロックすることは、スレッドに対して不確定の遅延を課す場合がある。
【０００５】
[0005]  そのような状況が生じるとき、スレッドは、オブジェクトの破棄を開始することはできるが、オブジェクト破棄プロセスを完了することができない場合がある。スレッドは、プロセスを単に中止することはできるが、これは、オブジェクトを矛盾した状態のままにする場合があり、および／または部分的に破棄されたオブジェクトが、リソースリークとして永久に存続する場合がある。スレッドは、その後オブジェクトを破棄しようとすることができるが、いくつかのタスクが、時期にかかわりなくスレッドによって実施されることが不可能な場合、スレッドの反復試行は、デバイスに対する恒常的かつ非生産的なリソースドレインを表し得る。さらには、いくつかの場合において、オブジェクトの破棄は、いくつかのスレッドの参加が必要になることがあり（例えば、異なるスレッドが、オブジェクトの異なる部分に対する排他的アクセスを保有することができる）、その結果、どのスレッドもオブジェクト破棄プロセスを開始し、さらにそれを完了することができない。これらの状況において、スレッドがオブジェクト破棄プロセスを完了する能力がないことは、様々なスレッドが参加することができるより協調したオブジェクト破棄プロセスに欠けた非協調的な試行錯誤様式では解決が難しい場合がある。
【０００６】
[0006]  これらの状況を考慮して、本開示は、特に（しかしながら排他的ではない）参照カウント環境における、スレッドによるオブジェクトのオブジェクト破棄を促進する技術を提供する。これらの技術に従って、オブジェクトを破棄するプロセスは、オブジェクト破棄ワークフローによって対処され得る。スレッドは、オブジェクトを破棄するための要求により（例えば、オブジェクトに対する参照カウントをゼロに減らすスレッドに応答して）オブジェクト破棄ワークフローを呼び出すことができ、またオブジェクト破棄を開始するためにオブジェクト破棄ワークフローを呼び出すことができる。オブジェクト破棄ワークフローは、この特定のオブジェクトのためのオブジェクト破棄プロセスのタスク（例えば、オブジェクト内に埋め込まれたオブジェクトリソースを破棄すること、メモリおよび他の計算リソースを取り戻すこと、ならびに他のスレッドおよびオブジェクトによって保有されるオブジェクトへのいかなる残りの参照も解放すること）を実施することができる。オブジェクト破棄ワークフローはまた、要求スレッドがオブジェクト破棄プロセスの各タスクを実施することを許可されていることを確かめることができる。オブジェクト破棄が完了した場合、オブジェクト破棄ワークフローは、開始スレッドに、要求が完全に満たされたことを通知することができる。しかしながら、オブジェクト破棄プロセスが失敗した場合（例えば、開始スレッドが、オブジェクト破棄プロセスの少なくとも１つのタスクを実施することを制限されるため）、オブジェクト破棄ワークフローは、オブジェクトへの新規参照を作成し、その新規参照をオブジェクト破棄リストに追加することができる。新規参照はオブジェクトへの最後の参照を表すため、オブジェクト破棄ワークフローは、オブジェクトの参照カウントをゼロから１に増やすことができ、オブジェクトが参照カウントセマンティクスに従って現在保持されていることを示す。オブジェクト破棄プロセスは、次いで、第１のスレッドに、オブジェクトのオブジェクト破棄の完了の失敗を通知することができる。
【０００７】
[0007]  その後、同じスレッド、またはオブジェクトを同様に利用した異なるスレッドが、オブジェクト破棄リスト内のオブジェクトへの最後の参照の存在を発見することができる。最後の参照は、オブジェクトに対する参照カウントを１からゼロに減らすために解放され得、オブジェクト破棄ワークフローに要求スレッドの代わりにオブジェクト破棄プロセスを再開するように促す。（その後のおよび／または異なるスレッドによる）第２の要求は、オブジェクト破棄ワークフローがオブジェクト破棄プロセスを完了することを可能にし、それによりオブジェクトのオブジェクトリソースを完全に解放し、オブジェクト破棄ワークフローに、要求スレッドにオブジェクト破棄の完了を通知するように促すことができる。この様式では、オブジェクト破棄ワークフローは、オブジェクト破棄プロセスの様々な複雑性に対処することができ、また、本明細書に提示される技術に従って、オブジェクトの完全な破棄を達成するためにスレッドが協調し互いに連携することを可能にするワークフローベースのオブジェクト破棄プロセスを包含することができる。
【０００８】
[0008]  前述のことおよび関連事項の達成のため、以下の説明および添付の図面は、特定の例証的な態様および実装形態を明記する。しかしながら、これらは１つまたは複数の態様が用いられ得る様々な方法のうちのいくつかを示す。本開示の他の態様、利点、および新たな特徴は、添付の図面と併せて検討されるときに以下の詳細な説明から明らかになるものとする。
【図面の簡単な説明】
【０００９】
【図１】[0009]オブジェクトのセットへのアクセスを共有し、それを破棄しようとする、スレッドのセットを特色とする例示的なシナリオを示す図である。
【図２】[0010]本明細書に提示される技術に従う、オブジェクト破棄ワークフローによりオブジェクトを破棄するスレッドのセットを特色とする例示的なシナリオを示す図である。
【図３】[0011]本明細書に提示される技術に従う、スレッドのセットの代わりにオブジェクトの破棄を促進する例示的なオブジェクト破棄ワークフローを示す図である。
【図４】[0012]本明細書に提示される技術に従う、オブジェクト破棄ワークフローを使用してオブジェクトを破棄する例示的なシステムを利用する例示的なデバイスを特色とする例示的なシナリオを示す図である。
【図５】[0013]本明細書に提示される技術に従う、オブジェクト破棄ワークフローを使用してスレッドの代わりにオブジェクトを破棄する例示的な方法を示す図である。
【図６】[0014]本明細書に提示される技術に従う、デバイスにさせる命令を格納する例示的なコンピュータ可読ストレージデバイスを示す図である。
【図７】[0015]本明細書に提示される技術に従う、様々なスレッドがオブジェクト破棄ワークフローを介して破棄しようとするオブジェクトの保護を特色とする例示的なシナリオを示す図である。
【図８】[0016]本明細書に提示される技術に従う、オブジェクト破棄ワークフローによるオブジェクトグラフの破棄メカニズムを特色とする例示的なシナリオを示す図である。
【図９】[0017]本明細書に提示される技術に従う、オブジェクト破棄ワークフローによるオブジェクトの破棄の最中にオブジェクトをゾンビ状態としてマークすることを特色とする例示的なシナリオを示す図である。
【図１０】[0018]本明細書に提示される技術に従う、オブジェクト破棄ワークフローによるオブジェクトの保持を特色とする例示的なシナリオを示す図である。
【図１１】[0019]本明細書に提示される技術に従う、様々なメカニズムであって、それによって第２のスレッドが第１のスレッドによって以前に開始されたオブジェクト破棄プロセスを再開する、様々なメカニズムを特色とする例示的なシナリオを示す図である。
【図１２】[0020]本明細書内に明記される提供物のうちの１つまたは複数が実装され得る例示的なコンピューティング環境を示す図である。
【発明を実施するための形態】
【００１０】
[0021]  これより特許請求される主題が図面を参照して説明され、同様の参照番号は、全体を通して同様の要素を指すために使用される。以下の説明において、説明の目的のため、多数の特定の詳細事項は、特許請求される主題の完全な理解を提供するために明記される。しかしながら、特許請求される主題がこれらの特定の詳細事項なしに実践され得ることは明白であり得る。他の例では、構造およびデバイスは、特許請求される主題の説明を促進するためにブロック図で示される。
【００１１】
[0022]  Ａ．導入
【００１２】
[0023]  図１は、オブジェクト１０２のセットがコンピューティング環境内のスレッド１０６のセットによってアクセスされる例示的なシナリオ１００の例証であり、スレッド１０６はオブジェクト１０２を使用後に破棄しようとする。
【００１３】
[0024]  この例示的なシナリオ１００では、第１のスレッド１０６は、第１の実行環境１０８（例えば、デバイスのためにコンパイルされ、デバイスによってネイティブに実行されるCアプリケーション）内で実行し、第２のスレッド１０６は、第２の異なる実行環境１０８（例えば、.NET実行エンジンによって実行される.NETアプリケーション）内で実行する。それぞれのスレッド１０６は、基本データ型、他のオブジェクト１０２への参照、ならびに／または、関数、リスト、ハッシュテーブル、およびツリーなど、他のデータおよび／または他のオブジェクト１０２への参照を含む、データ構造などの、オブジェクトリソース１０４のセットをそれぞれ格納する様々なオブジェクト１０２を作成し、それにアクセスすることができる。スレッド１０６は、オブジェクト１０２内にオブジェクトリソースを作成するためのリソース作成要求１１０など、オブジェクト１０２の作成および更新に参加することができる。
【００１４】
[0025]  図１の例示的なシナリオ１００にさらに示されるように、スレッド１０６はまた、それぞれのオブジェクト１０２へのアクセスを共有することができる。例えば、第１のオブジェクト１０２内では、第１のオブジェクトリソース１０４は、第１のスレッド１０６によって作成され得、第２のスレッド１０６によってアクセスおよび／または更新され得る。いくつかの場合において、共有は、任意の数のスレッド１０６へ自由にかつ同時にアクセス可能であるオブジェクトリソース１０４など、制限なしに発生し得る。しかしながら、他の状況において、共有は、オブジェクトリソース１０４に対する排他的アクセスを特定のスレッド１０６に付与するオブジェクトリソースロック１１２など、同期メカニズムを伴い得る。オブジェクトリソースロック１１２は、排他的に承認されたスレッド１０６がオブジェクトリソースロック１１２を保持する期間にわたって、いかなる他のスレッド１０６によるオブジェクトリソース１０４へのアクセスも拒否することができ、他のスレッド１０６によるそのような実現されないアクセス要求を記録して、そのようなアクセスが付与され得るまで任意選択的にそのような他のスレッド１０６の実行をブロックすることができる。そのようなスレッド１０６が排他的アクセスを完了し、オブジェクトリソースロック１１２を解放すると、コンピューティング環境の構成要素（例えば、同期ロックマネージャ）は、オブジェクトリソース１０４へアクセスするためのペンディング要求のリストをレビューすることができ、ペンディング要求のうちの１つを選択することができ（例えば、優先順位に従って）、選択された要求を開始したスレッドにオブジェクトリソースロック１１２の付与を通知することができる（任意選択的に、要求のペンディング中にスレッド１０６をブロック解除する）。
【００１５】
[0026]  そのようなシナリオにおいて、スレッド１０６は、オブジェクトの有用なライフサイクル中にそれぞれのオブジェクト１０２を保持することができる。特定のオブジェクト１０２のライフサイクルの完了時に、スレッド１０６は、システムメモリ、キャッシュまたは二次メモリ内のストレージスペース、プロセッサ使用など、特定のオブジェクト１０２により利用される計算リソースを取り戻すためにオブジェクト１０２を破棄することを求めることができる。オブジェクト破棄プロセスは、明示的に（例えば、スレッド１０６が、オブジェクト１０２に対する破棄動作を呼び出すことができる）、または暗黙的に（例えば、スレッド１０６は、オブジェクト１０２への参照のみを格納することができ、参照を利用するコードの部分は、スコープを外れ、残っている参照のないオブジェクト１０２を結果としてもたらすことができる）、トリガされ得る。スレッド１０６によって呼び出されるオブジェクト破棄プロセスは、オブジェクト１０２を含むオブジェクトリソース１０４の各々を破棄し、次いでオブジェクト１０２のオブジェクトコンテナを破棄することを伴い得る。
【００１６】
[0027]  加えて、いくつかの状況は、第１のスレッド１０６によって作成されたものであり、かつ第１のスレッド１０６と第２のスレッド１０６との間で共有されるオブジェクト１０２が、第１のスレッド１０６または第２のスレッド１０６のいずれかによって破棄されることを許可し得る。例えば、図１の例示的なシナリオ１００において、第１のスレッド１０６は、第１のオブジェクト１０２およびそこに含まれる第１のオブジェクトリソース１０４を作成することができ、第２のスレッド１０６は、オブジェクト１０２を破棄するためのオブジェクト破棄要求１１４を開始することができる。この要求は、オブジェクトリソース１０４を破棄し、次いでオブジェクト１０２を破棄することによって実現され得、オブジェクト破棄の完了の成功は、成功２０６を示す戻り値により、オブジェクト破棄要求１１４を呼び出した第２のスレッド１０６に示され得る。したがって、いずれかのスレッド１０６によるオブジェクト１０２の破棄は、共有の様式で同様にオブジェクト１０２にアクセスしている他のスレッド１０６に影響を及ぼし得る。そのような状況において、コンピューティング環境は、オブジェクト１０２を破棄するための第１のスレッド１０６の要求を拒否し得るか、または第２のスレッド１０６によって保有されるオブジェクト１０２への参照をデフォルトもしくはｎｕｌｌ値に再設定して、それにより第２のスレッド１０６が無効のメモリ参照除外を回避することを可能にすることにより要求を実現し得るかのいずれかである。この様式では、スレッド１０６は、オブジェクト１０２およびそこに含まれるオブジェクトリソース１０４へのアクセスを共有するために互いに連携することができ、あるスレッド１０６が、オブジェクトライフサイクルの完了時にそれぞれのオブジェクト１０２に対してオブジェクト破棄プロセスを開始および完了することができる。
【００１７】
[0028]  しかしながら、そのような状況において、オブジェクト破棄要求１４を開始する特定のスレッド１０６は、様々な理由から、オブジェクト破棄プロセスを完了することができない場合がある。
【００１８】
[0029]  第１のそのような例として、オブジェクト１０２は、異なる実行環境１０８内でそれぞれ作成されたオブジェクトリソース１０４を含むことができ、異なる実行環境１０８の各々は、それぞれのオブジェクトのオブジェクトリソース１０４を作成すること、ならびに破棄することについてある特定の取り決めを利用し得る。そのような状況において、ある特定の実行環境１０８内で実行するスレッド１０６は、オブジェクトリソース１０４を作成した異なる実行環境１０８によって利用されるオブジェクトリソース破棄プロセスを認識しないか、および／またはそれを呼び出すことができない場合がある。例えば、図１の例示的なシナリオ１００では、第２のオブジェクト１０２は、第１の実行環境１０８内で実行する第１のスレッド１０６のリソース作成要求１１０によって作成された第３のオブジェクトリソース１０４、および第２の実行環境１０８内で実行する第２のスレッド１０６のリソース作成要求１１０によって作成された第４のオブジェクトリソース１０４を含む。第１のスレッド１０６（例えば、Cネイティブプロセス）は、第４のオブジェクトリソース１０４（.NET実行エンジンによって作成された）の破棄を開始できない場合があり、同様に、第２のスレッド１０６（例えば、C#マネージドプロセス）は、第３のオブジェクトリソース１０４（Cネイティブプロセスによって作成された）の破棄を開始できない場合がある。したがって、いずれのスレッド１０６も、第２のオブジェクト１０２の破棄を開始することおよび完了することの両方ができない場合があり、いずれかのスレッド１０６によって開始されるいかなるオブジェクト破棄要求１１４も、結果として失敗１１８をもたらし得る。
【００１９】
[0030]  第２のそのような例として、オブジェクト１０２のオブジェクトリソース１０４は、オブジェクトリソースロック１１２を保有する第２のスレッド１０６によって排他的に利用され得、オブジェクト１０２を破棄するための要求を開始する第１のスレッド１０６は、第２のスレッド１０６がその排他的アクセスを完了し、オブジェクトリソースロック１１２を放棄するまでは、オブジェクトリソース１０４、およびひいてはオブジェクト１０２を破棄することを許可されない場合がある。さらには、図１の例示的なシナリオ１００に示されるように、第３のオブジェクト１０２は、第２のスレッド１０６が第１のオブジェクトリソースロック１１２を保有する第５のオブジェクトリソース１０４、さらには、第１のスレッド１０６が第２のオブジェクトリソースロック１１２を保有する第６のオブジェクトリソース１０４を含む。この場合、いずれのスレッド１０６も単独では、オブジェクト破棄要求１１４を開始することおよび完了することの両方ができず、いかなるそのような要求も、結果として失敗１１８をもたらし得る。
【００２０】
[0031]  特定のスレッド１０６によるオブジェクト１０２のオブジェクト破棄の完了を妨害する依然として他の状況が生じ得る。第３の例として、オブジェクトリソース１０４は、同じオブジェクト１０２もしくは異なるオブジェクト１０２の第２のオブジェクトリソース１０４をまず破棄すること、オブジェクト１０２の第２のオブジェクトリソース１０４を同時に破棄すること、および／または特定のスレッド１０６（例えば、オブジェクトリソース１０４のマネージャとしての役割を果たすスレッド１０６）のみにオブジェクトリソース１０４の破棄を呼び出すことを許可することなど、オブジェクトリソース１０４が破棄される前に満たされるべき特定の必要条件基準を有し得る。第４の例として、オブジェクト１０２および／またはオブジェクトリソース１０４は、サイクリック様式で互いに他を参照するオブジェクトのセット１０４を含むサイクリックオブジェクトグラフに関与し得、各オブジェクト１０２は、他のオブジェクト１０２が破棄された後にのみ破棄され得る。この状況の認識がないため、サイクリックオブジェクトグラフは、オブジェクト１０２のいずれかの破棄を不可能にする手詰まりを引き起こし得る。第５の例として、オブジェクトリソース１０４は、単にビジーである場合がある。例えば、オブジェクトリソース１０４は、割り込み不可能なプロセスを実施している外部デバイスに対するハンドルを含み得、割り込み不可能なプロセスの完了前にオブジェクトリソース１０４を破棄すると、その外部デバイスが破損する可能性がある。そのようなオブジェクト１０２に対するオブジェクト破棄要求１１４を開始するスレッド１０６について、オブジェクトリソース１０４が破棄のために利用可能になるまでブロックすることは実現可能である一方で、そのようなブロッキングは、スレッド１０６が、おそらくは、長期的にかつおそらく不確定の期間にわたって無反応になることを引き起こし得る。
【００２１】
[0032]  そのような状況において、スレッド１０６がオブジェクト１０２に対するオブジェクト破棄要求１１４を完了する能力がないことは、予期せぬことであり得、その結果、エラーまたはハンドルされない例外が、スレッド１０６が無反応になること、クラッシュすること、または予期せぬ挙動に従事することを引き起こし得る。いくつかの場合において、スレッド１０６がオブジェクト破棄要求１１４の処理中に妨害に遭遇すると、スレッド１０６は、破棄タスクを放棄し得る。しかしながら、コンピューティング環境が、オブジェクト１０２のオブジェクト破棄を再開し、潜在的には完了するためのいかなるメカニズムにも欠ける場合、オブジェクト１０２は、生産性効果なしにメモリおよびプロセッササイクルなどのコンピューティングリソースを消費するリソースリークとして永久に存続する場合がある。さらには、スレッド１０６がオブジェクト１０２を部分的に破棄し、次いで妨害に起因して破棄を中止すると、オブジェクト１０２は、矛盾しかつ不確定の状態のままにされ得、オブジェクト１０２によって消費される一部のリソースは、リソース使用のためなどの暗黙モデルを満たさない場合がある。例えば、コンピューティング環境は、ネットワークハンドルが格納され利用されるオブジェクト１０２を参照するスレッド１０６に従ってネットワーク使用を追跡することができる。しかしながら、コンピューティング環境は、ネットワークを利用するがいかなるスレッド１０６にも参照されないオブジェクト１０２の状況を予期することはできず、そのような予想外の結果は、ネットワーク容量の不明かつ潜在的に限りない消費など、コンピューティング環境の他のスレッド１０６における予期せぬ挙動を作り出し得る。さらに他の場合において、スレッド１０６は、オブジェクト１０２の破棄を完了する能力がないことに対処する準備が整っている場合があるが、オブジェクト１０２のオブジェクト破棄がなぜ失敗したか決定することができない場合があり、任意の適切なメカニズムがオブジェクト破棄プロセスを継続することもできない。例えば、スレッド１０６は、何らかの他のスレッド１０６がオブジェクト１０２の特定のオブジェクトリソース１０４を破棄することを担うことを認識し得るが、任意のそのような他のスレッド１０６を識別することおよび／または任意のそのような他のスレッド１０６にオブジェクト破棄要求１１４を通知することはできない場合がある。さらに別の潜在的な欠点として、いくつかの状況において、オブジェクト１０２のオブジェクトリソース１０４を破棄する必要条件基準は、複雑かつ微妙であり得、その結果、任意の特定のオブジェクト１０２のためのオブジェクト破棄プロセスの複雑性に対処するように任意の特定のスレッド１０６を構成することは、スレッド１０６の開発者に望ましくない量の複雑性を委譲し得る。さらには、オブジェクトリソース１０４の破棄に関連し得る基準は、徐々に発展し得（例えば、新しい基準がコンピューティング環境の新しく実装された環境メカニズムに従って規定され得る）、重要かつ潜在的には法外な開発負担を特定のスレッド１０６の開発者に課す。これらおよび他の複雑な事態が、オブジェクト１０２のオブジェクトリ���ース１０４に対するスレッド１０６のオブジェクト破棄要求１１４のコンテキストにおいて生じ得る。
【００２２】
[0033]  Ｂ．提示される技術
【００２３】
[0034]  図１の例示的なシナリオ１００に例証されるものなど、オブジェクト１０２のオブジェクト破棄の複雑性を考慮して、本開示は、オブジェクト１０２の破棄においてスレッド１０６を促進するための技術を提供し、および具体的には、第１のスレッド１０６がオブジェクト破棄要求１１４を開始するが、オブジェクト１０２のオブジェクト破棄を完了することができないというシナリオに対処する。これらの技術は、様々なスレッド１０２の代わりに特定のオブジェクト１０２のオブジェクト破棄のタスクを包含しかつ実施する、オブジェクト破棄ワークフローとしてのオブジェクト破棄プロセスの表現に関与する。
【００２４】
[0035]  図２は、本明細書に提示される技術に従う、オブジェクト１０２を破棄するオブジェクト破棄ワークフロー２０２を表す例示的なシナリオ２００の例証である。この例示的なシナリオ２００では、第１の時間２１６において、第１のスレッド１０６は、２つのオブジェクトリソース１０４を含むオブジェクト１０２を破棄するためのオブジェクト破棄要求１１４を開始する。この特定の例において、オブジェクト破棄は、第１のスレッド１０６が、たまたまオブジェクト１０２への最後の参照２０６であるオブジェクト１０２への参照を解放するときに開始される。参照２０６を解放することにより、オブジェクト１０２への参照２０６の参照カウント２０４が１からゼロに減り、コンピューティング環境内のスレッド１０６が参照２０６を保持していないことから、オブジェクト１０２がオブジェクトライフサイクルの最後に達し、破棄される準備ができていることを示す。したがって、第１のスレッド１０６は、参照カウント２０４がゼロに減ったことに応答して、オブジェクト１０２の破棄を開始する。しかしながら、オブジェクト破棄を自ら実施しようとするのではなく、スレッド１０６は、オブジェクト破棄要求１１４をオブジェクト破棄ワークフロー２０２に送信し、オブジェクト破棄ワークフロー２０２がスレッド１０６の代わりにオブジェクト１０２の破棄を開始する。オブジェクト破棄ワークフロー２０２は、第１のオブジェクトリソース１０４のためのオブジェクトリソース破棄２０８を開始することから始め、それが成功１１６をもたらす。
【００２５】
[0036]  図２の例示的なシナリオ２００にさらに例証されるように、第２の時間２１８において、オブジェクト破棄ワークフロー２０２は、第２のオブジェクトリソース１０４のオブジェクトリソース破棄２０８を開始することによって、第１のスレッド１０６の代わりにオブジェクト１０２の破棄を継続することができるが、失敗１１８に遭遇する場合がある。例えば、第２のオブジェクトリソース１０４は、オブジェクトリソースロック１１２を保有する異なるスレッド１０６によって排他的にアクセスされ得る、異なるおよび潜在的には未知のオブジェクトリソース破棄プロセスを使用する異なる実行環境１０８内で異なるスレッド１０６によって作成されたものであり得る、ならびに／または、他のリソースもしくはデバイスによる割り込み不可能なプロセスを待っているなど、単純にビジーである場合がある。失敗１１８に遭遇することに応答して、オブジェクト破棄ワークフロー２０２は、オブジェクト１０２への新規参照２０６の参照作成２１０を開始し、新規参照２０６をオブジェクト破棄リスト２１２に追加することができる。オブジェクト破棄リスト２１２は、破棄されるプロセスにあるオブジェクト１０２（およびより具体的には、オブジェクト破棄プロセスが少なくとも１つのスレッド１０６の代わりにオブジェクト破棄ワークフロー２０２によって以前に開始されたが、妨害によりオブジェクト破棄ワークフロー２０２がオブジェクト破棄要求１１４を完了することを防いだオブジェクト１０２）への最後の参照２０６の格納場所を含む。この時オブジェクト１０２への最後の参照２０６を含む新規参照２０４が、オブジェクト破棄ワークフロー２０２によってオブジェクト破棄リスト２１２内へ挿入され、オブジェクト破棄ワークフローが、オブジェクト１０２の参照カウント２０４をゼロから１に増やす。オブジェクト破棄ワークフロー２０２はまた、失敗１１８を第１のスレッド１０６に報告することができ、スレッド１０６は、オブジェクト１０２が完全に破棄されたかのように実行を再開し得る。
【００２６】
[0037]  図２の例示的なシナリオ２００にさらに例証されるように、第３の時間２２０において、第２のスレッド１０６は、オブジェクト破棄リスト２１２内のオブジェクト１０２への最後の参照２０６を発見し得るか、および／またはそれを通知され得る。第２のスレッド１０６は、以前にオブジェクト１０２にアクセスしていた可能性があり（またはオブジェクト１０２を作成していた可能性さえあり）、したがって参照２０６の参照解放２１４を開始し得る。参照解放２１４は、参照カウント２０２を１からゼロに減らし、それにより、この第３の時間２２０において、第１のスレッド１０６ではなく第２のスレッド１０６の代わりに、オブジェクト破棄ワークフロー２０２によるオブジェクト破棄要求１１４を再度開始する。オブジェクト破棄ワークフロー２０２は、オブジェクト１０２の第２のオブジェクトリソース１０４のオブジェクトリソース破棄２０８を再び開始することができ、この試みは、成功１１６をもたらし得る（例えば、オブジェクト破棄ワークフロー２０２は、第１のスレッド１０６ではなく第２のスレッド１０６の代わりにオブジェクトリソース１０４を破棄することを許可されるため）。オブジェクト１０２のオブジェクト破棄が完了すると、オブジェクト破棄ワークフロー２０２は、成功１０６を第２のスレッド１０６に報告することができる。この様式では、オブジェクト破棄ワークフロー２０２は、本明細書に提示される技術に従って両方のスレッド１０６の連携を伴う反復プロセスを介してオブジェクト１０２のオブジェクト破棄を達成する。
【００２７】
[0038]  Ｃ．技術的効果
【００２８】
[0039]  本明細書に提示される技術の様々な用途は、結果として様々な技術的効果をもたらし得る。
【００２９】
[0040]  本明細書に提示される技術に従って達成可能である第１の技術的効果は、オブジェクト破棄ワークフロー２０２に従うオブジェクト１０２の破棄の成功に関与する。オブジェクト破棄ワークフロー２０２は、複数のスレッド１０６、および／または２つ以上の連続的な時間における１つのスレッド１０６の連携を伴い得る反復的なオブジェクト破棄プロセスを、オブジェクト１０２のオブジェクトリソース１０４を破棄する増分プロセスとして提供する。そのような反復プロセスは、シングルパス内のシングルスレッド１０６によるオブジェクト破棄の開始および完了に対する幅広い範囲の潜在的な妨害の横断を可能にし得、例外、スレッド阻害、矛盾した状態にある部分的に削除されたオブジェクト１０２を結果としてもたらす中止されたオブジェクト削除、不完全に削除されたオブジェクト１０２によって引き起こされるリソースリーク、矛盾したおよびおそらくはリークしたオブジェクト１０２に起因するスレッド１０６および／またはコンピューティング環境の予想外の挙動、割り込み不可能なプロセスの割り込み、ならびにシングルスレッド１０６が他のスレッド１０６の連携なしにはオブジェクト１０２を破棄することができない停滞シナリオの発生を減少させ得る。
【００３０】
[0041]  本明細書に提示される技術に従って達成可能である第２の技術的効果は、コンピューティング環境内ですでに利用可能であり得る参照カウント技術、およびオブジェクト１０２の参照カウント２０４がゼロに減らされる際にオブジェクト破棄を開始するという自動化セマンティクスなど、オブジェクト破棄ワークフロー２０２による、オブジェクト破棄プロセス内でのコンピューティング環境の以前から存在するリソースの利用に関与する。加えて、破棄される準備ができている（および１つまたは複数のスレッド１０６の代わりにオブジェクト１０２を破棄するためにオブジェクト破棄ワークフロー２０２による以前の試みが失敗１１８に終わった）オブジェクト１０２への参照２０６の格納場所としてのオブジェクト破棄リスト２１２の使用は、スレッド１０６間の連携メカニズムとしての役割を果たす。例えば、オブジェクト破棄リスト２１２内の参照２０６の存在は、オブジェクト１０２を破棄することを試みるためのコンピューティング環境のスレッド１０６に対する暗黙の要求としての役割を果たし、そのようなスレッド１０６各々による試みは、オブジェクト１０２の破棄を完了するか、または少なくとも進展させる成功１１６を最終的にもたらし得る。したがって、参照２０６を利用するようにすでに構成されているスレッドは、再構成なしにまたはそのような技術のセマンティクスおよび技巧を開発者が全く認識することなしに、オブジェクト破棄ワークフロー２０２によって媒介される増分オブジェクト破棄プロセスに参加することができる場合がある。
【００３１】
[0042]  本明細書に提示される技術に従って達成可能である第３の技術的効果は、オブジェクト破棄に対処することにおいてスレッド１０６の代わりに開発複雑性を低減すること関与する。スレッド１０６からオブジェクト破棄ワークフロー２０２へのオブジェクト破棄の詳細事項および技巧の委任は、スレッド１０６がオブジェクト破棄プロセスの経過および複雑性を無視することを可能にする。例えば、スレッド１０６は、失敗１１８、その様々な理由、および／またはオブジェクト１０２を破棄することをさらに試みるための他のスレッド１０６への要求の通信に対処するように構成される必要がない。オブジェクト破棄ワークフロー２０２は、スレッド１０６が後で試行を再度開始する責任を負うのではなく、その後同じスレッド１０６によってオブジェクト１０２の破棄を再度開始するプロセスを自動化することさえもできる。各スレッド１０６は、単にオブジェクト破棄要求１１４を開始し、次いでオブジェクト破棄が完了する前に、およびさらには初期のオブジェクト破棄要求１１４の結果とは無関係に、処理し続けるように構成され得る。したがって、オブジェクト破棄ワークフロー２０２は、スレッド阻害および／またはオブジェクト破棄プロセスに参加することにおける複雑性を低減すること、ならびにスレッド１０６が、オブジェクト破棄が別の場所で対処されている間に生産的な処理を再開することを可能にすることによって、スレッド１０６の効率性を促進する。
【００３２】
[0043]  本明細書に提示される技術に従って達成可能である第４の技術的効果は、オブジェクト破棄プロセスの精巧化に関与する。オブジェクト破棄の詳細事項を包含することによって、オブジェクト破棄ワークフロー２０２は、破棄されるべき幅広い種類のオブジェクト１０２およびオブジェクトリソース１０４、それらの破棄を複雑にし得る幅広い種類の状況、ならびにオブジェクト１０２およびオブジェクトリソース１０４の特定のタイプおよび状況の対処を促進するための幅広い種類の技術に対処するように構成され得る。
【００３３】
[0044]  図３は、例示的なオブジェクト破棄ワークフロー２０２を特色とする例示的なシナリオ３００の例証である。この例示的なシナリオ３００において、オブジェクト破棄ワークフロー２０２は、２つのスレッド１０６に代わって、オブジェクトリソース１０４のロバストなセットを特色とする特定のオブジェクト１０２のオブジェクト破棄のために策定される。例示的なオブジェクト破棄ワークフロー２０２は、オブジェクト１０２をペンディング破棄としてマークすることなどオブジェクト１０２に対して実施されるべき、および特定のリソース１０２を破棄するという、タスク３０２のセットとして表される。さらには、それぞれのタスク３０２は、タスク３０２を開始する前に満たされるべき１つまたは複数の必要条件（例えば、別のオブジェクトリソース１０４の破棄をまず完了したという必要条件）など、１つまたは複数のタスク基準３０４、および／またはタスク３０２が実施され得る状況（例えば、オブジェクト破棄ワークフロー２０２が代わりにタスク３０２を実施し得るスレッド１０６のタイプの識別、および／または第１のオブジェクトリソース１０４と同時に破棄されることになる第２のオブジェクトリソース１０４の識別）と関連付けられる。オブジェクト破棄ワークフロー２０２はまた、タスク３０２が完了されたかどうかを示すそれぞれのタスク３０２のステータス標識３０６のセットを含み得る。オブジェクト破棄ワークフロー２０２の一部のタスク３０２は、他のタスク３０２と同時におよび／または任意の順序で実施され得る（例えば、第１のオブジェクトリソース１０４および第２のオブジェクトリソース１０４の破棄は、同時におよび／またはいずれかの順序で実施され得る）一方、他のタスク３０２は、特定の順序および／または同時並行を強制する基準３０４を指定し得る。
【００３４】
[0045]  ある特定のスレッド１０６がオブジェクト１０２の参照カウント２０４を１からゼロに減らすと、そのスレッド１０６は、オブジェクト破棄要求１１４を開始することができる。オブジェクト破棄ワークフロー２０２は、スレッド１０６の代わりに実施される条件を満たしている１つまたは複数のタスク３０２を識別するために、タスク３０２のリスト、ならびにそれぞれのタスク基準３０４、およびステータス標識３０６を調査することによって反応することができる。次いで、オブジェクト破棄ワークフロー２０２は、識別されたタスク３０２を、タスク３０２が完了する（その結果、オブジェクト破棄は成功１１６である）まで、またはスレッド１０６の代わりに実施される条件を満たしているタスク３０２がそれ以上存在しなくなるまで、このスレッド１０６の代わりに実施することができ、その時点において、オブジェクト破棄ワークフロー２０２は、その後およびおそらくは異なるスレッド１０６の代わりにオブジェクト１０２のオブジェクト破棄を再開するためのメカニズムとして、オブジェクト１０２への新規参照２０６を（最後の参照２０６として）オブジェクト破棄リスト２１２内へ挿入する。この様式では、オブジェクト破棄ワークフロー２０２は、オブジェクトリソース１０４およびオブジェクト１０２の破棄において、タスク３０２のロバストなセットおよびタスク基準３０４を可能にし、それに準拠し得る。多くのそのような技術的効果は、本明細書に提示される技術に従うオブジェクト破棄ワークフロー２０２を使用したオブジェクト１０２の破棄によって達成可能であり得る。
【００３５】
[0046]  Ｄ．例示的な実施形態
【００３６】
[0047]  図４は、本明細書に提示される技術に従う、オブジェクト１０２を破棄する例示的なデバイス４０２として例証される、本発明に提示される技術の例示的な実施形態を特色とする例示的なシナリオ４００の例証を提示する。この例示的なシナリオ４００において、デバイス４０２は、例えばデバイス３０２の様々なアプリケーションおよび／またはコンピューティング環境の代わりに、スレッド１０６のセットを実行するプロセッサ４０４を備える。デバイス４０２は、プロセッサ４０４によって実行されるとき本明細書に提示される技術に従ってスレッド１０６の代わりにオブジェクト１０２を破棄する例示的なシステム４０８を実施する命令を格納するメモリ４０６をさらに備える。
【００３７】
[0048]  例示的なシステム４０８は、破棄されるべきオブジェクト１０２への（およびより具体的には、少なくとも１つのスレッド１０６の代わりにオブジェクト１０２を破棄しようとする、失敗１１８に終わった少なくとも１つの以前の試行の後、オブジェクト破棄がペンディングしているオブジェクト１０２への）参照２０６を格納するオブジェクト破棄リスト２１２を備える。例示的なシステム４０８は、第１のスレッド１０６の代わりにプロセッサ３０４によって実行されるオブジェクト破棄ワークフロー２０２をさらに備える。オブジェクト破棄ワークフロー２０２は、オブジェクト１０２を破棄しようと試みることによって（例えば、オブジェクト１０２の個々のオブジェクトリソース１０４を破棄することなどの様々なタスク３０２を実施することによって）オブジェクト１０２への最後の参照２０６を解放すること（例えば、参照カウント２０４を１からゼロに減らすこと）に応答する。オブジェクト１０２のオブジェクト破棄を完了することの失敗１１８に応答して、オブジェクト破棄ワークフロー２０２は、オブジェクト１０２への新規参照２０６をオブジェクト破棄リスト２１２に追加し、ここにおいて新規参照２０６は、オブジェクト１０２への最後の参照２０６を表す。新規参照２０６を作成することはまた、オブジェクト１０２への参照２０６の参照カウント２０４のゼロから１への増分を促し得る。さらには、オブジェクト破棄ワークフロー２０２は、オブジェクト１０２への最後の参照２０６を解放することによって、第１のスレッド１０６の代わりに、第２のスレッド１０６の代わりに追加されたオブジェクト１０２への最後の参照２０６のオブジェクト破棄リスト２１２内での識別に応答する。そのような解放が今度は、第１のスレッド１０６の代わりに、オブジェクト１０２のオブジェクト破棄要求１１４によってオブジェクト破棄ワークフロー２０２を呼び出し、それが、結果としてオブジェクト１０２のオブジェクト破棄の成功１１６（または少なくとも進展）をもたらし得る。この様式では、図４の例示的なデバイス４０２および例示的なシステム４０６は、本明細書に提示される技術に従うオブジェクト破棄ワークフロー２０２を使用したオブジェクト１０２の破棄においてスレッド１０６を促進する。
【００３８】
[0049]  図５は、本明細書に提示される技術に従う、オブジェクト破棄ワークフロー２０２の使用を介してスレッド１０６の代わりにオブジェクト１０２を破棄する例示的な方法５００の例証である。例示的な方法５００は、プロセッサ４０４を備えるデバイスに関与し、例えば、メモリ回路、ハードディスクドライブのプラッタ、ソリッドステートストレージデバイス、または磁気もしくは光学ディスクなど、デバイスのメモリ構成要素に格納されており、かつデバイスのプロセッサによって実行されると本明細書に提示される技術に従ってデバイスを動作させるように組織された、命令のセットとして実施され得る。
【００３９】
[0050]  例示的な方法５００は、５０２において開始し、デバイスのプロセッサ４０４上でオブジェクト破棄ワークフロー２０２を実行すること５０４に関与する。具体的には、オブジェクト破棄ワークフロー２０２の実行が、破棄されるべきオブジェクト１０２への参照２０６を格納するオブジェクト破棄リスト２１２を生成する５０６。オブジェクト破棄ワークフロー２０２の実行は、第１のスレッド１０６の代わりに５０８、および第１のスレッド１０６によってアクセスされるオブジェクト１０２への最後の参照２０６を開放することに応答して、オブジェクト１０２を破棄することをさらに試み５１０、オブジェクト１０２の破棄を完了することの失敗１１８に応答して、オブジェクト１０２への新規参照２０６をオブジェクト１０２への最後の参照２０６としてオブジェクト破棄リスト２１２にさらに追加し５１２、オブジェクト破棄リスト２１２内へのオブジェクト１０２への最後の参照２０６の包含は、他のスレッド１０６（任意選択的に第１のスレッド１０６を含む）にオブジェクト１０２を破棄することを試みるように促す。スレッド１０２の代わりにオブジェクト１０２のオブジェクト破棄を達成したことにより、例示的な方法５００は、本明細書に提示される技術に従うオブジェクト破棄ワークフロー２０２およびオブジェクト破棄リスト２１２を実施し、そして５１４において終了する。
【００４０】
[0051]  さらに別の実施形態は、本明細書に提示される技術を応用するように構成されたプロセッサ実行可能命令を含むコンピュータ可読媒体に関与する。そのようなコンピュータ可読媒体は、様々な物理的現象により伝搬され得る信号（例えば、電磁信号、音波信号、または光学信号）、ならびに様々な有線シナリオ（例えば、イーサネットまたは光ファイバーケーブルを介して）内のもの、および／またはワイヤレスシナリオ（例えば、WiFiなどのワイヤレスローカルエリアネットワーク（WLAN）、ブルートゥースなどのパーソナルエリアネットワーク（PAN）、またはセルラもしくは無線ネットワーク）内のものなど、デバイスのプロセッサによって実行されると、本明細書に提示される技術をデバイスに実施させるコンピュータ可読命令のセットをエンコードする様々なタイプの通信媒体を含み得る。そのようなコンピュータ可読媒体はまた（通信媒体を除外する技術の階層として）、メモリ半導体（例えば、スタティックランダムアクセスメモリ（SRAM）、ダイナミックランダムアクセスメモリ（DRAM）、および／または同期ダイナミックランダムアクセスメモリ（SDRAM）技術を利用する半導体）、ハードディスクドライブのプラッタ、フラッシュメモリデバイス、または磁気もしくは光学ディスク（CD-R、DVD-R、またはフロッピーディスクなど）などの、デバイスのプロセッサによって実行されると、本明細書に提示される技術をデバイスに実施させるコンピュータ可読命令のセットをエンコードするコンピュータ可読メモリデバイスを含み得る。
【００４１】
[0052]  これらのやり方で考案され得る例示的なコンピュータ可読媒体は図６に例証され、ここにおいて実装形態６００は、コンピュータ可読メモリデバイス６０２（例えば、CD-R、DVD-R、またはハードディスクドライブのプラッタ）を含み、そこにコンピュータ可読データ６０４がエンコードされる。さらにこのコンピュータ可読データ６０４が、デバイス６１０のプロセッサ４０４で実行されるとデバイス６１０を本明細書に明記される原則に従って動作させるコンピュータ命令６０６のセットを含む。第１のそのような実施形態において、プロセッサ実行可能命令６０６は、図４の例示的なシナリオ４００における例示的なデバイス４０２など、本明細書に提示される技術に従うオブジェクト破棄ワークフロー２０２を使用してオブジェクト１０２を破棄するためのデバイスの構成を可能にし得る。第１のそのような実施形態において、プロセッサ実行可能命令６０６は、図４の例示的なシナリオ４００における例示的なシステム４０８など、デバイスによって実行されると、本明細書に提示される技術に従うオブジェクト破棄ワークフロー２０２を使用してデバイスにオブジェクト１０２を破棄させるシステムを提供し得る。第３のそのような実施形態において、コンピュータ可読ストレージデバイス６０２のプロセッサ実行可能命令６０６は、図５の例示的な方法５００など、本明細書に提示される技術に従うオブジェクト破棄ワークフロー２０２を使用してデバイスにオブジェクト１０２を破棄させる方法６０８を提供し得る。本明細書に提示される技術に従って動作するように構成される多くのそのようなコンピュータ可読媒体が、当業者によって考案され得る。
【００４２】
[0053]  Ｅ．変形形態
【００４３】
[0054]  本明細書に論じられる技術は、多くの態様において変形形態を用いて考案され得、いくつかの変形形態は、これらおよび他の技術の他の変形形態に対して、追加の利点を提示すること、および／または欠点を低減することができる。さらには、いくつかの変形形態は組み合わせて実施され得、いくつかの組み合わせは、相乗的な連携による追加の利点および／または低減された欠点を特色とし得る。変形形態は、様々な実施形態（例えば、図４の例示的なデバイス４００および／もしくは例示的なシステム４０８、図５の例示的な方法５００、ならびに／または図６の例示的なコンピュータ可読ストレージデバイス６０２）において、そのような実施形態に個別および／または相乗的な利点を与えるために組み込まれ得る。
【００４４】
[0055]  Ｅ１．シナリオ
【００４５】
[0056]  本明細書に提示される技術の実施形態間で変化し得る第１の態様は、そのような技術が利用され得るシナリオの範囲に関する。
【００４６】
[0057]  この第１の態様の第１の変形形態として、本明細書に提示される技術は、ワークステーション、ラップトップ、タブレット、携帯電話、ゲーム機およびポータブルゲーム装置、ポータブルもしくは非ポータブルメディアプレイヤ、テレビや電気製品などのメディア表示デバイス、家庭用電気製品および自動化デバイス、ならびに眼鏡または時計などを統合する着用可能デバイスと統合されたコンピューティング構成要素など、様々なデバイスと共に利用され得る。
【００４７】
[0058]  この第１の態様の第２の変形形態として、本明細書に提示される技術は、ＧＵＩ駆動、コンソール駆動、および／またはＵｌレスのアプリケーション；サービスおよびダイモン；デバイスドライバ；ならびにカーネルプロセスおよびファイルシステムプロセスなどの現実または仮想化されたオペレーティングシステムプロセスなど、様々なスレッド１０６と共に利用され得る。様々なスレッディングおよびスレッドスケジューリングモデルは、本明細書に提示される技術と互換性があり得る。スレッド１０６は、機械語で提供されプロセッサ４０４によって直接実行されるネイティブ実行環境１０８、特定のランタイム環境内でランタイムによって実行されるマネージドアプリケーション、ウェブブラウザなど仮想マシン内で実行する仮想化アプリケーション、およびインタープリタによって実行されるスクリプトなど、様々なタイプの実行環境１０８内で実行することができる。加えて、型指定されていないおよび／または軽く型指定されたオブジェクト（例えば、JSONオブジェクトなど、キー／値格納場所）の軽量のコレクション、ならびに密に組織され型指定されたオブジェクト（例えば、継承およびポリモーフィックタイピングを用いたクラスベースのオブジェクトの深い階層）など、多くのタイプのオブジェクト１０２およびオブジェクトリソース１０４が、管理され、具体的には本明細書に提示される技術によって破棄され得る。オブジェクト破棄ワークフロー２０２はまた、デバイス４０２のコンピューティング環境内の任意のオブジェクト１０２、複数のスレッド１０６および／もしくは実行環境１０８によって共有されるオブジェクト１０２などのオブジェクト破棄が複雑性を提示するオブジェクト１０２のみ、ならびに／または、スレッド１０６がオブジェクト破棄プロセスを開始および完了することを試みたが失敗１１８に遭遇したオブジェクト１０２のみを破棄するために呼び出され得る。
【００４８】
[0059]  この第１の態様の第３の変形形態として、多くのタイプのオブジェクト破棄ワークフロー２０２が利用され得る。第１のそのような例として、ワークフローパターンは、多くの場合、様々なコンピューティング環境において多くのタイプのタスクのために利用され得、また多くのそのようなワークフローは、データベーストランザクションを完了することに関与する複雑なステップなど、リソース集約型で計算コストの高いプロセスに適用される。本明細書に提示されるオブジェクト破棄ワークフロー２０２は、オブジェクト１０２の破棄を組織するためのパターンとして利用され、典型的には単一のオブジェクト破棄要求１１４に応答して破棄可能である（しかしながら、異なるスレッド１０６による排他的ロッキングなどの異例の状況においては複雑な事態に遭遇し得る）比較的軽量のオブジェクト、および図３の例示的なシナリオ３００に例証されるものなど、詳細なタスク基準３０４と共にオブジェクトリソース１０４のロバストなセットを格納する複雑なオブジェクト１０２を含む、幅広い種類のオブジェクト１０２に好適であり得る。生成されたオブジェクト破棄ワークフロー２０２はまた、幅広い範囲のそのようなオブジェクト１０２、例えば、ロバストなアプリケーションによって利用されるオブジェクト１０２のセット全体の破棄を促進するために拡大し得、ここではそのようなオブジェクト１０２は、典型的には破棄するのが容易である軽量オブジェクト１０２と、その破棄には広範囲のタスク基準３０４を提示する複雑なオブジェクト１０２との両方を含む。本明細書に提示される技術は、幅広い範囲のオブジェクトタイプおよび複雑性と共に使用するのに好適であり得る。
【００４９】
[0060]  第２のそのような例として、オブジェクト破棄ワークフロー２０２は、デバイス４０２のオペレーティングシステムの構成要素、そのようなデバイス４０２のプラットフォームまたは構造上の特徴によって提供される１つまたは複数のランタイムの構成要素、ならびに／または、任意のオブジェクト１０２の破棄のためにすべてのスレッド１０６がアクセス可能であり得る、および／もしくは、スレッド１０６および／もしくはオブジェクト１０２の特定のコレクションのために提供され得る、デバイス４０２にインストールされたランタイムライブラリ（例えば、ウェブアプリケーションによって利用されるオブジェクト１０２のオブジェクト破棄を促進するウェブブラウザ構成要素）を含み得る。オブジェクト破棄ワークフロー２０２はまた、サーバファームを含むサーバのセットに分散されるスレッド１０６のコレクションなど、デバイス４０２のコレクションに対して実行するスレッド１０６の分散されたセットを促進し得、ならびに／または、様々なオブジェクトサーバによって格納および／もしくは利用されるオブジェクトの共有コレクションなど、様々なデバイスに分散されたオブジェクト１０２のオブジェクト破棄を管理するために呼び出され得る。第３のそのような例として、オブジェクト破棄ワークフロー２０２は、オブジェクト破棄ワークフロー２０２によって管理される１つまたは複数のオブジェクト１０２内に埋め込まれ得、対照的にオブジェクト破棄ワークフロー２０２は、それによって管理されるオブジェクト１０２を包含し得、ならびに／または、オブジェクト破棄ワークフロー２０２およびオブジェクト１０２は、独立して、および／もしくは１つまたは複数のスレッド１０６のランタイム環境などの共有コンテキスト内に存在し得る。第４のそのような例として、スレッド１０６とオブジェクト破棄ワークフロー２０２との間の関係および／またはインターフェースは、様々なやり方で規定され得る。例えば、オブジェクト破棄ワークフロー２０２は、スレッド１０６の代わりにオブジェクトのオブジェクト破棄に対処するマネージャを、スレッド１０６がオブジェクト１０２のオブジェクト破棄を援助するために呼び出し得るサービスとして、ならびに／またはスレッド１０６が１つまたは複数のオブジェクト１０２のオブジェクト破棄の個別のタスク３０２を実施するために参照および／もしくは利用し得る関数のスクリプト、リソースキット、もしくはライブラリとして、含み得る。スレッド１０６はまた、様々な関数をオブジェクト破棄ワークフロー２０２に委譲することができ、例えば、スレッド１０６および／または実行環境１０８は、オブジェクト１０２のオブジェクト破棄に関与するタスク３０２におけるスレッド１０６の参加を要求するためにオブジェクト破棄ワークフロー２０２が呼び出し得るラムダ式、関数、またはコールバックを公開することができる。
【００５０】
[0061]  この第１の態様の第４の変形形態として、多くのタイプのオブジェクト破棄リスト２１２が利用され得る。第１のそのような例として、オブジェクト破棄リスト２１２は、アレイ、リンクリスト、キュー、順序付けされていないセット、ハッシュテーブルなどのテーブル、およびツリー構造など、多くのタイプのデータ構造として実装され得る。第２のそのような例として、オブジェクト破棄リスト２１２は、破棄されることになっているコンピューティング環境の任意のオブジェクト１０２への最後の参照２０６を格納するグローバルオブジェクト破棄リスト２１２として実装され得る。代替的に、１つまたは複数のオブジェクト破棄リスト２１２が提供され得、ここでは各オブジェクト破棄リスト２１２が、特定のオブジェクトタイプのオブジェクト１０２、および／もしくは選択されたコンテキスト内で利用されるオブジェクト１０２など、特定のタイプのオブジェクト１０２への最後の参照２０６；特定のプログラミング言語および／もしくは実行環境１０８のスレッド１０６など、選択されたスレッド１０６によって利用されるオブジェクト１０２；ならびに／または特定のオブジェクトリソースタイプ１０４のオブジェクトリソース１０４など、オブジェクトリソース１０４の特定のセットを格納するオブジェクト１０２を格納する。第３のそのような例として、オブジェクト破棄リスト２１２は、識別されたオブジェクト１０２が格納される場所へのメモリポインタ、または、オブジェクト１０２のグローバル一意識別子（GUID）および／もしくはユニフォームリソース識別子（URI）などのオブジェクト１０２の一意識別子など、様々なタイプの最後の参照２０６を格納することができる。代替的に、または加えて、オブジェクト破棄リスト２１２は、特定のオブジェクトリソース１０４への参照２０６を格納することができ、この特定のオブジェクトリソース１０４への参照２０６は、そのようなオブジェクトリソース１０４を含むおよび／または参照する１つまたは複数のオブジェクト１０２を破棄している最中に破棄されることになる。多くのそのような計算シナリオ変形形態および構造上の変形形態は、本明細書に提示される技術に従うオブジェクト１０２の破棄を促進するためのオブジェクト破棄ワークフロー２０２の使用に好適であり得る。
【００５１】
[0062]  Ｅ２．オブジェクト破棄ワークフロー
【００５２】
[0063]  本明細書に提示される技術の実施形態間で変化し得る第２の態様は、コンピューティング環境の様々なオブジェクト１０２のオブジェクト破棄を達成するためにスレッド１０６によって利用されるオブジェクト破棄ワークフロー２０２に関する。
【００５３】
[0064]  この第２の態様の第１の変形形態として、オブジェクト破棄ワークフロー２０２は、特定のオブジェクト１０２のオブジェクト破棄に対処するため、および／または特定のスレッド１０６によってオブジェクト１０２の破棄に対処するために、特別に生成され得る。代替的には、オブジェクト破棄ワークフロー２０２は、任意のスレッド１０６の代わりにコンピューティング環境内の任意のオブジェクト１０２の破棄に対処するため、またはスレッド１０６の特定のサブセットによって利用されるオブジェクト１０２の特定のサブセットに対処するために生成され得る。１つのそのような例として、コンピューティング環境は、特定のサービス、プラットフォーム、ライブラリ、および／またはアプリケーションに関与するスレッド１０６およびオブジェクト１０２など、オブジェクト１０２の特定のセットにわたって互いに連携するスレッド１０６のコレクションに関与するコンテキストを特色とし得る。加えて、オブジェクト破棄ワークフロー２０２は、オブジェクト１０２および／またはオブジェクト１０２のオブジェクト破棄に関与するスレッド１０６に関する様々なタイプの情報を含み得る。１つのそのような例として、オブジェクト破棄ワークフローは、特定のオブジェクト１０２について、特定のオブジェクト１０２にアクセスしたことのあるおよび／またはアクセスすることができるスレッド１０６のセットを識別することができる。そのような情報の格納は、オブジェクト破棄ワークフロー２０２が、特定のオブジェクト１０２の破棄に関してオブジェクト１０２にアクセスしたことのあるおよび／またはアクセスすることができるスレッド１０６に明確に通知を発行することを可能にし、これは、例えば、オブジェクト１０２のオブジェクト破棄の経過をそれらに通知するため、および／またはオブジェクト破棄におけるそのようなスレッド１０６の参加を要求するために行われる。加えて、オブジェクト破棄ワークフロー２０２は、オブジェクト１０２の破棄に関与するタスク３０２、それに適用可能なタスク基準３０４、および／またはオブジェクト破棄におけるそれぞれのタスク３０２のステータス３０６など、様々なオブジェクト１０２に適用可能であり得る様々なタイプの情報破棄プロセスを含むことができる。
【００５４】
[0065]  この第２の態様の第２の変形形態として、オブジェクト破棄ワークフロー２０２によるオブジェクト１０２のオブジェクト破棄は、様々なやり方で開始され得る。第１のそのような例として、スレッド１０６は、オブジェクト１０２を破棄するための破棄命令または破棄インターフェースを呼び出すことなど、明示的なオブジェクト破棄要求１１４を開始することができる。第２のそのような例として、スレッド１０６は、オブジェクトへの最後の参照２０６をたまたま含み、かつ参照カウント２０４の１からゼロへの減少を促すオブジェクト１０２への参照２０６を解放すること、またはオブジェクト１０２への最後の参照２０６を含むスレッド１０６のスコープを閉じることなど、暗黙的なオブジェクト破棄要求１１４を開始することができる。第３のそのような例として、スレッド１０６は、自己終了し得、および／または、別のスレッド１０６によって終了され得、スレッド１０６の終了は、スレッド１０６によって保有されていたオブジェクト１０２への最後の参照２０６を解放することを含み得る。
【００５５】
[0066]  この第２の態様の第３の変形形態として、オブジェクト破棄ワークフロー２０２は、オブジェクト破棄要求１１４を開始した第１のスレッド１０６の代わりにオブジェクト１０２のオブジェクト破棄を実施する間、第１のスレッド１０６の代わりにオブジェクト破棄を完了することを防ぐ多くのタイプの妨害に遭遇し得る。第１のそのような例として、オブジェクト破棄ワークフロー２０２は、オブジェクト１０２の選択された部分が第２のスレッド１０６のオブジェクト破棄プロセスと関連付けられること（例えば、第２のスレッド１０６のプログラミング言語および／またはプラットフォームの取り決めなど、第２のスレッド１０６の実行環境１０８によって利用されるオブジェクト破棄取り決め）を発見し得、またオブジェクト１０２の選択された部分が第２のスレッド１０６内で呼び出されるべきオブジェクト破棄プロセスと関連付けられることを決定すると、失敗１１８に遭遇し得る。第２のそのような例として、オブジェクト破棄ワークフロー２０２は、オブジェクト１０２のオブジェクトリソース１０４が、第１のスレッド１０６もオブジェクト破棄ワークフロー２０２も割り込むことができないオブジェクトリソースロック１１２を介して、異なるスレッド１０６によって排他的に保有されることを発見し得る。第３のそのような例として、オブジェクト破棄ワークフロー２０２は、オブジェクト１０２のオブジェクトリソース１０４が、ビジー状態にあることを決定し得る（例えば、外部デバイスを使用して割り込み不可能なプロセスを実施しているデバイスハンドルであり、ここでは、割り込み不可能なプロセス中のオブジェクトリソース１０４の破棄は、データ破棄または外部デバイスへの損傷を結果としてもたらし得る）。第４のそのような例として、オブジェクト破棄ワークフロー２０２は、オブジェクト破棄要求１１４を開始する第１のスレッド１０６が、オブジェクト１０２を破棄するための許可を得ていないことを単に見つけ出すことができる。多くのそのような妨害は、オブジェクト破棄ワークフロー２０２によるオブジェクト破棄の最中に生じ得る。
【００５６】
[0067]  図７は、この第２の態様の第４の変形形態を特色とする例示的なシナリオ７００の例証であり、オブジェクト破棄ワークフロー２０２は、選択されたスレッド１０６によってのみ破棄可能である保護オブジェクトとしてオブジェクト１０２がマークされることを許可し、オブジェクト破棄ワークフロー２０２は、任意の他のスレッド１０６によって開始されるオブジェクト破棄要求１１４を拒否する。この例示的なシナリオ７００では、特定のオブジェクト１０２は、第２のスレッド１０６の要求に応じてのみ破棄され得る保護オブジェクトとしてマークされる７０２。第１の時間７０４において、第１のスレッド１０６は、例えば、参照カウント２０４を１からゼロに減らすことを試みることによってオブジェクト破棄要求１１４を開始する。しかしながら、オブジェクト破棄ワークフロー２０２は、オブジェクト１０２が第１のスレッド１０６によるオブジェクト破棄を防ぐようにマークされることを決定し、したがって第１のスレッド１０６のオブジェクト破棄要求１１４を拒否し（第１のスレッド１０６が参照カウント２０４を１からゼロに減らすことを可能にすること、および／またはオブジェクト破棄リスト２１２内の最後の参照２０６の参照解放２１４を実施することを拒否することを含む）、オブジェクト破棄要求１１４の失敗１１８を第１のスレッド１０６に返す。第２の時間７０６において、オブジェクト破棄ワークフロー２０２は、第２のスレッド１０６からオブジェクト破棄要求２０２を受信し、オブジェクト１０２のマーキング７０２が第２のスレッド１０６がオブジェクト破棄を開始することを許可することを検証する。したがって、オブジェクト破棄ワークフロー２０２は、オブジェクト破棄リスト２１２内の最後の参照２０６の参照解放２１４を実施し、参照カウント２０４を１からゼロに減らし、オブジェクト１０２のオブジェクト破棄要求１１４を少なくとも開始することの成功１１６を報告する。
【００５７】
[0068]  図８は、参照サイクルを形成する、オブジェクトグラフ８０２の他のオブジェクト１０２への参照２０６をそれぞれ含むオブジェクト１０２のサイクリックオブジェクトグラフ８０２に関与する、この第２の態様の第５の変形形態を特色とする例示的なシナリオ８００の例証を提示する。オブジェクト破棄ワークフロー２０２が、スレッド１０６から、サイクリックオブジェクトグラフ８０２のオブジェクト１０２を破棄するためのオブジェクト破棄要求１１４を受信すると、オブジェクト破棄ワークフロー２０２は、どのオブジェクト１０２も、オブジェクト破棄要求１１４内で識別されるオブジェクト１０２への参照２０６を格納するサイクリックオブジェクトグラフ８０２の１つまたは複数の他のオブジェクト１０２をまず破棄することなしには、完全に破棄することができないという点で、困難に遭遇し得る。サイクリックオブジェクトグラフ８０２を含むオブジェクト１０２のセット全体は、したがって、オブジェクト１０２の相互関係に起因して、オブジェクト１０２のいずれかまたはすべてのライフサイクルを超えて存在することができる。この問題に対処するために、オブジェクト破棄ワークフロー２０２は、サイクリックオブジェクトグラフ８０２のオブジェクト１０２のセット全体にわたって同期メカニズム８０４（例えば、オブジェクト１０２のすべてにわたって排他的なロック）を提供し得る。サイクリックオブジェクトグラフ８０２のオブジェクトのうちの１つ、いくつか、またはすべてを破棄するためのオブジェクト破棄要求１１４を受信すると、オブジェクト破棄ワークフロー２０２は、まず、同期メカニズム８０４を介したサイクリックオブジェクトグラフ８０２のオブジェクト１０２への排他的アクセスを確実にすることができる。次いで、オブジェクト破棄ワークフロー２０２は、破棄シーケンス８０６（例えば、オブジェクト１０２を特定の順番で破棄すること）に従ってオブジェクト１０２のオブジェクト破棄を開始することができる。とりわけ、各オブジェクト１０２のオブジェクト破棄は、オブジェクト破棄ワークフロー２０２によって保有される同期メカニズム８０４が、任意の他のスレッド１０６がオブジェクト１０２にアクセスすること、および潜在的には以前に破棄されたオブジェクト１０２への無効の参照２０６に遭遇することを防ぐことから、サイクリックオブジェクトグラフ８０２の他のオブジェクト１０２によって保有されるオブジェクト１０２への参照２０６にかかわりなく実施され得る。オブジェクト破棄ワークフロー２０２は、サイクリックオブジェクトグラフ８０２にわたる破棄シーケンス８０６が完了し、すべてのそのようなオブジェクト１０２が破棄されるまで、同期メカニズム８０４を保持することができ、それにより、サイクリックオブジェクトグラフ８０２の破棄を可能にする。
【００５８】
[0069]  図９は、オブジェクト破棄ワークフロー２０２が、ゾンビ状態９０２としてマークされるような、オブジェクト破棄が開始されたがまだ完了していないオブジェクト１０２をマークする、この第２の態様の第６の変形形態を特色とする例示的なシナリオ９００の例証を提示する。この例示的なシナリオ９００では、第１の時間９０８において、第１のスレッド１０６が、特定のオブジェクト１０２を破棄するためにオブジェクト破棄要求１１４を開始し、オブジェクト破棄ワークフロー２０２が、オブジェクト破棄１０２を開始する。オブジェクト破棄を開始する一方で、オブジェクト破棄ワークフロー２０２は、オブジェクト１０２のオブジェクト破棄が進行中であることを他のスレッド１０６に示すゾンビ状態９０２のマーキングをオブジェクト１０２に適用し得る。オブジェクト１０２のオブジェクト破棄を完了することの失敗１１８に遭遇することに応答して、オブジェクト破棄ワークフロー２０２は、参照作成２１０を実施し、オブジェクト１０２への新規参照２０６をオブジェクト１０２への最後の参照２０６としてオブジェクト破棄リスト２１２に追加し、参照カウント２０４をゼロから１に増やす。次いで、オブジェクト破棄ワークフロー２０２は、別のスレッド１０６がオブジェクト破棄プロセスを再開するのを待つ。しかしながら、そのようなオブジェクト破棄が完了する前の第２の時間９１０において、第２のスレッド１０６は、オブジェクト１０２内にデータを格納する要求など、オブジェクト１０２に対するアクセス要求９０４を開始することができる。オブジェクト１０２のゾンビ状態９０２としのマーキングは、オブジェクト１０２のゾンビ状態９０２を示す、さらには、オブジェクト１０２から読み出されるデータおよび／もしくはそれに書き込まれるデータが正しくない、最新ではない、および／もしく有効ではない可能性があること、ならびに／またはオブジェクト破棄中に失われた可能性があることを警告する、第２のスレッド１０６への警告９０６の生成を結果としてもたらし得る。この様式では、オブジェクト破棄ワークフロー２０２は、オブジェクト破棄が継続している間、他のスレッド１０６によるアクセスからオブジェクト１０２を守り、ならびにオブジェクト破棄中にスレッド１０６がオブジェクト１０２に不注意にアクセスすることによって生じる例外、矛盾した挙動、および／またはデータ損失を低減する。多くのそのような技術は、本明細書に提示される技術に従ってオブジェクト１０２のオブジェクト破棄を実施するためにオブジェクト破棄ワークフロー２０２によって利用され得る。
【００５９】
[0070]  Ｅ３．オブジェクト破棄リスト
【００６０】
[0071]  本明細書に提示される技術の実施形態間で変化し得る第３の態様は、破棄されるべき（およびより具体的には、少なくとも１つのスレッド１０６が、オブジェクト破棄要求１１４を開始し、失敗１１８に終わった）オブジェクト１０２への参照２０６を格納するためのオブジェクト破棄ワークフロー２０２によるオブジェクト破棄リスト２１２の使用に関与する。
【００６１】
[0072]  図１０は、オブジェクト１０２が任意のスレッド１０６内の最後の参照の参照解放２１４を過ぎても保持されることになるように、オブジェクト破棄ワークフロー２０２が、オブジェクト１０２が保持状態１００２とマークされることを可能にする、この第２の態様の第１の変形形態を特色とする例示的なシナリオ１０００の例証である。例えば、オブジェクト１０２は、オブジェクト１０２を現在使用しているスレッド１０６がたとえなくても、コンピューティング環境のスレッド１０６に利用可能なままであるランタイムライブラリまたはサービスのインスタンスを含み得る。この例示的なシナリオ１０００において、オブジェクト１０２への最後の参照２０６を格納するスレッド１０６は、最後の参照２０６を解放し、参照カウント２０４を１からゼロに減らし、オブジェクト１０２を破棄するためにオブジェクト破棄要求１１４を開始する。しかしながら、オブジェクト破棄ワークフロー２０２は、オブジェクト１０２を、最後の参照２０６が解放されるのではなく保持されることになる保持オブジェクト１００２としてマークされていると識別する。したがって、オブジェクト破棄ワークフロー２０２は、参照カウント２０４を減らすこと、最後の参照２０６を解放すること、および／またはオブジェクト１０２を破棄することの失敗１１８を報告し得る。代わりに、オブジェクト破棄ワークフロー２０２は、オブジェクト破棄リスト２１２内に最後の参照２０６を格納することができ、さらに、最後の参照２０６を解放するためおよび／または参照カウント２０４を１からゼロに減らすための様々なスレッド１０６による要求を拒否することができる。したがって、オブジェクト破棄フロー２０２は、オブジェクト破棄リスト２１２を、保持オブジェクト１０２へのキャッシュされた参照２０６を格納する保持オブジェクトキャッシュとして使用し、それにより、オブジェクト１０２が、保持オブジェクト１００２としてのマーキングを保持する間は破棄されないことを確実にする。さらには、保持オブジェクトキャッシュが保持オブジェクト１００２へのキャッシュされた参照２０６を格納する一方、それぞれのスレッド内の保持オブジェクト１００２への他の参照２０６は、保持オブジェクト１００２への弱い参照としてマークされ、参照カウント２０４によって追跡されない。保持オブジェクト１００２としてのオブジェクト１０２のマーキングを削除するための要求に応答して、オブジェクト破棄ワークフロー２０２は、スレッド１０６内の任意の参照２０６を強い参照２０６に変更し得る（およびそれに従って参照カウント２０４を増やし得る）ため、その結果、すべてのそのような参照２０４の解放がオブジェクト１０２のオブジェクト破棄を呼び出す。
【００６２】
[0073]  この第３の態様の第２の変形形態として、スレッド１０６およびオブジェクト破棄ワークフロー２０２は、様々なスレッド１０６がオブジェクト破棄要求１１４を開始することができるオブジェクト破棄リスト２１２へのオブジェクト１０２への参照２０６の追加など、オブジェクト破棄リスト２１２について通信するために様々なやり方で相互作用することができる。
【００６３】
[0074]  図１１は、２つのそのような技術を特色とする例示的なシナリオ１１００の例証を提示し、そのような技術によりスレッド１０６およびオブジェクト破棄ワークフロー２０２は、オブジェクト１０２のオブジェクト破棄を調整するためにオブジェクト破棄リスト２１２を利用する。第１のそのような例１１０６として、第１のスレッド１０６は、オブジェクト破棄要求１１４を開始することができ、その間、オブジェクト破棄ワークフロー２０２は失敗１１８に遭遇し得、この要求がオブジェクト破棄ワークフロー２０２に新規参照２０６をオブジェクト１０２への最後の参照としてオブジェクト破棄リスト２１２に追加することを促す。加えて、オブジェクト１０２への新規参照２０６をオブジェクト破棄リスト２１２に追加することに応答して、オブジェクト破棄ワークフロー２０２は、同様にオブジェクト１０２にアクセスする第２のスレッド１０６に、オブジェクト１０２への新規参照２０６のオブジェクト破棄リスト２１２への追加についてさらに通知することができる。通知１１０２は、第２のスレッド１０６に最後の参照２０６を解放するように促し得、それによりオブジェクト破棄ワークフロー２０２に第２のスレッド１０６の代わりにオブジェクト破棄プロセスを再度開始するように促す。
【００６４】
[0075]  この変形形態において、多くの技術が利用され得、それによりオブジェクト破棄ワークフロー２０２は、通知１１０２の受信側として第２のスレッド１０６を識別する。第１のそのような例として、通知１１０２はまた、オブジェクト破棄ワークフロー２０２によって、および／またはオブジェクト１０２への最後の参照２０６の受信時にオブジェクト破棄リスト２１２によって開始され得る。第２のそのような例として、第２のスレッド１０６は、第１のスレッド１０６より上位であり、かつオブジェクト１０６へのアクセスを共有する上位スレッド１０６（例えば、第１のスレッド１０６を管理するマネージングランタイムのスレッド）をさらに含み得、オブジェクト破棄ワークフロー２０２は、この上位スレッド１０６に、オブジェクト１０２への新規参照２０６のオブジェクト破棄リスト２１２への追加を通知することができる。第３のそのような例として、オブジェクト破棄ワークフロー２０２は、オブジェクト１０２へのアクセスを有する、および／またはオブジェクト１０２に現在アクセスしているもしくは以前にアクセスしたことのあるいくつかのスレッドのうちの１つとして第２のスレッドを識別するために、プロセッサによって実行されるスレッド１０６のスレッドコレクション間を検索することができる。第４のそのような例として、通知１１０２は、様々なやり方で第２のスレッド１０６に伝達され得る。例えば、第２のスレッド１０６は、第２のスレッド１０６に伝達されることになっているメッセージのメッセージキューをさらに含み得、オブジェクト破棄ワークフロー２０２は、通知１１０２を第２のスレッド１０６のメッセージキュー内へ挿入することができ、ここではメッセージは、第２のスレッド１０６に、オブジェクト１０２への新規参照２０６のオブジェクト破棄リスト２１２への追加を通知する。第５のそのような例として、通知１１０２が伝達されることになっている第２のスレッド１０６が保留状態にある場合、オブジェクト破棄ワークフロー２０２は、第２のスレッド１０６を有効化して、通知１１０２を処理すること、およびオブジェクト１０２のオブジェクト破棄を継続することができる。
【００６５】
[0076]  図１１はまた、スレッド１０６とオブジェクト破棄リスト２１２との間の相互作用の第２の例１１０８を例証し、ここではそれぞれのスレッド１０６が、スレッド１０６によって現在アクセスされているおよび／またはアクセスされたことのあるオブジェクト１０２への参照２０６の存在を識別するために、オブジェクト破棄リスト２１２を定期的にレビューする。この第２の例１１０８において、第１のスレッド１０６は、オブジェクト破棄要求１１４を開始することができ、その間、オブジェクト破棄ワークフロー２０２は失敗１１８に遭遇し得、この要求がオブジェクト破棄ワークフロー２０２に新規参照２０６をオブジェクト１０２への最後の参照としてオブジェクト破棄リスト２１２に追加するように促す。第２のスレッド１０６は、オブジェクト破棄リスト２１２をポーリングする１１０４ことができ、オブジェクト１０２への最後の参照２０６を発見すると、オブジェクト１０２が第２のスレッド１０２によって現在アクセスされているかおよび／またはアクセスされたことがあるかどうかを決定することができる。第２のスレッド１０６がオブジェクト１０２とそのような関係を有することを決定することに応答して、第２のスレッド１０６は、オブジェクト１０２への最後の参照２０６をオブジェクト破棄リスト２１２から削除し、最後の参照２０６の参照解放２１４を実施することができ、それにより第２のスレッド１０６の代わりにオブジェクト破棄ワークフロー２０２の再開を開始する。多くのそのような技術は、スレッド１０６およびオブジェクト破棄ワークフロー２０２によって、本明細書に提示される技術に従ってそれらの間でオブジェクト１０２のオブジェクト破棄処理について通信するために利用され得る。
【００６６】
[0077]  Ｆ．コンピューティング環境
【００６７】
[0078]  図１２および以下の説明は、本明細書に明記される提供物のうちの１つまたは複数の実施形態を実施するのに好適なコンピューティング環境の簡単な概要を提供する。図１２のオペレーティング環境は、好適なオペレーティング環境の一例にすぎず、オペレーティング環境の使用または機能性の範囲へのいかなる制限も示唆することを意図しない。例示的なコンピューティングデバイスとしては、限定されるものではないが、パーソナルコンピュータ、サーバコンピュータ、ハンドヘルドまたはラップトップデバイス、モバイルデバイス（携帯電話、パーソナルデジタルアシスタント（PDA）、メディアプレイヤ、および同様のものなど）、マルチプロセッサシステム、大衆消費電子製品、ミニコンピュータ、メインフレームコンピュータ、上記システムまたはデバイスのいずれかを含む分散コンピューティング環境、および同様のものが挙げられる。
【００６８】
[0079]  必須ではないが、実施形態は、１つまたは複数のコンピューティングデバイスによって実行されている「コンピュータ可読命令」という一般的なコンテキストにおいて説明される。コンピュータ可読命令は、コンピュータ可読媒体（以下に論じられる）を介して分散され得る。コンピュータ可読命令は、関数、オブジェクト、アプリケーションプログラミングインターフェース（API）、データ構造、および同様のものなど、特定のタスクを実施するまたは特定の抽象データタイプを実装するプログラムモジュールとして実装され得る。典型的には、コンピュータ可読命令の機能性は、様々な実施形態において所望のように組み合わされ得るか、または分散され得る。
【００６９】
[0080]  図１２は、本明細書に提供される１つまたは複数の実施形態を実装するように構成されたコンピューティングデバイス１２０２を備えるシステム１２００の例を例証する。１つの構成において、コンピューティングデバイス１２０２は、少なくとも１つの処理ユニット１２０６およびメモリ１２０８を含む。コンピューティングデバイスの正確な構成およびタイプに応じて、メモリ１２０８は、揮発性（例えばRAMなど）、不揮発性（例えば、ROM、フラッシュメモリなど）、またはこれら２つの何らかの組み合わせであり得る。この構成は、図１２において破線１２０４で例証される。
【００７０】
[0081]  他の実施形態において、デバイス１２０２は、追加の特徴および／または機能性を含み得る。例えば、デバイス１２０２はまた、限定されるものではないが、磁気ストレージ、光学ストレージ、および同様のものなど、追加のストレージ（例えば、取り外し可能および／または取り外し不可能）を含み得る。そのような追加のストレージは、図１２においてストレージ１２１０により例証される。１つの実施形態において、本明細書に提供される１つまたは複数の実施形態を実装するためのコンピュータ可読命令は、ストレージ１２１０内にあり得る。ストレージ１２１０はまた、オペレーティングシステム、アプリケーションプログラム、および同様のものを実施する他のコンピュータ可読命令を格納することができる。コンピュータ可読命令は、例えば、処理ユニット１２０６による実行のためにメモリ１２０８にロードされ得る。
【００７１】
[0082]  「コンピュータ可読媒体」という用語は、本明細書で使用される場合、信号などの通信媒体を含むコンピュータ可読媒体の他の形態を除外するコンピュータ可読メモリデバイスを含む。そのようなコンピュータ可読メモリデバイスは、揮発性および／または不揮発性、取り外し可能および／または取り外し不可能であり得、コンピュータ可読命令または他のデータを格納する様々なタイプの物理デバイスを伴い得る。メモリ１２０８およびストレージ１２１０は、コンピュータ記憶媒体の例である。コンピュータ記憶ストレージデバイスとしては、限定されるものではないが、ＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ、フラッシュメモリまたは他のメモリ技術、ＣＤ−ＲＯＭ、デジタルバーサタイルディスク（DVD）または他の光学ストレージ、磁気カセット、磁気テープ、および磁気ディスクストレージまたは他の磁気ストレージデバイスが挙げられる。
【００７２】
[0083]  デバイス１２０２はまた、デバイス１２０２が他のデバイスと通信することを可能にする通信接続１２１６を含み得る。通信接続１２１６は、限定されるものではないが、モデム、ネットワークインターフェースカード（NIC）、統合ネットワークインターフェース、無線周波送信器／受信器、赤外線ポート、ＵＳＢ接続、またはコンピューティングデバイス１２０２を他のコンピューティングデバイスに接続するための他のインターフェースを含み得る。通信接続１２１６は、有線接続またはワイヤレス接続を含み得る。通信接続１２１６は、通信媒体を送信および／または受信することができる。
【００７３】
[0084]  「コンピュータ可読媒体」という用語は、通信媒体を含み得る。通信媒体は、典型的には、コンピュータ可読命令または他のデータを、搬送波または他の輸送メカニズムなどの「変調データ信号」で具現化するものであり、任意の情報伝達媒体を含む。「変調データ信号」という用語は、その特性のうちの１つまたは複数が情報を信号でエンコードするような様式で設定または変更されている信号を含み得る。
【００７４】
[0085]  デバイス１２０２は、キーボード、マウス、ペン、音声入力デバイス、タッチ入力デバイス、赤外線カメラ、ビデオ入力デバイス、および／または任意の他の入力デバイスなどの入力デバイスを含み得る。１つまたは複数のディスプレイ、スピーカ、プリンタ、および／または任意の他の出力デバイスなどの出力デバイス１２１２も、デバイス１２０２に含まれ得る。入力デバイス１２１４および出力デバイス１２１２は、有線接続、ワイヤレス接続、またはそれらの任意の組み合わせを介してデバイス１２０２に接続され得る。１つの実施形態において、別のコンピューティングデバイスからの入力デバイスまたは出力デバイスが、コンピューティングデバイス１２０２のための入力デバイス１２１４または出力デバイス１２１２として使用され得る。
【００７５】
[0086]  コンピューティングデバイス１２０２の構成要素は、バスなどの様々な相互接続によって接続され得る。そのような相互接続は、ＰＣＩ  Ｅｘｐｒｅｓｓなどの周辺構成要素相互接続（PCI）、ユニバーサルシリアルバス（USB）、Ｆｉｒｅｗｉｒｅ（IEEE1394）、光学バス構造、および同様のものを含み得る。別の実施形態において、コンピューティングデバイス１２０２の構成要素は、ネットワークによって相互接続され得る。例えば、メモリ１２０８は、ネットワークによって相互接続された異なる物理的位置にある複数の物理メモリユニットからなり得る。
【００７６】
[0087]  当業者は、コンピュータ可読命令を格納するために利用されるストレージデバイスがネットワークにわたって分散され得ることを認識するものとする。例えば、ネットワーク１２１８を介してアクセス可能なコンピューティングデバイス１２２０は、本明細書に提供される１つまたは複数の実施形態を実装するためのコンピュータ可読命令を格納し得る。コンピューティングデバイス１２０２は、コンピューティングデバイス１２２０にアクセスし、コンピュータ可読命令の部分またはすべてを実行のためにダウンロードすることができる。代替的に、コンピューティングデバイス１２０２は、必要に応じていくつかのコンピュータ可読命令をダウンロードすることができるか、またはいくつかの命令が、コンピューティングデバイス１２０２において、いくつかがコンピューティングデバイス１２２０において実行され得る。
【００７７】
[0088]  Ｇ．用語の使用
【００７８】
[0089]  本主題は、構造的特徴および／または方法論的行為に特化した言語で説明されているが、添付の特許請求の範囲で定義される本主題は、上に説明される特定の特徴または行為に必ずしも限定されないことが理解される。むしろ、上に説明される特定の特徴および行為は、特許請求の範囲を実装する例示的な形態として開示される。
【００７９】
[0090]  本明細書で使用される場合、「構成要素」、「モジュール」、「システム」、「インターフェース」などの用語、および同様のものは概して、ハードウェアか、ハードウェアおよびソフトウェアの組み合わせか、ソフトウェアか、または実行中のソフトウェアのいずれかである、コンピュータ関連のエンティティを指すことが意図される。例えば、構成要素は、限定されるものではないが、プロセッサ上で実行するプロセス、プロセッサ、オブジェクト、実行ファイル、実行のスレッド、プログラム、および／またはコンピュータであり得る。例証として、コントローラ上で実行するアプリケーションおよびコントローラの両方が構成要素であり得る。１つまたは複数の構成要素は、実行のプロセスおよび／またはスレッド内で存在してもよく、構成要素は、１つのコンピュータ上に局在し得るか、および／または２つ以上のコンピュータ間に分散され得る。
【００８０】
[0091]  さらには、特許請求される主題は、開示される主題を実装するようにコンピュータを制御するようにソフトウェア、ファームウェア、ハードウェア、またはそれらの任意の組み合わせを生成するために、標準のプログラミングおよび／またはエンジニアリング技術を使用して、方法、装置、または製造品として実装され得る。「製造品」という用語は、本明細書で使用される場合、任意のコンピュータ可読デバイス、キャリア、または媒体からアクセス可能なコンピュータプログラムを包含することが意図される。当然ながら、当業者は、特許請求される主題の範囲または趣旨から逸脱することなく本構成に対して多くの修正がなされ得ることを認識するものとする。
【００８１】
[0092]  実施形態の様々な動作が本明細書に提供される。１つの実施形態において、説明される動作のうちの１つまたは複数は、コンピューティングデバイスによって実行される場合に、コンピューティングデバイスに説明される動作を実施させる、１つまたは複数のコンピュータ可読媒体に格納されたコンピュータ可読命令を構成し得る。動作の一部またはすべてが説明される順序は、これらの動作が必ず順序依存であることを示唆するように解釈されるべきではない。代替的な順序が本明細書の利益を有する当業者によって理解されるものとする。さらに、すべての動作が本明細書に提供される各実施形態に必ずしも存在するわけではないことが理解される。
【００８２】
[0093]  「例」として本明細書に説明される態様または設計は、他の態様または設計より有利であると必ずしも解釈されるべきではない。むしろ、「例」という言葉の使用は、本明細書に提示される技術に属し得る１つの可能な態様および／または実装形態を提示することが意図される。そのような例は、必ずしもそのような技術に必要ではないか、または限定することを意図されない。そのような技術の様々な実施形態は、そのような例を、単独で、または他の特徴と併せて含み得、ならびに／または、例証された例を変化させ得るおよび／または省略し得る。
【００８３】
[0094]  本明細書で使用される場合、「または」という用語は、排他的な「または」ではなく包含的な「または」を意味することが意図される。すなわち、別途記載のない限り、または文脈から明白でない限り、「ＸはＡまたはＢを用いる」は、自然な包含的置換のいずれかを意味することが意図される。すなわち、ＸがＡを用いる、ＸがＢを用いる、またはＸがＡおよびＢの両方を用いる場合、「ＸはＡまたはＢを用いる」は、前述の場合のいずれの下においても満足される。加えて、冠詞「ａ」および「ａｎ」は、本明細書および添付の特許請求の範囲において使用される場合、概して、別途記載のない限り、または文脈から単数形を対象にすることが明白でない限り、「１つまたは複数」を意味すると解釈され得る。
【００８４】
[0095]  また、本開示は、１つまたは複数の実装形態に関して示され説明されているが、本明細書および添付の図面の熟読および理解に基づいて等価の変更および修正が当業者に発生するものとする。本開示は、すべてのそのような修正および変更を含み、以下の特許請求項の範囲によってのみ制限される。具体的には、上に説明される構成要素（例えば、要素、リソースなど）によって実施される様々な機能に関して、そのような構成要素を説明するために使用される用語は、本明細書において例証された例示的な本開示の実装形態おいて機能を実施する開示された構造には構造的に等価ではないとしても、別途記載のない限り、説明される構成要素の特定の機能を実施する（例えば、機能的に等価である）任意の構成要素に対応することが意図される。加えて、本開示の特定の特徴はいくつかの実装形態のうちの１つのみに関して開示されているが、そのような特徴は、任意の所与のまたは特定の用途のために所望され得るまたは有利であり得ることから、他の実装形態の１つまたは複数の他の特徴と組み合わされ得る。さらに、「含む（includes）」、「有する（having）」、「有する（has）」、「有する（with）」、またはそれらの変異形が、詳細な説明または特許請求の範囲のいずれかにおいて使用される範囲において、そのような用語は、「備える（comprising）」という用語と類似した様式で包含的であることが意図される。
【図１】
2019525321.tif 000003
【図２】
2019525321.tif 000004
【図３】
2019525321.tif 000005
【図４】
2019525321.tif 000006
【図５】
2019525321.tif 000007
【図６】
2019525321.tif 000008
【図７】
2019525321.tif 000009
【図８】
2019525321.tif 000010
【図９】
2019525321.tif 000011
【図１０】
2019525321.tif 000012
【図１１】
2019525321.tif 000013
【図１２】
2019525321.tif 000014
【国際調査報告】
2019525321.tif 000015
2019525321.tif 000016