新手入门Jvm--jvm概览

目录
  • 1. 什么是Jvm
  • 2. Jvm组成
    • 2.1 Jdk体系结构
    • 2.2 Jvm体系结构
  • 3. 类加载机制
    • 3.1 流程
    • 3.2 类加载器和双亲委派机制
    • 3.3 类加载器初始化过程
    • 3.4 双亲委派机制
    • 3.5 为什么要设计双亲委派机制?
    • 3.6 全盘负责委托机制
  • 4. Jvm各区域串联
  • 5. 总结

1. 什么是Jvm

JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。

Java虚拟机有自己完善的硬件架构,如处理器、堆栈等,还具有相应的指令系统。

Java虚拟机本质上就是一个程序,当它在命令行上启动的时候,就开始执行保存在某字节码文件中的指令。Java语言的可移植性正是建立在Java虚拟机的基础上。任何平台只要装有针对于该平台的Java虚拟机,字节码文件(.class)就可以在该平台上运行。这就是“一次编译,多次运行”。

Java虚拟机不仅是一种跨平台的软件,而且是一种新的网络计算平台。该平台包括许多相关的技术,如符合开放接口标准的各种API、优化技术等。Java技术使同一种应用可以运行在不同的平台上。Java平台可分为两部分,即Java虚拟机(Java virtual machine,JVM)和Java API类库

Java虚拟机主要分为五大模块:

  • 类装载器子系统
  • 运行时数据区
  • 执行引擎
  • 本地方法接口
  • 垃圾收集模块

2. Jvm组成

2.1 Jdk体系结构

2.2 Jvm体系结构

.

类加载器线程共享区域 方法区堆 线程私有区域 虚拟机栈本地方法栈程序计数器

3. 类加载机制

3.1 流程

加载 >> 验证 >> 准备 >> 解析 >> 初始化 >> 使用 >> 卸载

  • 加载:在硬盘上查找并通过IO读入字节码文件,使用到类时才会加载,例如调用类的

main()方法,new对象等等,在加载阶段会在内存中生成一个代表这个类的

java.lang.Class对象,作为方法区这个类的各种数据的访问入口

  • 验证:校验字节码文件的正确性
  • 准备:给类的静态变量分配内存,并赋予默认值
  • 解析:将符号引用替换为直接引用,该阶段会把一些静态方法(符号引用,比如main()方法)替换为指向数据所存内存的指针或句柄等(直接引用),这是所谓的静态链接过程(类加载期间完成),动态链接是在程序运行期间完成的将符号引用替换为直接引用,下节课会讲到动态链接
  • 初始化:对类的静态变量初始化为指定的值,执行静态代码块

:类被加载到方法区中后主要包含 运行时常量池、类型信息、字段信息、方法信息、类加载器的引用、对应class实例的引用等信息。类加载器的引用:这个类到类加载器实例的引用对应class实例的引用:类加载器在加载类信息放到方法区中后,会创建一个对应的Class 类型的对象实例放到堆(Heap)中, 作为开发人员访问方法区中类定义的入口和切入点。

3.2 类加载器和双亲委派机制

上面的类加载过程主要是通过类加载器来实现的,Java里有如下几种类加载器

  • 引导类加载器:负责加载支撑JVM运行的位于JRE的lib目录下的核心类库,比如rt.jar、charsets.jar等
  • 扩展类加载器:负责加载支撑JVM运行的位于JRE的lib目录下的ext扩展目录中的JAR类包
  • 应用程序类加载器:负责加载ClassPath路径下的类包,主要就是加载你自己写的那些类
  • 自定义加载器:负责加载用户自定义路径下的类包

3.3 类加载器初始化过程

会创建JVM启动器实例sun.misc.Launcher。

sun.misc.Launcher初始化使用了单例模式设计,保证一个JVM虚拟机内只有一个 sun.misc.Launcher实例。

在Launcher构造方法内部,其创建了两个类加载器,分别是 sun.misc.Launcher.ExtClassLoader(扩展类加载器)和sun.misc.Launcher.AppClassLoader(应用类加载器)。

JVM默认使用Launcher的getClassLoader()方法返回的类加载器AppClassLoader的实例加载我们的应用程序。

3.4 双亲委派机制

JVM类加载器是有亲子层级结构的,如下图

这里类加载其实就有一个双亲委派机制,加载某个类时会先委托父加载器寻找目标类,找不到再委托上层父加载器加载,如果所有父加载器在自己的加载类路径下都找不到目标类,则在自己的类加载路径中查找并载入目标类。

双亲委派机制说简单点就是,先找父亲加载,不行再由儿子自己加载

3.5 为什么要设计双亲委派机制?

  • 沙箱安全机制:自己写的java.lang.String.class类不会被加载,这样便可以防止核心API库被随意篡改
  • 避免类的重复加载:当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次,保证被加载类的唯一性

3.6 全盘负责委托机制

“全盘负责”是指当一个ClassLoder装载一个类时,除非显示的使用另外一个ClassLoder,该类所依赖及引用的类也由这个ClassLoder载入。

4. Jvm各区域串联

5. 总结

看完本章,大概对Jvm和Jvm结构有大概了解,下面将继续深入Jvm,未完待续~!希望大家可以多多关注我们的其他内容!

(0)

相关推荐

  • JVM上高性能数据格式库包Apache Arrow入门和架构详解(Gkatziouras)

    Apache Arrow是是各种大数据工具(包括BigQuery)使用的一种流行格式,它是平面和分层数据的存储格式.它是一种加快应用程序内存密集型. 数据处理和数据科学领域中的常用库: Apache Arrow.诸如Apache Parquet,Apache Spark,pandas之类的开放源代码项目以及许多商业或封闭源代码服务都使用Arrow.它提供以下功能: 内存计算 标准化的柱状存储格式 一个IPC和RPC框架,分别用于进程和节点之间的数据交换 让我们看一看在Arrow出现之前事物是如何

  • JVM入门之内存结构(堆、方法区)

    目录 1.堆 1.1 定义 1.2 堆的作用 1.3 特点 1.4 堆内存溢出 1.5 堆内存诊断 2.方法区 2.1 结构(1.6 对比 1.8) 2.2 内存溢出 2.3 常量池 2.4 运行时常量池 2.5 常量池与串池的关系 2.6 StringTable的位置 2.7 StringTable 垃圾回收 2.8 方法区的垃圾回收 3.直接内存 释放原理 1.堆 1.1 定义 是Java内存区域中一块用来存放对象实例的区域[几乎所有的对象实例都在这里分配内存] 通过new关键字创建的对象都

  • JVM入门之类加载与字节码技术(类加载与类的加载器)

    1. 类加载阶段 1.1 加载阶段 将类的字节码载入方法区中,内部采用 C++ 的 instanceKlass 描述 java 类,它的重要 field 有: _java_mirror 即 java 的类镜像,例如对 String 来说,就是 String.class,作用是把 klass 暴 露给 java 使用 _super 即父类 _fields 即成员变量 _methods 即方法 _constants 即常量池 _class_loader 即类加载器 _vtable 虚方法表 _ita

  • JVM入门之JVM内存结构内容详解

    一.java代码编译执行过程 源码编译:通过Java源码编译器将Java代码编译成JVM字节码(.class文件) 类加载:通过ClassLoader及其子类来完成JVM的类加载 类执行:字节码被装入内存,进入JVM虚拟机,被解释器解释执行   注:Java平台由Java虚拟机和Java应用程序接口搭建,Java语言则是进入这个平台的通道,   用Java语言编写并编译的程序可以运行在这个平台上 二.JVM简介 1.java程序经过一次编译之后,将java代码编译为字节码也就是class文件,然

  • 新手入门Jvm--jvm概览

    目录 1. 什么是Jvm 2. Jvm组成 2.1 Jdk体系结构 2.2 Jvm体系结构 3. 类加载机制 3.1 流程 3.2 类加载器和双亲委派机制 3.3 类加载器初始化过程 3.4 双亲委派机制 3.5 为什么要设计双亲委派机制? 3.6 全盘负责委托机制 4. Jvm各区域串联 5. 总结 1. 什么是Jvm JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能

  • 干货 | Linux新手入门好书推荐

    前言 经常有读者问小编可否推荐一些 Linux 入门书籍,正好最近在知乎也看到类似的问题,如几个零碎的命令难以在 Linux 环境中存活,所以如果要真正形成自己的知识体系,还是要靠阅读专业书籍来积累. 众所周知Linux 对后端开发是必备技能,对 Python 开发者来说重要性不言而喻,将来你写的每一行代码,都有可能在 Linux 环境中运行.前端开发是否有必要学习 Linux 呢?这个就好比学驾照,学到了,总有一天会给你带来便利,暂时没时间学的可以先收藏着. linux之路,路漫漫其修远兮,吾

  • Android Studio 新手入门教程(一)基本设置图解

    ##写在前面: 作为一个刚半只脚踏入android开发的新手,在使用eclipse开发了两个自我感觉不甚成熟的商城类app之后,遇到了一些问题,总结为如下: 1.代码复用性 .findviewById,onclick事件等,一遍遍重复这类无聊的代码简直浪费生命,这个问题推荐通过依赖注入框架ButterKnife解决,直接一键生成布局中的所有控件,包括onclick点击事件,但是诸如行布局item里的控件,以及布局中include复用的布局要如何使用框架解决,这个有待后续再看. 另一个代码重复率很

  • android studio 新手入门教程(二)项目的导入教程图解

    上篇文章介绍了AS的一些常用设置方法,当工具调教妥当后,自然就要开始项目的开发啦.从零开始新建一个项目,这个简单,不必多说,这篇博客会分享我从旧平台eclipse导入项目到AS的过程,以及遇到的一些问题并如何解决.开篇先粗略的提一些需要注意的地方. ##结构目录 和eclipse不同,在android 视图下的项目目录分为java,res和manifests. manifests目录存放清单文件,不必多说. java目录会默认生成三个文件夹,其中test为在本机执行单元测试代码的目录, andr

  • android studio 新手入门教程(三)Github( ignore忽略规则)的使用教程图解

    Android Studio 里集成了上传代码到 github 的功能,所以使用上还是很简单的,设置里添加账号并测试,之后就可以很方便地上传代码到 github 了 如果你的项目是使用Android Studio新建的,那么关于 github 基本就没什么问题了.Android Studio新建项目是自带 .ignore 文件的,也就是说默认是使用了忽略规则上传.默认忽略的是 *.iml .gradle /local.properties /.idea/workspace.xml /.idea/

  • Java新手入门学习之正则表达式

    一.概述 1.概念:符合一定规则的表达式. 2.作用:用于专门操作字符串. 3.特点:用于一些特定的符号来表示一些代码操作,这样就可以简化代码书写. 4.好处:可简化对字符串的基本操作. 5.弊端:符号定义越多,正则越长,阅读性越差. 二.常用符号: 说明:X表示字符X或者匹配的规则. 一)字符 构造 匹配 \ 反斜线字符 \t 制表符 \n 回车符 \f 换页符 二)字符类 表达式 释义 [abc] a.b或c(简单类) [^abc] 任何字符,除了a.b或c(否定) [a-zA-Z] a到z

  • 全网最完整的Redis新手入门指导教程

    前言 本文提供全网最完整的Redis入门指导教程,下面我们从下载Redis安装包开始,一步一步的学习使用. 下载Redis 官网提供的Redis安装包是服务于Linux的,而我们需要在Window下使用Redis,所以,我们去下面这个网址中下载. Redis的下载地址:https://github.com/microsoftarchive/redis/releases. 如下图所示,Redis的windows版是由microsoftarchive提供,是微软的一个工作小组,所以我们可以选择完全信

  • Python爬虫新手入门之初学lxml库

    1.爬虫是什么 所谓爬虫,就是按照一定的规则,自动的从网络中抓取信息的程序或者脚本.万维网就像一个巨大的蜘蛛网,我们的爬虫就是上面的一个蜘蛛,不断的去抓取我们需要的信息. 2.爬虫三要素 抓取 分析 存储 3.爬虫的过程分析 当人类去访问一个网页时,是如何进行的? ①打开浏览器,输入要访问的网址,发起请求. ②等待服务器返回数据,通过浏览器加载网页. ③从网页中找到自己需要的数据(文本.图片.文件等等). ④保存自己需要的数据. 对于爬虫,也是类似的.它模仿人类请求网页的过程,但是又稍有不同.

  • Javascript新手入门之字符串拼接与变量的应用

    1. 课程大纲 字符串拼接(+)的学习和应用 坐标变换在飞机大战游戏中的应用 2.1 字符串的拼接 在JS中使用"+"号,连接字符串.变量.数值等. 2.2 在警告框上显示朋友的数量 在警告框上显示朋友的数量,显示效果如下 声明变量 friends表示朋友的数量,在警告框上显示"我的朋友数量为:7",使用字符串拼接符"+" ,代码如下' var friends = 7; alert("我的朋友数量为:" +friends);

随机推荐