GC in .net framework

bleyman

Тут кто-то удивлялся забавственному поведению жавовского коллектора? Ловите бля. Я в ахуе.

Eugenia_2005

а у меня вот что получилось, копипаст его кода
A..ctor
Entering A.DoSomething
Handle valid: True
Exiting A.DoSomething
A..Finalize
что я не так сделал?

Marinavo_0507

Правильно говорят, нельзя так делать.
Хотя сразу и неочевидно, пожалуй.

bleyman

А хз. Возможно не скомпилил в релизе, или у тебя второй фреймворк (в нём вроде более логично всё работает или 1.1 но звёзды встали определённым образом... Мы щаз это выясняем.
2Гадфазер: вообще-то нихуя не логично. Я, как программер на шарпе, вовсе не должен задумываться о виде мсил-кода вызова функции. Я вообще о мсиле знать не должен.
Я вижу выражение - zzz.Zzz(this.zzz); в этом выражении используется this.
Но что меня больше всего убивает - люди из M$ нихуя не спешат поделиться с окружающими радостными новостями о поведении своей поебени в нетривиальных случаях. Мы щаз изучаем поведение этой поебени - пиздец! Она так себя ведёт не на всех машинах!

bastii

Да, мужык конечно прав, что мало кто об этом знает. Я вот даже читал все блоги Cris Brumme, а про это как-то упустил. А так никаких проблем, нужно знать о таких побочных эффектов оптимизации. Можно узать GC.KeepAlive. А как зачита от групых прогеров узать что-нибудь типа GoodHandle:

class GoodHandle
{
private Object owner;
public int handle;

public GoodHandle(Object owner, int handle)
{
this.owner = owner;
this.handle = handler;
}

~GoodHandle
{
...
}
}
Тогда в EnvironmentEmulator

public static bool OperateOnHandle(GoodHandle handle)
{
GC.Collect; // It can happen any time, for example here.
bool r = openHandles.ContainsKey(handle.handle);
GC.KeepAlive(handle);

return r;
}

В этом случае VB прогеру, который будет писать класс A, не нужно будет задумываться о таких проблемах. Хотя неверно есть и более простые решения.

bastii

Но что меня больше всего убивает - люди из M$ нихуя не спешат поделиться с окружающими радостными новостями о поведении своей поебени в нетривиальных случаях
Почитай блоги Сриса Брумми, станенет понятно, что не все чем с тобой могут поделится, может воспринять средне-статистический прогер. После первого прочтения хорошо если 50% понятно будет

Marinavo_0507

> 2Гадфазер: вообще-то нихуя не логично. Я, как программер на шарпе, вовсе не должен задумываться о виде мсил-кода вызова функции.
> Я вообще о мсиле знать не должен.
А я о нём и не задумывался, говорю из общих соображений.
Привязка внешнего ресурса к значению в памяти - похоже, плохая идея.
Как и вообще файналайзеры, которые не вкладываются в концепцию сборки мусора.
Думал полчаса, и решил, что для управления внешними ресурсами нужны специальные средства,
с поддержкой на уровне языка, если хочется одновременно удобства и корректности.

bastii

Так Finilize это на крайний случай, а так все должны юзать Dispose
В С# и в VB2005 для этого есть конструкция using, которая сильно помогает.

Marinavo_0507

> В С# и в VB2005 для этого есть конструкция using, которая сильно помогает.
А что это? Я что-то не смог найти объяснения.

bleyman

using (Resource resource = new Resource
{
...
}
Resource должен держать IDisposable, в конце блока гарантированно вызвается Dispose.
Что самое забавное - на самом деле ресурс вовсе не обязательно создавать именно там где я написал. То есть валидна и такая схема:
Resource resource = new Resource
...
using (resource){}
Вот =)

Marinavo_0507

А, ну это не интересно.
Я-то надеялся что-то крутое увидеть

freezer

Но что меня больше всего убивает - люди из M$ нихуя не спешат поделиться с окружающими радостными новостями о поведении своей поебени в нетривиальных случаях. Мы щаз изучаем поведение этой поебени - пиздец! Она так себя ведёт не на всех машинах!
Странно... лично я слышал о таком поведении от Д. Бокса на майкрософтовской конфе года три назад...

bastii

Еще ловите такую инфу
SafeHandle: A Reliability Case Study [Brian Grunkemeyer]
Там описывается эта ситуация, и одна еще хуже, будет ссылка на еще один интересный пост.
Оставить комментарий
Имя или ник:
Комментарий: