Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Speedup max direct memory estimation via Unsafe #13643

Merged
merged 2 commits into from Oct 2, 2023

Conversation

franz1981
Copy link
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
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
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
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
@geoand
Copy link
Contributor

geoand commented Sep 28, 2023

Thanks for this @franz1981!

@franz1981
Copy link
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
14 checks passed
@normanmaurer
Copy link
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.

None yet

3 participants