Skip to main content

Notice: This Wiki is now read only and edits are no longer possible. Please see: for the plan.

Jump to: navigation, search



Memory Analyzer uses several indexes to enable access to different parts of the snapshot.

IntToLong - object ID to object address
object ID to class ID
array object ID (or other non-fixed size object) to encoded size (32-bits)
object ID to list of object IDs
object ID to list of object IDs
Dominated: object id to N dominated object ids
object ID to long
Dominator of: object id to the id of its dominator
cache of size of class, classloader (read/write)


For an index file like O2CLASS, the file is stored as many ArrayIntCompressed followed by an index: IntIndexReader There is a special adjustment to cope with >2^31 entries files as that can be needed for 1 to N files. On reading there is a SoftReference cache of those ArrayIntCompressed pages. The data is read using a SimpleBufferedRandomAccessInputStream which just has local buffer.


LongIndexReader is similar (without the adjustment for 2^31 entries)


PositionIndexReader is similar (without the adjustment for 2^31 entries)

1 to N reader

IntIndex1NReader Has two parts, a body and an header, and a final long of the position of the split in the file. For an input, use the header to find the position of the start in the body and the header via (index+1) to find the position of the next entry. Read data between the two from the body

Random Access File caching

HPROF random access to GZIP compressed files to read fields and array contents

  • org.eclipse.mat.hprof.DefaultPositionInputStream
      • HashMapLongObject
        • [*N] page
          • [*N] SoftReference
            • buffer byte[512]
      • org.eclipse.mat.hprof.CompressedRandomAccessFile
        • org.eclipse.mat.hprof.SeekableStream
          • [*N} org.eclipse.mat.hprof.SeekableStream$PosStream
            • SoftReference
              • org.eclipse.mat.hprof.GZIPInputStream2
                • io.nayuki.deflate.InflaterInputStream
                  • inputBuffer byte[16384]
                  • dictionary byte[32768]

Back to the top