以下のようなサンプルコードを考えてみましょう
class Employee
{
int id;
String name;
}
Employee e = new Employee(1, "NewEmployee");
上記のコードでは、従業員オブジェクトのヒープ メモリの割り当てが最初に行われ、次にその参照がスタック参照に割り当てられると想定していますe
。
上記は有効ですか、それともここで何か深いことが起こりますか?
はいの場合、ヒープにメモリが作成された直後、その参照が に割り当てられる直前にe
、GC が起動し、GC ルートからこの新しいヒープ メモリへの参照がないことを確認します。
- GC はこのリソースをクリーンアップしますか?
- JVM/CLR がこれらのシナリオを処理し、この種のメモリ破損を回避する方法はありますか?
Java と C# の両方にタグを付けると、Java と C# の両方の Mark and Sweep の場合のクリーンアップのロジックはほぼ同じように見えます (少なくとも、未使用のオブジェクトをルートから識別してクリーンアップするという点では)。