‫また来るよ｡
‫このビデオでは､ ガベージコレクタとC-Sharpがどのようにメモリを管理しているかについてお話したいと思います｡
‫つまり､ ガベージコレクションは､ 複数のプログラミング言語で利用できるツールなのだ｡
‫そして､ それは手動で行われるものもあれば､ 自動的に行われるものもあります｡
‫また､ ドットネットフレームワークは自動的なメモリ管理を行うため､ すべてのプログラミング言語のように手動でガベージコレクタを使用する必要がありません｡
‫CやC++などのプログラミング言語は､ 手動でガベージコレクションを行うので､ 時々実行しなければならず､
‫実行するタイミングを把握する必要があります｡
‫だから､ それはCショップで自動的に行われていることなんです｡
‫だから､ あまり多くの人が使うものではないんです｡
‫だから､ もっと複雑なプログラム､ 本当に高度なものを作ってから､ 時々使うようになるのです｡
‫でも､ 本当にいつも使うものでもないし､ ほとんどの場合､ 使わなくてもいいものなんです｡
‫だから､ いわばメジャーな話題ではないんですね｡
‫わかりました｡
‫例えば､ Dennisというオブジェクトがあり､ その型はhumanだとします｡
‫そこで､ humanというクラスを作り､ 複数の異なるプロパティなどを用意しました｡
‫つまり､ 最終的には人間型のオブジェクトを作り､ それをDennisと呼んでいるだけなのです｡
‫そうすることで､ この新しいキーワードを使うことで､ 私の記憶の中にオブジェクトが作られるため､ 記憶が必要になるのです｡
‫そこで､ Cシャープがメモリを確保し､ オブジェクトが使われなくなった後は､ フレームワークがシステムで使うためのメモリを回収するように配慮しているのです｡
‫この場合､ このオブジェクトを作成して､ それを使うかもしれないし､ 何度も使うかもしれないわけです｡
‫でも､ ある時期からもう使わないし､ もしかしたら参考文献もカットしているかもしれません｡
‫そして､ このメモリはブロックされたので､ ガベージコレクタがそれを掃除することになります｡
‫そのため､ このメモリを他のオブジェクトのために再び利用できるようにする必要があるのです｡
‫では､ ビジュアル面から見てみましょう｡
‫左側がシステムメモリプール､ 右側がプログラムというわけです｡
‫そして､ システム・メモリー・プールには大量のメモリーがあり､ このメモリーを複数の異なるプログラムに使用することができます｡
‫しかし､ 今はそれを実行するプログラムがあり､ そのプログラムの中で､ オブジェクトを作成しています｡
‫さて､ 突然ですが､ 私たちの記憶にはちょっとしたスペースが必要です｡
‫わかりました｡
‫つまり､ プログラムからオブジェクトが格納されているメモリへの参照があるわけです｡
‫わかりました｡
‫だから､ 直接の参照先があり､ それを再利用したり､ 別の場所から呼び出したりすることができるのです｡
‫わかりました｡
‫そして､ もう一人､ もう一人と｡
‫つまり､ 私たちが作った複数の異なるオブジェクトがあるわけです｡
‫そして､ 新しいオブジェクトを作成するたびに､ メモリプールにメモリが確保され､ プログラムからそのメモリへの参照が発生するのです｡
‫だから､ これらのリファレンスがあるのです｡
‫つまり､ プログラムからメモリプールへの参照があるわけです｡
‫今一つは､ リファレンスが削除されるかもしれない｡
‫そのため､ 変数をnullにしたり､ オブジェクトをnullにしたりして参照を削除すると､ 突然参照が消えてしまうことがあります｡
‫これで､ このプログラムからこの小さなメモリ割り当てへの参照はなくなりました｡
‫ガベージコレクタがそれに気づいて､ よし､ 参照はない､ だからこの小さなメモリは使われない､
‫だから掃除するか､ 再割り当てするか､ 他の割り当てのために解放してしまおう､ と言うのです｡
‫そうすると､ こうなるんです｡
‫では､ 次にガベージコレクタが働く場合の例を見てみましょう｡
‫そして､ ここにmy functionという関数があり､ ここにオブジェクトを作成しています｡
‫もう一度言いますが､ デニスというのは
‫そして､ デニスさんは自分のメソッドを､ 私たちはティーチなどと呼んでいます｡
‫そして､ 彼の年齢を設定し､ 別のメソッドを呼び出して､ get older などとします｡
‫しかし､ ある時点で､ 関数呼び出しが終了したため､ メモリ内のこのDennisオブジェクトは不要になる｡
‫つまり､ 関数がオブジェクトを終了させるわけです｡
‫Dennisはスコープ外に出てしまい､ Dennisへの参照はもうありません｡ なぜなら､ 私の関数は関数であり､
‫関数の中にあるこのオブジェクトがあるので､ そのスコープは関数の中にあるのです｡
‫なぜなら､ 関数の中にあるオブジェクトをこの関数の外から参照することはできないからです｡
‫そうですね｡
‫そのため､ そのためのフィールドを作るなど､ 別のアプローチが必要になります｡
‫しかし､ 最終的にはガベージコレクタというものが､ このデニスをきれいにして､ このメモリを再割り当てするのです｡
‫そして､ ここでの一般的な考え方は､ これはあくまでも単純な一例であるということです｡
‫ガベージコレクタが活躍する場面は他にもたくさんありますが､ これはすでに使っているものです｡
‫ですから､ ここで見ることのできるコンセプトは､ すでにこのコースの他のビデオや講義で見たことがあります｡
‫だから､ この例を選んだのです｡
‫では､ ガベージコレクションについて知っておくべきことは何でしょうか｡
‫まあ､ 手動でガベージコレクタを呼び出す必要はないのですが､ 呼び出せるので､ 手動でやってもいいのです｡
‫ガベージコレクタは処理能力が必要なので､ 別スレッドで､ 非常に軽量にできています｡
‫しかし､ それでもある程度の処理能力は必要です｡
‫ガベージコレクタの目標は､ メモリを解放しつつ､ 処理能力をあまり使わないようにすることです｡
‫そのため､ 一般的にはあまり処理能力を必要としないでしょうが､ 常に呼び出されるわけでもなく､ ガベージコレクタが常に動いてメモリを解放してくれるわけでもないでしょう｡
‫必要なときに､ あるいは必要と思ったときに､ 実行するだけです｡
‫だから､ ここが本当に難しいところなんです｡
‫記憶は必ずしもすぐに取り戻せるわけではありません｡
‫ガベージコレクタは､ 手動で呼び出したとしても､ すぐに実行されるわけではなく､ 少し時間がかかるかもしれません｡
‫以上が､ ガベージコレクタの厄介な点です｡
‫ガベージコレクタによってオブジェクトがメモリから解放される直前にコードを実行するために､ finalizedメソッドを実装することができます｡
‫これは､ オブジェクトがクリーンアップされる直前に特定のコードを実行することにした場合､ つまりガベージコレクタがそれをクリーンアップする直前に実行することになることを意味する｡
‫ですから､ 例えば､ もうこれへの参照がなくなったら､ 実行させたい特定の機能を実装するために､ このクラス内のfinal
‫laserメソッドを使用することができるのです｡
‫ガベージコレクタが来て､ オブジェクトをクリーンアップするか､ メモリを再配置するか､ メモリからこのオブジェクトに解放する直前に､
‫自分で物を片付けたいと思うかもしれません｡
‫わかりました｡
‫ガベージコレクタはいつ実行されるのですか？
‫まあ､ システムの物理メモリが少ないとき､ 割り当てられたメモリがあらかじめ設定した閾値を超えたとき､
‫ガベージコレクタのコレクトやコレクトメソッドが呼ばれたとき､ これは超厄介なメソッドではあるけれど｡
‫というものなんですね｡
‫そう､ とても具体的で､ とても特別なのです｡
‫もっと詳しく知りたい方は､ ガベージコレクタのドキュメントをご覧になってみてください｡
‫しかし､ ドットコレクトメソッドは必ずしもストレートに呼ばれるとは限らず､ 直接すべてをクリーンアップするわけではありません｡
‫ツールに提案するというより､ よし､ ガベージコレクタだ､ という感じですね｡
‫個人的にはそこが良いポイント､ 良い回収場所になると思うのですが､ 場合によっては受け付けてくれなかったり､
‫後回しにしてしまったり､ そういうこともあるかもしれません｡
‫もしかしたら､ ガベージコレクションをしただけで､ 必要ないと判断したとか､ そういうことかもしれません｡
‫だから､ とても厄介なんです｡
‫もっと詳しく知りたい方は､ ドキュメントをご覧ください｡
‫しかし､ ガベージコレクタが何をするのかを理解する良いきっかけになると思います｡
‫それに､ 今言ったように､ 今はメモリがたくさんあるので､ ほとんどの場合､ 必要ないでしょう｡
‫また､ プログラム中に巨大なメモリリークがなければ､ こうした問題に遭遇することはないはずです｡