The JVM does not load all classes in the classpath.
It only loads the ones it needs. What triggers the JVM to load a particular #Java class?
Then answer might surprise you.
Consider the code below. What does it print?
Let's show the output and explain why. 🧵
Answer:
Class A, C and D are loaded.
Class B, E and F aren't.
Class F is never used, so it obviously isn't loaded.
Notice that MyBean contains fields of type B (static) and type E (non-static), but the B and E classes aren't loaded, because no instances are created.
A Java class is loaded in OpenJDK just in time: when an instance is created (with "new" or reflection) or a static member (field or method) is accessed.
If a class can't be loaded (for example if the compilation and runtime classpaths differ), a NoClassDefFoundError is thrown.
This behavior allows for <optional>true</optional> dependencies in #Maven (and #Gradle):
If A depends on B and B optionally depends on C, then A won't get C on the runtime classpath by default, but it can still use the functionality of B that doesn't rely on C.
• • •
Missing some Tweet in this thread? You can try to
force a refresh
You can probably optimize your @Java programs to run 2-10x faster, by focusing on the bottlenecks.
Those bottlenecks are not where you think they are.
Use free tools such as async-profiler, VisualVM, JFR and vmstat to find them.
Let me show you how. 🧵
Create a main() Java application that runs the bulk of your code on a seriously sized dataset for at least a minute.
Run async-profiler and Java Flight Recorder (JFR) on that, either from the command line (free) or through @intellijidea Ultimate (paid) as shown below.
1) Async-profiler outputs a flamegraph to show the relative CPU time taken by each method (including methods it calls).
Slow methods stick out like a soar thumb, even if they loop (unlike in other visualizations).