首页 > 技术文章 > 聊聊、JVM 第一篇

xums 2019-12-17 22:47 原文

  学习 JAVA 都知道虚拟机,JAVA 安全性,跨平台性,移动性,这些都和虚拟机相关。基本上大公司面试,虚拟机是必问的。所以虚拟机知识很重要,但往往也是被忽视的,因为大部分工作是接触不到虚拟机知识。

一、JAVA 体系结构

 

 上面的图是从官网拉下来的,JDK 是 JAVA 开发包,有很多的版本。JDK 包含了 JRE,JAVA 语言,JAVA Tools 和 APIs。而我们的虚拟机 JVM 则是在 JRE 里面,JRE 叫做 JAVA 运行环境。JRE 包含了 JVM,标准环境API,插件,JFX等等。JavaFX 这个可以看作是桌面应用系统,不过现在基本看不到这种技术应用,因为 Android 太强大。记得笔者曾工作的社区电商公司,第一代的产品用的就是 JFX,操作起来经常卡壳,后面第二代就直接用 Android 替换了。

 

二、JVM 体系机构

  网上面确实有不少的图片,但是我都不是很喜欢,所以每一篇的随笔里面有些图片我都自己画。

 

  JVM 虚拟机一般是指一个具体实现,而不是说一种规范。虚拟机有很多种,用的最多的是 HotSpot,不同的虚拟机实现都遵循一种虚拟机规范,极个别特殊的地方由虚拟机实现特殊对待。例如:数据类型占多少字节,每个字长的大小,类加载器怎么去找 class 文件,高位在前还是低位在前,垃圾收集算法等等。 

  这里面涉及的东西太多了,只能一点点来。JVM 结构就上面图所示,最左边是 加载器,中间五个小部分组成 运行时数据区,最右边是 执行引擎。接下来就说说加载器系统吧。

 

三、加载器系统

  加载器系统最根本的目的是加载 class 文件,当然根据虚拟机设计,也可以加载其他的后缀文件,但是不管是 class,还是 cla,cls,等等后缀。class 文件也不一定是 Java 程序生成,其他语言也可以生成 class 文件。但文件中的二进制码格式必须是一致的,因为你要跨平台,如果不同的虚拟机实现用不同的二进制文件格式,那么如何实现跨平台呢?

 

 

 1.装载

   JVM 装载 class 文件,首先要有装载器,也就是 classLoader,而装载器根据装载不同的 jar 又分成几种。

   在 JDK 版本 1.2 之前,是没有双亲委派机制的,1.2 才引入这个机制。而且 1.2 之前加载器就是启动类加载器,没有这么多区分。1.2 开始引入双亲委派机制,加载器分为启动类加载器和系统类加载器。再后面就有了现在的加载器分类。加载器分类和双亲委派机制都是为了安全性,那么加载器和双亲委派怎么保证 JAVA 程序安全性呢?其实我们可以把加载器想象成一个命名空间,就像现在很火的 kubernetes 服务编排框架一样,容器通过 namespaces 去区分隔离。每一个加载器有一个自己的 namespace,只有同一个 namespace 下的类才可见,而且双亲委派则进一步确保同一个类来源的安全合法。 

 

推荐阅读