[tbb-dev] Memory Allocators
Tom Ritter
tom at ritter.vg
Tue May 19 04:27:51 UTC 2015
Progress! Although I missed the meeting, sorry.
=========
Adding this patch:
https://bug1052573.bugzilla.mozilla.org/attachment.cgi?id=8573433 to
FF38 (plus enabling jemalloc3) means we have heap partitioning
functions available to both Firefox proper (I believe) and a replace
library.
I have successfully implemented a replace library that creates arenas
and mallocs things into them.
=========
Then I went and traced down how memory tags work. Bad news. As I
understand them, there's no real metadata about the tag available.
Rather different parts of the FF Codebase implement
nsIMemoryMultiReporter[0], which calls some functions, which
self-reports allocated data into buckets. For an example:
look at js/xpconnect/src/XPCJSRuntime.cpp
JSReporter::CollectReports calls (among other things) ReportZoneStats
ReportZoneStats reports the mallocHeapLatin1 member as the tag
"malloc-heap/latin1"
The mallocHeapLatin1 member is the number of bytes used for that type
of bucket, and is filled in js/src/vm/MemoryMetrics.cpp
Specifically, we track the memory as being "malloc-heap/latin1" when
we call StatsCellCallback, which is called by JS::CollectRuntimeStats
My point is: at allocation time, I don't see any way to use these
memory tags to direct allocation.
=========
Future directions:
-----------------
Find the allocations of the most dangerous JS types (strings, arrays),
and switch their allocations over to partitions. Just patch the code
ourselves. Can we put our patches behind a preference? ...Probably...
I think? Assuming we're using jemalloc3 (compiled in, no preference,
just always on) I don't think allocating without or with arenas or
switching in the middle of things is a problem. Obviously we'd test
but, it seems like it would work.
I don't even think it matters for things like reallocs. Specifically:
http://www.canonware.com/download/jemalloc/jemalloc-latest/doc/jemalloc.html
Look for the non-standard APIs that accept a flags argument. You use
the macro MALLOCX_ARENA(int) as a flag to allocate in a specific
arena.
- The Non-Standard API does not define a free() that requires you to
pass in the arena it was allocated to. You do not need to preserve
that information anywhere, you can just free a pointer.
- The rallocx() and xallocx() functions does not say you must
reallocate in the same arena you allocated in
-----------------
Write a replace library that randomizes the arena based on the
callstack. (Yep, I'm still pushing this. =P)
-----------------
When there's a ESR38 TBB I'll start working off that instead of mozilla-release
-tom
[0] https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XPCOM/Reference/Interface/nsIMemoryMultiReporter
More information about the tbb-dev
mailing list