Ограниченный кэш object stream
Загруженные cross-reference stream могут индексировать сжатые члены, не удерживая в памяти каждый декодированный контейнер /Type /ObjStm
Лимит байтов и вытеснение
ObjectStreamCacheMaxBytes задаёт бюджет на декодированные контейнеры и по умолчанию равен 64 MiB
Когда вставка переходит бюджет, неактивные контейнеры вытесняются по одному в порядке least recently used, а контейнер, обслуживающий текущий view парсера, остаётся защищённым до закрытия этого view
Поэтому одиночный контейнер больше лимита может находиться в памяти во время своего активного разбора, но удерживаемые байты сразу после этого сходятся к настроенному лимиту
Перезагружаемые члены
Вытеснение сохраняет индексы номеров объектов и валидированные смещения членов
Последующее разрешение члена заново открывает исходный container stream, повторно применяет дешифрование документа и stream filter и разбирает запрошенного члена через уже существующий zero-copy slice view
Выставьте лимит в ноль, чтобы не удерживать декодированные контейнеры между разрешениями членов
Телеметрия
GetLoadedObjectStreamCacheInfo сообщает настроенный лимит, текущие и пиковые декодированные байты, счётчики вытеснений и перезагрузок, попадания и промахи кэша членов и активность zero-copy slice
См. также: ObjectStreamCacheMaxBytes, GetLoadedObjectStreamCacheInfo, Zero-copy срезы object stream