Released Page Object Graphs

Large sequential jobs can discard clean page-owned object graphs after each page while retaining enough source metadata to materialise the page again on demand

Release boundary

ReleaseLoadedPageObjectGraph frees the selected indirect page root and the directly owned nested objects beneath it

The traversal does not follow indirect links, so shared fonts, images, resource dictionaries, page-tree nodes, and other cross-page objects remain owned by the loaded document

Page-specific display-list and raster entries are evicted at the same boundary

Safety and retention

Dirty, must-write, active, or otherwise non-reloadable pages are retained and reported instead of being discarded

Direct file-backed page roots reload from their validated cross-reference offset, while compressed roots reload through the indexed object-stream member path

Stream-loaded or encrypted ordinary roots without an independently replayable source remain resident

Sequential processing

for PageIndex := 0 to PDF.LoadedPageCount - 1 do
begin
  ProcessLoadedPage(PDF, PageIndex);
  PDF.ReleaseLoadedPageObjectGraph(PageIndex);
end;

A 100,000-page regression fixture peaks at 69.3 MiB on Win32, shows no steady-state growth, and then rematerialises a released page with its original object number and page boxes

Concurrency

Loaded-document graph access remains caller-serialised

Do not release a page while another thread is rendering, inspecting, or mutating the same document instance

See also: ReleaseLoadedPageObjectGraph, GetLoadedPageObjectGraphReleaseStatistics, THPDFPageObjectGraphReleaseStatistics, Lazy Page-Tree Loading, Bounded Object-Stream Cache