JVM类加载机制-类加载的过程(JDK源码)

1,973 阅读2分钟

「时光不负,创作不停,本文正在参加2021年终总结征文大赛

引言

  • 勤勤恳恳又写了一年的代码,在今年的年终来临之际,我想开始在掘金记录自己工作生活过程中的一些事。想了很久不知道从哪里入手,最后决定先从基本的开始吧。
  • 这篇是我个人对类加载过程的一些理解,有不到位的地方欢迎指出,谢谢~🙏

java虚拟机

  • java虚拟机(Java Virtual Machine)简称JVM由c++语言实现。
  • 在多系统平台上运行时(linux、windows、macOs),可以理解成用c++在这些系统上打开了一个jvm应用程序,用来运行java程序,因为java程序在JVM上运行,使得java不依赖于平台的。
  • 类似你有一个QQ账号,可以在不同的电脑上通过QQ软件登录。QQ账号就好比java程序,QQ软件就类似于JVM。

java项目启动到加载一个类的过程

  • 类的加载,主要由ClassLoad类和Launcher类实现。先来看Launcher代码: image.png image.png

再看ClassLoad代码: image.png

  • 在initSystemClassLoader时,获取运行类自己的加载器ClassLoad,默认AppClassLoader。或许有同学会问,Launcher构造函数中,不是还有一个ExtClassLoader吗,为啥默认不是它。这里就涉及到著名的双亲委派机制,这个后面肯定会提及的。
  • 接着看类如何加载。在ClassLoad中,主要看loadClass方法和findClass方法。loadClass代码:

image.png

  • 同步代码块synchronized(getClassLoadingLock(name))保证要加载的运行类不重复加载。 如果有父类加载器,就用父类加载器加载,否则就用引来类加载器加载。(就是双亲委派机制)

image.png

  • 可以看到,findBootstrapClass用native修饰,是底层使用c++实现的

image.png

  • 类加载完成后,JVM就会从main入口执行。直至程序结束,销毁JVM。

流程图如下:

image.png