> ### Motivation and proposal > Hi, heap dump brings about pauses for application's execution(STW), this is a > well-known pain. JDK-8252842 have added parallel support to heapdump in an > attempt to alleviate this issue. However, all concurrent threads > competitively write heap data to the same file, and more memory is required > to maintain the concurrent buffer queue. In experiments, we did not feel a > significant performance improvement from that. > > The minor-pause solution, which is presented in this PR, is a two-phase > segmented heap dump: > > - Phase 1(STW): Concurrent threads directly write data to multiple heap files. > - Phase 2(Non-STW): Merge multiple heap files into one complete heap dump > file. This process can happen outside safepoint. > > Now concurrent worker threads are not required to maintain a buffer queue, > which would result in more memory overhead, nor do they need to compete for > locks. The changes in the overall design are as follows: > >  > <p align="center">Fig1. Before</p> > >  > <p align="center">Fig2. After this patch</p> > > ### Performance evaluation > | memory | numOfThread | CompressionMode | STW | Total | > | -------| ----------- | --------------- | --- | ---- | > | 8g | 1 T | N | 15.612 | 15.612 | > | 8g | 32 T | N | 2.561725 | 14.498 | > | 8g | 32 T | C1 | 2.3084878 | 14.198 | > | 8g | 32 T | C2 | 10.9355128 | 21.882 | > | 8g | 96 T | N | 2.6790452 | 14.012 | > | 8g | 96 T | C1 | 2.3044796 | 3.589 | > | 8g | 96 T | C2 | 9.7585151 | 20.219 | > | 16g | 1 T | N | 26.278 | 26.278 | > | 16g | 32 T | N | 5.231374 | 26.417 | > | 16g | 32 T | C1 | 5.6946983 | 6.538 | > | 16g | 32 T | C2 | 21.8211105 | 41.133 | > | 16g | 96 T | N | 6.2445556 | 27.141 | > | 16g | 96 T | C1 | 4.6007096 | 6.259 | > | 16g | 96 T | C2 | 19.2965783 | 39.007 | > | 32g | 1 T | N | 48.149 | 48.149 | > | 32g | 32 T | N | 10.7734677 | 61.643 | > | 32g | 32 T | C1 | 10.1642097 | 10.903 | > | 32g | 32 T | C2 | 43.8407607 | 88.152 | > | 32g | 96 T | N | 13.1522042 | 61.432 | > | 32g | 96 T | C1 | 9.0954641 | 9.885 | > | 32g | 96 T | C2 | 38.9900931 | 80.574 | > | 64g | 1 T | N | 100.583 | 100.583 | > | 64g | 32 T | N | 20.9233744 | 134.701 | > | 64g | 32 T | C1 | 18.5023784 | 19.358 | > | 64g | 32 T | C2 | 86.4748377 | 172.707 | > | 64g | 96 T | N | 26.7374116 | 126.08 | > | 64g | 96 T | C1 | 16.8101551 | 17.938 | > | 64g | 96 T | C2 | 80.1626621 | 169.003 | > | 128g | 1 T | ...
Yi Yang has updated the pull request incrementally with one additional commit since the last revision: test failure on Windows ------------- Changes: - all: https://git.openjdk.org/jdk/pull/13667/files - new: https://git.openjdk.org/jdk/pull/13667/files/6da71527..469be625 Webrevs: - full: https://webrevs.openjdk.org/?repo=jdk&pr=13667&range=19 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=13667&range=18-19 Stats: 3 lines in 1 file changed: 1 ins; 0 del; 2 mod Patch: https://git.openjdk.org/jdk/pull/13667.diff Fetch: git fetch https://git.openjdk.org/jdk.git pull/13667/head:pull/13667 PR: https://git.openjdk.org/jdk/pull/13667