(солнце) GC сканирует живые объекты.Предполагается, что в типичном времени выполнения Java-программ мертвых объектов гораздо больше, чем живых объектов.он помечает живые объекты и удаляет остальные.
Если вы кэшируете много объектов, все они являются живыми.и если у вас есть несколько ГБ таких объектов, GC будет тратить много времени на их тщетное сканирование.длинные GC-паузы могут парализовать ваше приложение.
кэширует что-то, просто чтобы сделать его без мусора, не помогает GC.
это не значит, что кэширование является неправильным.если у вас 15 ГБ памяти, а ваша база данных 10 ГБ, почему бы не кэшировать все в памяти, чтобы ответы быстро высвечивались.обратите внимание, что это для кэширования чего-то, что в противном случае было бы медленным для извлечения.
для предотвращения бесполезного сканирования GC кэша 10G, кэш должен находиться вне контроля GC.Например, используйте memcached, который находится в другом процессе и имеет собственный GC, оптимизированный для кэширования.
последняя новость - Terracotta's BigMemory, который представляет собой чисто Java-решение, которое выполняет аналогичные действия.
Примером локального пула потоков является прямой пул ByteBuffer от Sun. Когда мы вызываем
channel.read(byteBuffer)
, если byteBuffer не «прямой», «прямой» должен быть выделен под капотом, который используется дляПередача данных с ОС. В сетевом приложении такие распределения могут быть очень частыми, что кажется пустым, отбрасывать только что выделенное и немедленно выделять другое в следующем утверждении. Инженеры Sun, очевидно, не доверяют GCнастолько, создал поток локального пула "прямых" байтовых буферов.