Демонстрация работы многопоточного сборщика мусора j |
#include <iostream> #include <new> #include "gcthrd.h" using namespace std; H простой класс для тестирования типа GCPtr. class LoadTest { int a, republic: double n[100000]; // просто забрать память double val; LoadTest() { a = b = 0; } LoadTest (int x, int y) { a = x; b = y; . val = 0.0; } friend ostream &operator« (ostream &strm, LoadTest &obj); }; // Создает вставку (inserter) в поток вывода для LoadTest. ostream &operator« (ostream &strm, LoadTest &obj) { strm « "(" « obj.a « " " « obj.b « ")"; return strm; } int mainO { GCPtr<LoadTest> mp; int i; for(i = 1; i < 2000; i++) { try { mp = new LoadTest(i, i); if(!(i%100)) cout « "gclist contains " « mp.gclistSizeO « " entries.\n"; } catch(bad_alloc xa) { // У большинства пользователей это исключение // никогда не возникнет. cout « "Last object: " « *mp « endl; cout « "Length of gclist: " « mp.gclistSizeO « endl; } } return 0; } Далее приводится результат прогона программы (конечно, ваш вывод может отличаться). Этот вывод программы получен при включенном макросе DISPLAY в файле gcthrd.h. Garbage collection started, gclist contains 42 entries, gclist contains 35 entries, gclist contains 29 entries, gclist contains 22 entries, gclist contains 18 entries, gclist contains 11 entries, gclist contains 4 entries, gclist contains 51 entries, gclist contains 47 entries. • gclist contains 40 entries, gclist contains 33 entries.-gclist contains 26 entries, gclist contains 19 entries, gclist contains 15 entries, gclist contains 10 entries, gclist contains 3 entries, gclist contains 53 entries, gclist contains 46 entries, gclist contains 42 entries. Before collecting for shutdown О for class LoadTest After collecting for shutdown() for class LoadTest Как видите, поскольку функция collect о выполняется в фоновом режиме, список gclist никогда не становится слишком длинным, даже если тысячи объектов размещаются и теряются в памяти.
|