RFR: 8292989: Avoid dynamic memory in AsyncLogWriter [v7]
Xin Liu
xliu at openjdk.org
Sun Sep 11 21:05:44 UTC 2022
> Current implementation of AsyncLogWriter uses dynamic memory. There are 2 sources.
>
> 1. Overhead of pointer-based linked-list.
> 2. strdup of message contents
>
> This implementation has impact on glibc/malloc. If allocation of logsites interleave with other allocation, it's hard to clean up all glibc arenas. This worsens fragmentation issue.
>
> In this PR, we replace linked-list with `2 pre-allocated raw buffers`. AsyncLogWriter appends payload AsyncLogMessage to the serving buffer and avoids all dynamic allocation. Please note this effort won't eliminate mutex lock. We use ping-pong buffers to guarantee AsyncLogWriter is still non-blocking. A buffer serves as a FIFO queue like before.
>
> In addition, AsyncLogWriter doesn't enqueue meta messages anymore when it needs to report the number of discarded messages. This is archived using a temporary hashtable called `snapshot`. It copies the working hashtable with the protection of lock and reset it. After writing all regular messages, AsyncLogWriter writes meta messages from snapshot.
Xin Liu has updated the pull request incrementally with one additional commit since the last revision:
add an assert for null messages.
This patch changed the behehavior of Buffer. Enqueuing a null
message is not allowed and it will trigger an assertion in debug build.
-------------
Changes:
- all: https://git.openjdk.org/jdk/pull/10092/files
- new: https://git.openjdk.org/jdk/pull/10092/files/6b16302f..7cb4398d
Webrevs:
- full: https://webrevs.openjdk.org/?repo=jdk&pr=10092&range=06
- incr: https://webrevs.openjdk.org/?repo=jdk&pr=10092&range=05-06
Stats: 2 lines in 2 files changed: 0 ins; 0 del; 2 mod
Patch: https://git.openjdk.org/jdk/pull/10092.diff
Fetch: git fetch https://git.openjdk.org/jdk pull/10092/head:pull/10092
PR: https://git.openjdk.org/jdk/pull/10092
More information about the hotspot-runtime-dev
mailing list