JVM 2-classLoad

JVM 2-classLoad
Java编译过程

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

常用JVM实现

  1. HotSpot oracle官方
  2. TaobaoVm
  3. J9 --IBM
  4. Microsoft VM

JDK JRE JVM

  1. jdk包含 JRE与JVM
  2. JRE包含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.path
  • Exetension: jdklib下ext包下的jar java.ext.dirs
  • AppClassLoader: 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分三步)

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

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

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

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

  1. 对象头 8个字节
  2. classPoint指针:-XX:+UseCompressedClassPointers 4个字节,不开启8字节
  3. 实例数据(实例对象)
  4. 引用类型:
  5. Padding对齐,8的倍数
    使用agent(Instrumentation)可以测试大小,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值