Skip to content

Speedup max direct memory estimation via Unsafe#13643

Merged
normanmaurer merged 2 commits intonetty:4.1from
franz1981:max_direct_memory_speedup
Oct 2, 2023
Merged

Speedup max direct memory estimation via Unsafe#13643
normanmaurer merged 2 commits intonetty:4.1from
franz1981:max_direct_memory_speedup

Conversation

@franz1981
Copy link
Copy Markdown
Contributor

Motivation:

PlatformDependent::estimateMaxDirectMemory reflectevly allocates MX Beans to detect JVM's arg MaxDirectMemory (often failing to find any, because unconfigured).

Modifications:

Allow unsafe to find Bits's max memory static field and use it as a fast path to detect the same direct memory limits used by the JVM runtime

Result:

Faster and less memory hungry (in term of mallocs) startup

@franz1981
Copy link
Copy Markdown
Contributor Author

FYI this is the malloc flamegraph from a Quarkus's startup, for the Netty's PlatformDependent static init:

image

about half of the malloc events are due to allocating the MX beans (for no reasons, most of the time!).

@normanmaurer
Copy link
Copy Markdown
Member

normanmaurer commented Sep 28, 2023

@franz1981 honestly I think the bigger advantage is that this will work even if Reflection is not possible

@franz1981
Copy link
Copy Markdown
Contributor Author

@normanmaurer

Yep, that's indeed the other "good" thing, although i don't feel well using Unsafe again

Motivation:

PlatformDependent::estimateMaxDirectMemory reflectevly allocates MX Beans to
detect JVM's arg MaxDirectMemory (often failing to find any, because unconfigured).

Modifications:

Allow unsafe to find Bits's max memory static field and use it as a fast path to detect
the same direct memory limits used by the JVM runtime

Result:

Faster and less memory hungry (in term of mallocs) startup
@franz1981 franz1981 force-pushed the max_direct_memory_speedup branch from 43d5641 to 13d827b Compare September 28, 2023 12:04
@geoand
Copy link
Copy Markdown
Contributor

geoand commented Sep 28, 2023

Thanks for this @franz1981!

@franz1981
Copy link
Copy Markdown
Contributor Author

franz1981 commented Sep 28, 2023

@normanmaurer
i see that

private static final Pattern MAX_DIRECT_MEMORY_SIZE_ARG_PATTERN = Pattern.compile(
            "\\s*-XX:MaxDirectMemorySize\\s*=\\s*([0-9]+)\\s*([kKmMgG]?)\\s*$"); 

is not really needed anymore and I can just skip allocating it, in case we have our fast-path satisfied, saving both time and some useless allocation/memory footprint, wdyt?

@normanmaurer normanmaurer merged commit 5db037b into netty:4.1 Oct 2, 2023
@normanmaurer
Copy link
Copy Markdown
Member

@franz1981 can you please port to main as well ?

@normanmaurer normanmaurer added this to the 4.1.100.Final milestone Oct 2, 2023
normanmaurer pushed a commit that referenced this pull request Oct 11, 2023
Motivation:

PlatformDependent::estimateMaxDirectMemory reflectevly allocates MX
Beans to detect JVM's arg MaxDirectMemory (often failing to find any,
because unconfigured).

Modifications:

Allow unsafe to find Bits's max memory static field and use it as a fast
path to detect the same direct memory limits used by the JVM runtime

Result:

Faster and less memory hungry (in term of mallocs) startup

Porting of #13643
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants