JVM 2-classLoad

tech2022-11-01  122

JVM 2-classLoad Java编译过程

JVM 可以跨平台执行,目前有很多语言都基于JVM进行执行,例如scala,grovy等,jvm只与class文件交互,只要一门语言编译后的结果是class文件,就能在jvm上进行执行。

常用JVM实现

HotSpot oracle官方TaobaoVmJ9 --IBMMicrosoft VM

JDK JRE JVM

jdk包含 JRE与JVMJRE包含JVM

Class 文件结构(不重要) 通过javap -v class文件可以进行查看

一:类加载-初始化Loading

classLoad 用的设计模式是 模板模式(父类把大部分方法都实现了,子类只实现一部分方法)只需要自己实现findClass实现即可 classLoad 里面 每个实现类都有个final Parent的 对象,每次classLoad加载类对象,在findClass里,就需要从parent对象里去查找类对象,如果找不到,就要从parent的parent对象里去查找,找到就递归返回,找不到就返回ClassNotFind异常,让子类去加载对象。。直到某个classLoader加载到了该类,或者最终抛出classNotFind异常。上面的这个过程就是双亲委派模型 扩展:类加载器范围

Bootstrap:jdk最核心的lib sun.boot.class.pathExetension: jdklib下ext包下的jar java.ext.dirsAppClassLoader: classPath路径下的jar, java.class.path自定义ClassLoader:例如tomcat的WebApplication的classloader,就是自己实现的,破坏了双亲委派,实现了热加载。

双亲委派模型

为什么要搞双亲委派? 主要是为了安全(杜绝一些自定义java.lang.String与jdk提供的同包同名的情况)

如何破坏双亲委派模式(热加载) 像Tomcat这类web服务器有热加载功能的是怎么实现的? 其实tomcat自己实现了一套classLoader(不光重写了findClass方法,还重新复写了loadClass方法),如果有新的类或者修改的类在tomcat里进行了编号,tomcat会使用classLoader 重新把所有classLoad重新load一下(直接去加载Webapp下所有文件,不再去找父类的loadClass里继续查找),把重新load后的类复制给堆内存,之前的load的内容引用变成空,会被GC回收。

二:类 链接过程(Linking分三步)

Verification:校验装进来的class格式是不是符合class标准Preparation:把class文件静态变量赋默认值Resolution:把class文件里的常量池里面用到的符号引用,转换成直接内存地址可以直接访问的内容

三:类初始化(Initlalizing) 静态变量这时候赋值才被赋值为初始值 四:申请对象堆内存 五:成员变量福默认值 六:调用构造方法

成员变量顺序赋初始值执行构造方法语句

对象在内存里是怎么布局的

对象头 8个字节classPoint指针:-XX:+UseCompressedClassPointers 4个字节,不开启8字节实例数据(实例对象)引用类型:Padding对齐,8的倍数 使用agent(Instrumentation)可以测试大小,
最新回复(0)