Предположим, что мы берем пример кода, как показано ниже
class Employee
{
int id;
String name;
}
Employee e = new Employee(1, "NewEmployee");
В приведенном выше коде я предполагаю, что сначала выделяется куча памяти для объекта Employee, а затем его ссылка присваивается ссылке на стек e
.
Действительно ли вышеприведенное допустимо или здесь происходит что-то глубокое?
Если да, то давайте предположим, сразу после создания памяти в куче и непосредственно перед тем, как ее ссылка будет присвоена e
, GC запускает и идентифицирует, что нет никаких ссылок на эту новую память кучи от корней GC.
- Будет ли GC очищать этот ресурс ?
- Есть ли способ, которым JVM / CLR обрабатывает эти сценарии и избегает такого рода повреждения памяти?
Пометка Java и C #, как я вижу, логика очистки в случае Mark и Sweep для Java и C # кажется почти одинаковой (по крайней мере, с точки зрения идентификации неиспользуемого объектаот корней и очистки).