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