На днях решил проверить на какой программе будет падать сборщик мусора BlackBox. В итоге на одном сайте увидел ссылку на тест для языка D.
После трансляции на КП при запуске в BB 1.6 RC6 я получил долгожданный капкан, который сопровождался многочисленным открытием MessageBox с сообщением об ошибке и спустя некоторое время Windows убивала процесс сама.
Я хотел бы знать у всех ли срабатывает данная ошибка. У меня сработала в Windows XP с 2 GB + Windows 8 с 4 GB.
Для проверки нужно предварительно забить память ОС, иначе сборщик мусора можен не активизироваться. Откройте много разных программ, включая броузер с множеством закладок (ютюбом, допустим).
Скомпилируйте и запустите программу:
Код:
MODULE TestGCAlloc1;
(*
Benchmark on uniformly distributed, random large allocations.
Origin: https://github.com/D-Programming-Language/druntime/blob/master/benchmark/gcbench/rand_large.d
Copyright: Copyright David Simcha 2011 - 2011.
License: Boost License 1.0 (See accompanying file LICENSE or copy at http://www.boost.org/LICENSE_1_0.txt)
Authors: David Simcha
Contributors: Romiras 2013 (translated to Component Pascal + some modifications)
*)
IMPORT O := ObxRandom, Out;
CONST
nIter = 100;
minSize = 1024 * 1000H;
maxSize = 128 * minSize + 1;
TYPE
Item = POINTER TO ARRAY OF BYTE;
Array = ARRAY 10 OF Item;
VAR
array : Array;
item: Item;
PROCEDURE UnifomInt (a, b: INTEGER): INTEGER;
VAR r : REAL;
BEGIN
ASSERT(a < b, 22);
r := O.Uniform();
RETURN SHORT(ENTIER(a + r * (b - a)))
END UnifomInt;
PROCEDURE Do*;
VAR i, j: INTEGER;
BEGIN
FOR i := 1 TO nIter DO
FOR j := 0 TO LEN(Array) - 1 DO
NEW(item, UnifomInt(minSize, maxSize));
array[j] := item
END;
Out.String("Iteration "); Out.Int(i, 0); Out.Ln
END
END Do;
END TestGCAlloc1.
TestGCAlloc1.Do
Данная ошибка была исправлена пользователем luowy в списке рассылки Blackbox в сентябре 2012. Модуль с последними исправлениями в сборщике мусора находится
здесь