JVM 一 ClassLoad

JVM 2-classLoadjava

Java编译过程web

图片


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

经常使用JVM实现tomcat

  1. HotSpot  oracle官方安全

  1. TaobaoVm服务器

  1. J9 --IBMoracle

  1. Microsoft VMapp

JDK JRE JVMjvm

  1. jdk包含 JRE与JVM   ide

  1. 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标准

  1. Preparation:把class文件静态变量赋默认值

  1. Resolution:把class文件里的常量池里面用到的符号引用,转换成直接内存地址能够直接访问的内容

三:类初始化(Initlalizing)

静态变量这时候赋值才被赋值为初始值

四:申请对象堆内存

五:成员变量福默认值

六:调用构造方法<init>

  1. 成员变量顺序赋初始值

  1. 执行构造方法语句

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

  1. 对象头  8个字节

  1. classPoint指针:-XX:+UseCompressedClassPointers 4个字节,不开启8字节

  1. 实例数据(实例对象)

    1. 引用类型:

  1. Padding对齐,8的倍数

使用agent(Instrumentation)能够测试大小,

相关文章
相关标签/搜索