RFR (L) 8028541: Native Memory Tracking enhancement
Zhengyu Gu
zhengyu.gu at oracle.com
Thu May 22 19:19:14 UTC 2014
This is significant rework of native memory tracking introduced in
earlier releases.
The goal of this enhancement is to improve scalability, from both
tracking memory and CPU usage perspectives, so it can scale well with
increased memory allocation in large applications.
The enhancement is mainly focused on malloc memory tracking, whose
activities are several magnitude higher than virtual memory, and was the
main bottleneck in early implementation.
Instead of using book keeping records for tracking malloc activities,
new implementation co-locates tracking data along side with user data by
using a prefixed header. The header size is 8 bytes on 32-bit systems
and 16 bytes on 64-bit systems, which ensure that user data also align
properly.
Virtual memory tracking still uses book keeping records, and
ThreadCritical lock is always acquired to alter the records and related
data structures.
Summary tracking data is maintained in static data structures, via
atomic operations. Malloc detail tracking call stacks are maintained in
a lock free hashtable.
The key improvements:
1. Up-to-date tracking report.
2. Detail tracking now shows multiple call frames. Number of frames
is compilation time decision, currently default to 4.
3. Malloc tracking is lock free.
4. Tracking summary is reported in hs_err file when native memory
tracking is enabled.
5. Query is faster, uses little memory and need a very little process.
The drawback is that, malloc tracking header is always needed if native
memory tracking has ever been enabled, even after tracking is shutdown.
Impacts:
The most noticeable impact for JVM developers, is that Arena now also
take memory type as constructor parameter, besides the new operators.
Arena* a = new (mtCode) Arena() => Arena* a = new (mtCode)
Arena(mtCode)
The webrev shows modification of about 60 files, but most of them are
due to tracking API changes, mainly due to tracking stack, now, is an
object, vs. a single pc.
The most important files for this implementations are:
memTracker.hpp/cpp
mallocTracker.hpp/cpp and mallocTracker.inline.hpp
virtualMemoryTracker.hpp/cpp
mallocSiteTable.hpp/cpp
allocationSite.hpp
nativeCallStack.hpp/cpp
linkedlist.hpp
Tests:
- JPRT
- NMT test suite
- vm.quick.testlist
- Kitchensink stability test for 16+ days
- FMW
Bug: https://bugs.openjdk.java.net/browse/JDK-8028541
Webrev: http://cr.openjdk.java.net/~zgu/8028541/webrev.00/
Thanks,
-Zhengyu
More information about the hotspot-dev
mailing list