All infos - Garbage Collector: использование и результат работы методов сжатия памяти и класса HandleCollector
07
авг

Garbage Collector: использование и результат работы методов сжатия памяти и класса HandleCollector

Следующий код иллюстрирует использование и результат работы методов сжатия памяти и класса HandleCollector:

static void Main()
        {
            MemoryPressureDemo(0); // 0 вызывает нечастую уборку мусора
            MemoryPressureDemo(10 * 1024 * 1024); // 10 Mбайт вызывают частую
            // уборку мусора
            HandleCollectorDemo();
            Console.Read();
        }

        private static void MemoryPressureDemo(Int32 size)
        {
            Console.WriteLine();
            Console.WriteLine("MemoryPressureDemo, size={0}", size);
            // Создание набора объектов с указанием их логического размера
            for (Int32 count = 0; count < 15; count++)
            {
                new BigNativeResource(size);
            }

            // В демонстрационных целях очищаем все
            GC.Collect();
        }

        private sealed class BigNativeResource
        {
            private Int32 m_size;

            public BigNativeResource(Int32 size)
            {
                m_size = size;
                // Пусть уборщик думает, что объект занимает больше памяти
                if (m_size > 0) GC.AddMemoryPressure(m_size);
                Console.WriteLine("BigNativeResource create.");
            }

            ~BigNativeResource()
            {
                // Пусть уборщик думает, что объект освободил больше памяти
                if (m_size > 0) GC.RemoveMemoryPressure(m_size);
                Console.WriteLine("BigNativeResource destroy.");
            }
        }

        private static void HandleCollectorDemo()
        {
            Console.WriteLine();
            Console.WriteLine("HandleCollectorDemo");
            for (Int32 count = 0; count < 10; count++) new LimitedResource();
            // В демонстрационных целях очищаем все
            GC.Collect();
        }

        private sealed class LimitedResource
        {
            // Создаем объект HandleCollector и передаем ему указание
            // перейти к очистке,когда в куче появится два или более
            // объекта LimitedResource
            private static HandleCollector s_hc =
                new HandleCollector("LimitedResource", 2);

            public LimitedResource()
            {
                // Сообщаем HandleCollector, что в кучу добавлен еще
                // один объект LimitedResource
                s_hc.Add();
                Console.WriteLine("LimitedResource create. Count={0}", s_hc.Count);
            }

            ~LimitedResource()
            {
                // Сообщаем HandleCollector, что один объект LimitedResource
                // удален из кучи
                s_hc.Remove();
                Console.WriteLine("LimitedResource destroy. Count={0}", s_hc.Count);
            }

Share this post