1、 JVM架构图
2、类加载器
类装载器ClassLoader是负责加载class的文件的,将class文件字节码加载到内存中,并将这些内容转换成方法区的运行时数据结构。classLoader只负责文件的加载,至于它是否可运行,则由执行引擎Eception Engine决定。
这里要区分一下class和Class,小写的class是指编译Java代码后生成的以 .class为后缀名的字节码文件。而大写的Class,是JDK提供的java.lang.class,可以理解的为封装类的模板。多用于反射场景,例如JDBC的加载驱动,Class.forName("com.mysql.jdbc.Driver");
接下来观察下图,Car.class字节码文件被classLoader类装载器加载并初始化,在方法区中生成一个Car class的类模板,而我们平时用到的实例化,就是在这个类模板的基础上,形成了一个个的实例,即car1,car2,反过来讲我们可以对某个具体的实例进行getClass操作,就可以得到该实例的类模板,即Car Class。再接着我们对这个类模板进行getClassLoader操作,就可以得到这个类模板由哪个类装载器进行加载的。
扩展一下 :JVM并不仅仅只是通过检查文件后缀名是.class来判断是否加载,最主要是通过class文件中特定的文件标示,即下图的text.class文件中的cafe babe
下边第一个得到是 c++语言写的(启动类加载器 Bootstrap)
第二个得到的是扩展类加载器(Extension )
第三个是应用程序类加载器 也叫系统类加载器
这里需要掌握小维度的点
2.1 有哪几种类加载器 3种类加载器
2.2 双亲委派 我爸是李刚 有事找我爹 俗称往上捅 也就是先从根加载找的到直接用 找不到再从扩展加载器 扩展里边找的到直接用 找不到就再往下找 一直到你自己的 如果自己也找不到 就报类没有找的异常
2.3 沙箱安全制 以上这么做的理由 往上捅 理由是沙箱安全机制
3、Native
场景
当我们线程strat 就是立刻启动线程吗 答案不是的 他是新建完成到就绪状态 他得调用底层c++的方法才能启动 也就是说start不一定是启动线程 那么什么时候启动 待cpu和操作系统调度
3.1 Native是关键字
3.2 声明有,实现无 why 因为凡是Native的方法 代表java的势力范围 接下来他的实现是靠的C语言(也就是第三方函数库)
接下来由于Native方法的装载和运行在一个叫栈里边 这时候我们衍生出一个栈叫 Native Method Stack 普通放在在栈里边 标志着Native方法走另外一条绿色通道
4、pc寄存器
4.1 记录了方法之间的调用和执行情况,类似于排班值日表;他就是一个指针;他只是记录一个内存地址;我们说了pc寄存器是一个硬件 他在哪 他是在CPU里边的 他用来存储指向下一条指令的地址,也就是将要执行的指令代码 他是当前线程所执行的字节码行号指示器