前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >3分钟速读原著《深入理解Java虚拟机》(一)

3分钟速读原著《深入理解Java虚拟机》(一)

作者头像
cwl_java
发布2019-10-26 20:43:33
3510
发布2019-10-26 20:43:33
举报
文章被收录于专栏:cwl_Javacwl_Java

一.Java的体系结构

1.JVM加载字节码
  • 1.1 JVM都是会通过类加载器加载字节码,不同的JVM虚拟机,执行引擎会有所不同,
    • ①一次性解释字节码
    • ②即时编译器(just-in-time-compiler),这种情况下第一次被执行的字节码会被编译称为本地机器代码,编译出的本地机器代码会被缓存,当方法以后被调用的时候可以重用
    • ③引擎自适应优化器,在这种方法里,虚拟机会监视运行中程序的活动,并且记录下使用最频繁的代码段,在程序运行的过程中,它只会选择性的把那些最常用的字节码代码转换成本地的机器代码
    • ④备注:编译器的自动优化性,对于一些冗余的代码,编译器都是会进行适当的优化的,所以其实我们的类当中如果写了很多,相对而言C++的编译器会对那些没有使用到的方法进行优化,从而不作编译,但是在这点上Java的编译器倒是没有这种做法,Java的编译器目前来说会对一些语法糖进行优化和对一些变量名称进行优化,
2 Java类加载机制以及其自定义类加载器
  • 2.1 ClassLoader,主要的作用就是将class文件加载到JVM虚拟机当中,JVM启动的时候,并不是一次性的加载所有的类,而是根据需要动态的去加载类,主要分成了隐式加载和显式加载
    • ①隐式加载:程序代码当中并不需要调用ClassLoader来加载需要的类,而是通过JVM类自动加载需要的类到内存中.例如,当我们在类中继承或者引用某个类的时候,JVM在解析当前这个类的时候,发现引用的类不在内存当中,那么就会自动将这些类加载到内存当中去
    • ②显式加载:代码当中通过Class.forName(),this.getClassLoader.LoadClass(),自定义类加载器中的findClass()方法等
3.JVM自带的加载器
  • 3.1 BootStrap ClassLoader:主要加载JRE\lib下的.jar/resource.jar/charsets.jar和class等,这个类加载器是由C/C++编写的,好处在于C/C++的反汇编功能比较强大
  • 3.2 ExtentionClassLoader:主要加载目录JRE\lib\ext\下的jar和class文件
  • 3.3 AppClassLoader:主要加载当前应用下的classpath路径下的类,之前我们在环境变量中配置的classpath就是指定AppClassLoader的类加载路径
4.类加载器的继承体系

如下图:

image.png
image.png
  • 4.1 类加载机制-双亲委托机制 例如:当JVM需要加载Test.class的时候
    • ①首先会到自定义加载器当中查找,看是否已经加载过了,如果已经加载过了,则返回字节码
    • ②如果自定义加载器没有加载过,则询问上一层(即是APPClassLoader)是否已经加载过了Test.class
    • ③如果没有加载过,再询问上一层ExtClassLoader是否已经加载过
    • ④如果没有加载过,则继续询问上一层加载BoopStrapClassLoader是否已经加载过
    • ⑤如果BoopStrap ClassLoader依然没有加载过,则到自己指定类加载路径下sun.boot.class.path查看是否有Test.class字节码,有则返回,没有则通知下一层ExtClassLoader到自己制定的类加载路径下(java.ext.dirs)查看
    • ⑥依次类推,最后到自定义类加载器制定的路径还没有找到Test.class字节码,则抛出异常ClassNotFoundException

具体流程如下图所示:

image.png
image.png
5.自定义类加载器步骤
  • 5.1 继承ClassLoader
  • 5.2 重写findClass()方法
  • 5.3 调用defineClass()方法
6.自定义类加载器的作用

自定义类加载器的作用:JVM自带的是哪个加载器只能加载指定路径下的类字节码,如果某个情况下,我们需要加载应用程序之外的类文件,比如去本地D盘下的,或者去加载网络上的某个类文件,这种情况就可以使用自定义加载器了,但是现在一般都是用调用接口来代替这种方式

  • 6.1 Java当中是可以存在多个类装载器的,相对的当我们在本地启动多个项目的时候,其实对于每个不同的项目都存在着不同的命名空间
  • 6.2 Java的跨平台性主要体现的就是生成的字节码可以在多个不同的平台进行运行
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-05-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.Java的体系结构
    • 1.JVM加载字节码
      • 2 Java类加载机制以及其自定义类加载器
        • 3.JVM自带的加载器
          • 4.类加载器的继承体系
            • 5.自定义类加载器步骤
              • 6.自定义类加载器的作用
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档