Pull to refresh

Comments 15

Просто выделить память для создания этих исключений в момент когда они уже произошли, мягко говоря сложновато.
Автор вроде все объяснил в предпоследнем абзаце.Зачем париться с резервированием памяти, когда можно заранее подготовить несколько объектов? А если StackOverflow будет, как создавать? Абсолютно нормальное поведение, хотя весь полезный смысл статьи ложится в 2-3 предложения.
Я просто, в простой и доступной форме попытался выразить ответ на заданный автором вопрос в начале статьи.

P.S.
Сам пост я внимательно читал.
Ни в коей мере не хотел вас обидеть, извиняюсь, если что-то не так.
На последнем скриншоте видно целых 6 исключений. Это ж ни в какие ворота!
System.Exception выделяется потому, что является предком для всех остальных, а ThreadAbortException две штуки — два потока в приложении?
На самом деле потоков куда больше
1. Main Thread
2. GC Thread
3. Finalizer Thread IIRC

ах да, если еще не вырубить Visual Studio Hosting Process еще +1
В своем исключительно однопоточном простом приложении сейчас насчитал четыре потока. Сборка debug, но vshost не запущен.

Был уверен, что GC выполняется в пуле потоков фреймворка…
В вашем случае 4 потока это: Main (managed), поток для запуска clr (unmanaged), finalizer поток (managed) и debug (unmanaged)
CLR всегда пробрасывает ThreadAbortException при закрытии потока
Андерс Хейлсберг, один из создателей C#, использовал этот приём ещё в Delphi, который он тоже разрабатывал.

Возможно, в Java (Hotspot) OutOfMemoryError не создаётся при старте (во всяком случае, breakpoint-ы на конструторах не срабатывают).
Чтобы использовать SOS.dll совсем необязательно ставить WinDBG (штука сама по себе полезная, но не очень часто), можно просто нажать паузу во время отладки в студии и в Immediate window ввести те же команды.
Это обычная практика. К примеру, в стандартном RTL msvc — при нехватке памяти кидается std::bad_alloc, который не выделяется в куче:

            if (_callnewh(size) == 0)
                {       // report no memory
                static const std::bad_alloc nomem;
                _RAISE(nomem);
                }

Sign up to leave a comment.

Articles