「时光不负,创作不停,本文正在参加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代码:
再看ClassLoad代码:
- 在initSystemClassLoader时,获取运行类自己的加载器ClassLoad,默认AppClassLoader。或许有同学会问,Launcher构造函数中,不是还有一个ExtClassLoader吗,为啥默认不是它。这里就涉及到著名的双亲委派机制,这个后面肯定会提及的。
- 接着看类如何加载。在ClassLoad中,主要看loadClass方法和findClass方法。loadClass代码:
- 同步代码块synchronized(getClassLoadingLock(name))保证要加载的运行类不重复加载。 如果有父类加载器,就用父类加载器加载,否则就用引来类加载器加载。(就是双亲委派机制)
- 可以看到,findBootstrapClass用native修饰,是底层使用c++实现的
- 类加载完成后,JVM就会从main入口执行。直至程序结束,销毁JVM。