(ВС) GC сканирует живые объекты. предполагается, что существуют пути более мертвых объектов, чем живые объекты в типичной исполняемой программе Java-программы. он знаменует живые объекты и избавляет остальных.
Если вы храните много объектов, все они живут. и если у вас есть несколько ГБ таких объектов, GC собирается тратить много времени на их сканирование напрасно. длинные паузы GC могут парализовать ваше приложение.
кеш-то, что-то, чтобы сделать его не мусором, не помогает GC.
Это не значит, что кеширование неверно. если у вас есть память 15G, а ваша база данных - 10G, почему бы не кэшировать все в памяти, поэтому ответы быстро освещаются. обратите внимание, что это кэширование чего-то, что в противном случае было бы медленным для извлечения.
Чтобы предотвратить бесплодное сканирование кеша 10G, кеш должен находиться вне контроля GC. Например, используйте «memcached», который живет в другом процессе и имеет свой собственный оптимизированный для кеша GC.
последние новости - это BigMemory из Terracotta, которая представляет собой чистое Java-решение, которое делает подобное.
пример локального пула потоков - это прямой пул ByteBuffer от солнца. когда мы называем
channel.read(byteBuffer)
если ByteBuffer не «прямой», «прямой» один должен быть выделен под капотом, используемый для передачи данных с ОС. в сетевом приложении такие распределения могут быть очень частыми, кажется, что это отходы, чтобы отбросить только что выделенное и немедленно выделить другое в следующем утверждении. инженеры Sun, по-видимому, не очень доверяют GC, создали поток локального пула «прямых» ByteBuffers.
Обратите внимание, что (в зависимости от реализации JVM) не каждый объект попадает в кучу (где потребуется сбор мусора); при правильных условиях они могут оказаться в стеке (см. Анализ Escape). – McDowell
@McDowell, я определенно хотел бы увидеть Escape Analysis, но до сих пор в моих тестах (Hotspot 1.6) это только кажется перспективным в микро-тестах. –
Вы получите ответы, которые гораздо полезнее, если вы опишете свою среду и текущую проблему, а не ваш подход к решению этой проблемы. Ваш комментарий о выбросах GC указывает на то, что вы используете огромное количество объектов с длительным сроком службы или огромными объектами. В любом случае пул в потоке, вероятно, является неправильным решением. – Anon