zoukankan      html  css  js  c++  java
  • 聊聊、JVM 第一篇

      学习 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 下的类才可见,而且双亲委派则进一步确保同一个类来源的安全合法。 

     

  • 相关阅读:
    maven创建的quickstart项目生成可执行jar
    spring boot 修改banner
    spring boot项目打包成war
    node集成mysql——pool连接池
    adb命令模拟按键输入keycode
    Spring 全局异常处理
    程序开发中版本管理之命名规则及格式
    群晖Nas中搭建Intellij Idea的LicenseServer服务
    uml-类图书写指南
    Spring Boot + Docker + K8S 简单示例
  • 原文地址:https://www.cnblogs.com/xums/p/12053433.html
Copyright © 2011-2022 走看看