it-юмор :: geek (Прикольные гаджеты. Научный, инженерный и айтишный юмор)

it-юмор geek 
it-юмор,geek,Прикольные гаджеты. Научный, инженерный и  айтишный юмор
Подробнее

it-юмор,geek,Прикольные гаджеты. Научный, инженерный и айтишный юмор
Еще на тему
Развернуть
охуеные вопросы на собесах про то как он работает
чем один вид отличается от другого

начинаешь работать, 99.9% ты даже не будешь трогать этот ебучий гц, и иногда будешь вызывать диспоуз, патерн скопипащенный с сайта масдая
Например?
Мне на вскидку приходит только:
Какие объекты собирает сборщик?
Почему финализаторы не есть гуд?
Сколько поколений у сборщика?
на которых нету ссылок
потому что конечная точка в приложении
3(2)

но я ответил не развернуто и можно еще очень долго доебываться
но зачем? какой блять в этом смысл?
> на которых нету ссылок

двунаправленный список, есть ссылка на его начало, в списке два объекта, первый ссылается на второй, второй назад, убираем ссылку на начало, но элементы списка каждый имеют ссылку на себя от соседа и чо - не освобождать их? А нахрена такой GC вообще нужен?
dadv dadv 25.01.202001:55 ответить ссылка -1.7
Это в старых реализация GC такое было.
У современных языков программирования нету подсчета ссылок и строится граф-достижимости из корня приложения. Т.е если 2 объекта где-то в космосе ссылаются друг на друга и нету ссылок на них из других частей, то объект грохается.
А что такое "корень приложения"? Если основной тред долгоиграющего сервиса по разным событиям рожает и запускает ещё треды работать параллельно, создавая собственные объекты, причём "папе" нет дела до работы детишек - папе всё равно копить бесконечно растущий список ссылок на детишек? А если нет, то при удалении ссылки на дитятко его объекты для GC становятся "без ссылок" с точки зрения родителя и всё дитятко надо зачистить, что ли?
dadv dadv 25.01.202003:51 ответить ссылка 0.0
Ну запустил ты треды. Треды же выполняю конкретно какой-то метод. => тут 2 ситуации: Ты создаешь объекты в рамках этого метода и при выходе из некоторой области видимости этого объекта они удаляются или ты создаешь объекты и заносишь их в поля класса, который создал эти треды, т.е корня классу, который прикреплен к корню.
Ты не понял вопроса. Папа запустил тред и либо забыл про него (затёр ссылку у себя), либо нет. Если папа не забывает, это значит, что он копит у себя неограниченно растущий набор ссылок на деток, а это плохо. А если папа не хранит у себя ссылки на деток, то как только он ссылку на дитятко затёр у себя (это вовсе не обяхательно за счёт области видимости происходит), то для GC пришла пора детку вычистить из памяти, так что ли?
dadv dadv 25.01.202010:51 ответить ссылка -0.1
трэды не менеджатся гц, а объекты не привязаны к трэдам, хип глобален
если я правильно понял, про что ты
villy villy 25.01.202012:41 ответить ссылка 0.4
Так ведь в том-то и дело, что хип глобален, поэтому если бы GC тупо грохал всё, на что нет ссылок от "папы", то дочерние треды не смогли бы работать.
dadv dadv 25.01.202012:53 ответить ссылка -0.1
не уверен я, что правильно уловил твои сомнения...
в жабке есть параллельный с твоими трэдами гц и есть фуллгц, который всех, кроме себя, суспендит, пока работает. первый по-быстренькому выносит мусор из young generation, а второй уже достижимость из корня графа проверяет, но при этом stop the world
алсо, в новой яве как-то еще более хитро всё, но я пока не сильно погружался
villy villy 25.01.202013:12 ответить ссылка 0.3
Ну хз. Как мне кажется, поверхностные знания работы GC должны иметься.
Например, зная как работает GC ты не будешь много мусорить соединяя большое кол-во строк между собой, а будешь пользоваться StringBuilder'ом.

Т.е тоже самое можно сказать про структуры: Зачем знать структуры, когда все за тебя сделано? А вот зная, что список имеет такую-то сложность, а словарь такую-то, ты понимаешь, что лучше использовать словарь на большом кол-ве данных, а не список. Какой-нибудь новичок может обмазываться LINQ и думать, что Where работает так же быстро как в СУБД.
то что ты перечислил с гц никак не пересекается
соединяя кучу строк ты тупо будешь ждать ... а это время,
а линкью ...а их много и они по разному работают

ты с этим познакомишься сам
и от гц ты дальше будешь знать что гц существует, не более
Ну хз. Я бы если на работу принимал бы, то спросил бы все равно базис про ГЦ.
Вот такие "программисты" с поверхностными знаниями потом и выпускают "продукты", которые на практике своей требухой занимают всю доступную память, полагаясь на волшебный GC.
dadv dadv 25.01.202003:54 ответить ссылка -0.2
гц-среды при траблах внутри себя хотя бы всю ось не крашат
villy villy 25.01.202012:43 ответить ссылка 0.3
Я могу придумать 101 вопрос по сборщику мусора. Как писал ещё Джоэл Спольски - все нетривиальные абстрации дырявы. По крайней мере в C#, есть куча вопросов с боксингом переменных. А ещё есть mono, в котором свой, тупейший gc.
GC хорош для мелких задач, но когда ты используешь ресурсы по максимуму, то приходится самому управлять памятью (и не допускать до неё gc где это ненужно)
koka koka 25.01.202003:09 ответить ссылка -0.3
По моему, боксинг переменных в C# давно исчерпал себя. Когда не было дженериков, то с ним можно было столкнуться. Так же можно было столкнуться, когда не было nullable типов. Теперь не представляю, как в современном C# можно с ним пересечься, если кто-то специально себе в ноги не стреляет и не пишет убогий код.

Ну хз на счет ресурсов. Если все правильно спроектировано, то память не должно не куда утекать.
Я не спорю, что ручной контроль памяти может работать шустрее, но важно его еще правильно реализовать, так как очистка памяти может вызывать фрагментацию и все такое. В .NET управляемая куча дефрагментируется и сжимается в фоне.

По сути, это вечный холивар, как Ручник VS Автоматическа коробка передач.
Dictionary<Enum, object> в Mono будет боксить енумы. Познай всю боль программистов на юинити.
koka koka 25.01.202003:23 ответить ссылка 0.4
Бляяя. Я тока щяс узнал, что в этом случае enum будет box-иться.
Решил погуглить, и в теме, за 2017 говорилось, что можно в качестве ключа юзать не "enum", а "ScriptableObject".
Кто может подсказать, насколько это лучше, чем обычный int?

var list = new List<string>{"test"};
foreach(var str in in list){
    Console.WrilteLine(str);
}

var ilist = (IList<string>)list;
foreach(var str in in ilist){
    Console.WrilteLine(str);
}


(код написал по памяти - могут быть синтаксические ошибки)
Почему в первом случае foreach работает без аллокаций, а во втором случае с аллокацией? Как избежать аллокаций во втором случае? =)
koka koka 25.01.202003:39 ответить ссылка 0.5
В первом случае вызовется
List.Enumerator List.GetEnumerator()
который вернёт value-тип - переменная будет лежать в стеке метода.

Во втором это будет
IEnumerator IEnumerable.GetEnumerator()
который вернёт такой же List.Enumerator, только забоксенный в IEnumerator - отсюда аллокация.

Избежать можно итерируясь циклом for вместо foreach - итератор не нужен.

Хотя сам по себе этот пример, конечно, не является поводом всегда где только можно отказываться от интерфейсов коллекций в пользу конкретного класса :) Часто семантика важнее, чем производительность.
P.S. Никогда не доводилось писал код с генериками здесь в комментах: сожрались параметры в угловых скобках на типах List, IEnumerable и IEnumerator. Не знаю, как их правильно можно экранировать, было бы здорово узнать.
обычное хтмл-экранирование
&lt; -> <
&gt; -> >
koka koka 26.01.202002:49 ответить ссылка 0.0
Понял, спасибо.
> в фоне

Мухахаха! А кто сказал, что фоновым тредам достанется CPU раньше, чем кончится память? Взять любую практическую задачу типа компрессора или какого другого вычисления, алгоритм которых предусматривает постоянное выделение/освобождение памяти и тяжелое использование CPU.
dadv dadv 25.01.202003:58 ответить ссылка 0.0
Ну так память ты выделяешь через CLR => CLR осведомлена о каждом твоем шаге и может спокойно инициировать сборку мусора.
Если конечно ты не создаешь системные хендлы о которых ничего неизвестно сборщику мусора.
На практике не имеет значение, что теоретически может инициировать CLR. На практике имеет значение, как конкретно достигается то, что GC успевает освобождать неиспользуемую уже память быстрее, чем она кончается физическая память. Потому что если у GC нет возможности успевать это делать, то вся идея GC идёт лесом - ровно с тем же успехом можно вообще ничего не высвобождать и надеяться, что оперативки хватит до завершения работы процесса, а там уж операционка всё приберёт.
dadv dadv 25.01.202010:56 ответить ссылка -0.3
> Я могу придумать 101 вопрос по сборщику мусора

А ответить? :-) Например, чем обеспечивается запуск GC *до* того момента, как память подходит к концу?
dadv dadv 25.01.202004:11 ответить ссылка 0.4
за GC зарплатой отвечал =)
koka koka 25.01.202004:17 ответить ссылка 0.1
OK, повторю вопрос тебе: чем обеспечивается одновременно быстрая работа процедуры выделения памяти и то, что GC успевает освобождать неиспользуемую память быстрее, чем она переполняет физическую RAM?
dadv dadv 25.01.202011:33 ответить ссылка 0.0
Triggering a GC when appropriate: The allocator triggers a GC when the allocation budget (a threshold set by the collector) is exceeded or when the allocator can no longer allocate on a given segment.

Выделялка памяти в .NET мониторит положение дел и если все плохо, то инициирует сборку мусора.
Тем, что все твои NEW вызывают CLR, а она содержит некоторый регистр объектов => может перед выделением памяти попытаться сделать очистку. Если это не поможет, то приложение аварийно завершается.
Во-первых, нельзя делать очистку перед выделением памяти в синхронном режиме (с ожиданием, когда же GC провернётся), потому что проход по графу ссылок и вычистка операция дорогая (долгая), а выделение памяти должно выполняться быстро.

Во-вторых, аварийное завершение приложения из-за кривости GC абсолютно недопустимо и такой GC сразу идёт лесом вместе со всей системой разработки. И я не верю, что реальные системы так устроены.
dadv dadv 25.01.202011:01 ответить ссылка -1.2
ничо никому не "должно" выделяться быстро. особенно когда ты не дал софтине достаточно памяти и она затыкается в гц постоянно.
статистика же есть. знаем, сколько памяти всего, знаем, сколько свободно осталось, остальное - мумор + всё нужное - про это тоже догадываемся.
при невозможности выделить память возникает эксепшен, можно залогироваться, перед тем как помереть. это будет после попытки пошуршать гц и что-нибудь освободить.
villy villy 25.01.202012:57 ответить ссылка 0.5
> ничо никому не "должно" выделяться быстро

Именно что должно. Никакая реально используемая система управления памятью не вносит непрогнозируемых задержек на простом выделениях памяти, иначе её бы невозможно было использовать в реальных крупных приложениях.

А знать, сколько всего/сколько свободно осталось - совершенно недостаточно, потому как на самом деле надо знать, по какому адресу найдется свободный в данным момент блок нужного размера.

Про exception это тривиальности. Суть в том, что если система кидает exception в то время, когда реально в куче полно уже не нужного, но ещё не высвобожденного мусора, то это негодная система. И если она во время выделения памяти начинает заниматься обходом дерева и высвобождением структур, это тоже негодная система.
dadv dadv 25.01.202013:24 ответить ссылка -0.3
не у всех систем есть требования к реальному времени, скорее даже у большинства нет таких требований.
и плюс, пока ты своей софтине выдал адекватный объём оперы, оно так и работает - как почти rt.
проблемы начнутся только когда или мало выделенно, или память течет.
и даже в этом случае проблем меньше - помрёт тольео косячная программа, а не все подряд
villy villy 25.01.202013:34 ответить ссылка 0.3
> требования к реальному времени

Между настоящим realtime и требованиями к скорости управления памятью в "обычных" системах есть разница, и требования эти всё равно есть, типа O(1) или O(log(log n)) или в крайнем случае O(log n) для времени выделения памяти в зависимости от количества уже аллоцированных объектов. Никому не нужна система, которая тратит O(n) или даже O (n*log n) времени на это, чтобы обойти свои структуры и их перестроить.

> мало выделенно

А что значит "мало выделенно" и чем этот подход отличается от говно-привычки считать, что память бесконечна?
dadv dadv 25.01.202015:32 ответить ссылка 0.0
мне нужна такая система :)
потому что она большую часть времени выделяет память быстро. и только когда идёт бесконтрольный отжор памяти - всё равно есть косяк, всё равно надо чинить - тогда она тормозит

память не бесконечна - ок
а сколько ее?
640кб хватит всем?
я могу прогу запустить на тачке с гигом оперы, а могу с терабайтом.
настраивать ты всё равно будешь некий кусок, чонть типа размера кэшей, и плюс есть некий минимальный объём оперы, необходимый для нормальной работы, о котором тебе в мане тестировщик напишет.

на практике нет никакой разницы, отдаёшь ли ты память оси сразу понемногу, или большими кусками, или не отдаешь вообще, в случае когда ты ее сразу же попросишь назад.
если у тебя за каждым байтиком очередь желающих стоит его поюзать - всё колом встанет, какой-то процент оперы должен валяться без дела про запас, ничего с этим не поделаешь
villy villy 25.01.202015:52 ответить ссылка 0.3
> мне нужна такая система :) потому что она большую часть времени выделяет память быстро.

На самом деле нет - система, которая тратит O(n) времени на выделение памяти, не выделяет память быстро "большую часть времени". Ты вообще понимаешь обозначение O(n)? Это значит, что время на выделение памяти под очередной объект, прямо пропорционально количеству уже созданных объектов. Это охренительно медленно и пользователи не захотят пользоваться таким "продуктом". Как уже говорилось, быстро это когда время O(1) - не зависит от количества ранее созданных объектов, ну или хотя бы O(log(log n)), растёт очень слабо.

> минимальный объём оперы, необходимый для нормальной работы, о котором тебе в мане тестировщик напишет.

Не тестировщик должен определять этот размер памяти, а алгоритм и программист, а GC не должен ему мешать. Почему-то на системах без GC не требуются ключики -Xms/Xmx.
dadv dadv 25.01.202016:07 ответить ссылка -0.3
если мой О(n) - это миллисекунды, а твой о(лог) - секунды, то ебал я в рот такой логарифм.
это важно только в системах реального времени, где жесткие требования по гарантиям. но такие системы обычно писец тормозные, там методично кладут болт на среднюю скорость в угоду гарантиям скорости отклика.

доёб к Xms/Xmx не ясен
для прог без гц Xms=0, Xmx=всё что есть
villy villy 25.01.202016:17 ответить ссылка 0.0
> если мой О(n) - это миллисекунды, а твой о(лог) - секунды

на практике скорее наоборот
dadv dadv 25.01.202016:33 ответить ссылка 0.3
на практике обычно: с вероятностью 99.9999% будет быстро, в остальные разы медленно, в среднем ок, и всем норм
villy villy 25.01.202016:40 ответить ссылка 0.0
у ibm какой-то хитрый гц есть, который обязуется не превышать лимит по времени на остановку тредов. что кабы основное требование rt-систем
villy villy 25.01.202013:38 ответить ссылка 0.0
Все что IDisposable обертываешь в using. Говнокодил как-то на Delphi - так и не понял, как там нормально и красиво высвобождать ресурсы.
DutchL DutchL 25.01.202001:42 ответить ссылка 0.0
в шарпе вызывается сборщик мусора тогда когда есть подлючение к базам, с работой с директориями
короче все что не входит в работу компилятора и он не может никак повлиять на это
только тогда для этого надо вызвать 1 метод и забыть про него
а юзинг это сахар что бы вызвать сборщик мусора автоматом
using не вызывает сборщик мусора, он лишь позволяет закрыть неуправляемые ресурсы, которые могут потеряться при сборке мусора.
Например, у тебя какой-то хендл системы и GC про него ничего не знает. Так вот, Dispose и финализатор- это то место, где с ними можно разобраться.
В C# важно знать не сколько про поколения (за 10 лет работы ни разу не понадобилось на практике), сколько про деление GC на SOH и LOH. Про SOH обычно все все знают, но LOH тоже важно понимать.

https://www.codejourney.net/2018/09/net-internals-08-what-about-large-object-heap-loh/
Это если не работать с хайлоадом. Бо в нем ебли с гц и его тюнингом(как из кода, так и настройками) хватает.
Dispose к GC не имеет никакого отношения.
oloth oloth 25.01.202017:20 ответить ссылка 0.5
С точки зрения юзера, либо все GC жуткое говно, либо в природе практически не существует программистов, умеющих правильно писать на языках со встроенными GC. Потому что пухнет это говно ничуть не меньше, чем из-за тривиальных утечек в других продуктах, а частенько resident size именно для таких "продуктов" получается в разы толще.
dadv dadv 25.01.202001:51 ответить ссылка -1.9
Прикол в том, что если тех, у кого течет память с GC, посадить за языки без GC то у них прога ебанется ещё на старте, пожрав все ресурсы.
Т.е. как и всегда проблема не в технологии а в прокладке
Так это хорошо! Чем раньше всё наворачивается, тем больше шансы, что проблема будет отлажена ещё до релиза. Хуже всего это заметать проблемы под ковёр коллектором.
dadv dadv 25.01.202004:01 ответить ссылка -0.4
Ну так даже в системах с GC нужно следить за неуправляемыми ресурсами, так как GC ничего неизвестно о хендлах, которые ты запрашиваешь у ОС. Т.е пока ты юзаешь управляемые объекты, все ок, а когда тебе нужно через WinAPI какую-то штуку проделать, то будь добр не забыть вызвать функцию освобождения ресурсов.
Да причём тут внешние ресурсы, это всё тривиальности ты расписываешь. Я вообще не понимаю, как на практике GC может *эффективно* освобождать обычную память без постоянного таскания в своей требухе огромной кучи уже протухшего мусора и откуда берутся гарантии того, что память не кончится раньше, чем GC вообще получит возможность начать работу.
dadv dadv 25.01.202004:04 ответить ссылка -1.2
а такие гарантии разве есть в не-гц системах?
villy villy 25.01.202013:43 ответить ссылка 1.2
в при управлении памятью без GC у программиста есть *возможность* явно отдавать память куче, с тем чтобы при следующих выделениях она могла быть переиспользована сразу же, без запроса новой памяти у операционки
dadv dadv 25.01.202015:18 ответить ссылка -0.6
гарантий тоже никаких нет, память может закончиться внезапно что там, что там.
разница только в том, вся ли это память компа, или лимит, отданный виртуалке
villy villy 25.01.202015:26 ответить ссылка 0.8
Ты не понял, о чём речь. Для ясности, возьмём Perl - в нём нету tracing GC как в Java, но и нету явного управления памятью по типу malloc/free, и всё равно нет утечек. Объект высвобождается сразу как пропадает последняя ссылка на него (reference-counted GC), а проблема циклических ссылок решается при помощи "слабых ссылок" (weak references). И всё прекрасно.
dadv dadv 25.01.202015:48 ответить ссылка -0.3
всё прекрасно лол
ты наверн не в курсе,что RC - говно, сочетающее в себе плохую предсказуемость пауз как у гц, и геморрой освобождения сложных графов объектов, как при ручном менеджменте
villy villy 25.01.202015:56 ответить ссылка 0.8
Ну ты будешь мне рассказывать, программист на java, как сложно в perl освобождать графы объектов, ага.
dadv dadv 25.01.202016:08 ответить ссылка -0.3
ну похоже надо рассказать, раз ты какую-то дичь пишешь
villy villy 25.01.202016:10 ответить ссылка 0.5
плюс RC тормозит, тк на каждую операцию с памятью надо пойти куда-то и передернуть каунтер, то есть скорее всего сбросить кэши проца, а это пиздец
villy villy 25.01.202016:09 ответить ссылка 0.5
Передергивание каунтера не сбрасывает мегабайтные кеши процессора. А вот когда явовский GC начинает уплотнять объекты в памяти - вот тогда уж точно содержимое кешей всех уровней идёт далече.
dadv dadv 25.01.202016:27 ответить ссылка 0.0
В сравнении с тем же прикладным алгоритмом, но с ручным высвобождением памяти, когда у программиста есть контроль над кучей.

Разумеется, речь не идёт об идиотах, которые при любом раскладе раскидываются памятью, как бесконечным ресурсом.
dadv dadv 25.01.202004:06 ответить ссылка 0.4
а почему речь не идет об идиотах? их больше
ну и не всегда это просто глупость. у одного были резоны типа "ну ты ж ресурс, ты его и освобождай", а у другого "кроме тебя этот ресурс никому не нужен - ты его и освобождай"

"есть контроль" - это тока звучит красиво. в реальной большой проге большинству надо по рукам давать за попытки лезть, куда не надо, ограничивать этот самый контроль до минимума, иначе будет жопа
villy villy 25.01.202013:52 ответить ссылка 1.0
*ресурс выделил
villy villy 25.01.202013:53 ответить ссылка 0.4
> а почему речь не идет об идиотах? их больше

Идиотов всегда больше, это не аргумент для того, чтобы утверждать, что так и надо
dadv dadv 25.01.202015:20 ответить ссылка 0.4
> в реальной большой проге большинству

большинству реально больших прог нужен механизм, который бы обеспечивал, что пока программист делает всё правильно, то потребление памяти у проги не растёт на пустом месте из-за того, что GC не справляется
dadv dadv 25.01.202015:22 ответить ссылка 0.4
как гц может не справляться, если всё сделано правильно?
гц перестаёт справляться, когда выжрана большая часть памяти - а это явно не было запланировано. уже косяк.

ты в курсе, что, например, жабе ты на старте выделяешь лимит оперы? она может его сразу отъесть весь, а потом, по мере надобности, выделяет под свои объекты. ну на самом деле она чутка поумнее, и сразу всё не отъедает, и даже может вернуть часть памяти назад оси.
villy villy 25.01.202015:36 ответить ссылка 0.3
> как гц может не справляться, если всё сделано правильно?

А вот так. Ещё раз повторяю вопрос: чем обеспечивается, что одновременно и память выделяется быстро, и tracing GC как в Java вообще получит возможность начать работу до того, как память кончится?

> ты в курсе, что, например, жабе ты на старте выделяешь лимит оперы?

В курсе :-) -Djava.awt.headless=true -Xms1024m -Xmx1024m -XX:+UseConcMarkSweepGC
dadv dadv 25.01.202015:51 ответить ссылка -0.3
ifом обеспечивается. если не смогли выделить память по быстрому пути - идём по медленному
но еще раз: если до такого дошло, значит уже какая-то хуйня в проге. и решения 2: или выделяй больше оперы в следующий раз, или фикси свой говнокод. тюнингом гц это решается прям очень редко когда
villy villy 25.01.202016:01 ответить ссылка 0.3
Да на каком языке вы говорите?!
tema1322 tema1322 27.01.202016:16 ответить ссылка 0.1
господи, каменты божественны. напомнило времена, когда в интернет детей не пускали...
Maern Maern 27.01.202023:04 ответить ссылка -0.3
Только зарегистрированные и активированные пользователи могут добавлять комментарии.
Похожие темы

Похожие посты
One morning you wake up find out you have access to God’s developer console. What’s the first thing you do with this power?
Discussion
♦ 154 +	W 479	& Share
^ BEST COMMENTS ▼
I like forks • 5h
hehe3301 • 7h
sudo rm -rf oceans/*/contents/
*.plástic
sudo rm -rf people/*/*.cáncer sudo rm -rf v
подробнее»

it-юмор geek,Прикольные гаджеты. Научный, инженерный и айтишный юмор без перевода it humor geek it юмор

One morning you wake up find out you have access to God’s developer console. What’s the first thing you do with this power? Discussion ♦ 154 + W 479 & Share ^ BEST COMMENTS ▼ I like forks • 5h hehe3301 • 7h sudo rm -rf oceans/*/contents/ *.plástic sudo rm -rf people/*/*.cáncer sudo rm -rf v
¿i
OR IS IT TESTING ME?
Й