The Java standard/system libraries (java.*
, javax.*
, etc.) are stored in lib/rt.jar
inside each JRE distribution.
Say I have an application that I have compiled and jar
red into myapp.jar
. This JAR only contains my app's class files, and merely references system classes like System
, File
, Runtime
, Thread
, String
, Boolean
, etc.
So when I run my app, say via java -jar myapp.jar
, the JVM is obviously doing so last minute linking (or something) where it is executing the bytecode of my class files (inside myapp.jar
) and then "jumping" into lib/rt.jar
to run bytecode located there. I would imagine the process is the same if myapp.jar
depends on other JARs provided on the runtime classpath
.
My question is: what is this "linking" process called, and how does it essentially work?
That rt.jar
is part of the bootstrap classpath, a parent of the usual classpath you already know and that you configure when you use the -cp
option (you can actually change the bootstrap classpath too using the -Xbootclasspath
option to load, for example, a custom Java runtime).
See Oracle documentation for a detailed description of how classes are searched/loaded from the system defined classpaths hierarchy.
Now, the additional questions you seemed to have:
How is the archive actually found?
It's simply hardcoded. If the java
binary is located in <common_root>/bin/java
, rt.jar will be searched in <common_root>/lib/rt.jar
.
How is the "linking" performed?
On the JVM there is no actual linking, the classes are dynamically loaded using a mechanism based on a hierarchy of ClassLoader that are the software components that actually do the class file loading/parsing. When you try to load a class, the search starts from the application-facing default classloader(or a child classloader if you have defined one) and if the class cannot be loaded the loading attempt is repeated with a parent classloader until the bootstrap classloader is reached.
If the class is found, the .class
file is loaded, parsed and internal structures representing the class and its data are created.Once the class is loaded a new instance can be created.
If instead, even the boot classloader could not load your class a user-visible ClassNotFoundException
is thrown.