JVM


JVM整体结构

简介

JVM(Java Virtual Machine)

  1. 只要该语言能被编译为字节码文件(Class文件),就可以被虚拟机识别并装载运行。

  2. 虚拟机分为系统虚拟机和程序虚拟机:

系统虚拟机如Visual Box,VMware,提供一个可运行完整操作系统的软件平台。

程序虚拟机如JVM,专门为执行单个计算机程序设计。

  1. JVM优势

跨平台性、优秀的垃圾回收器、可靠的即时编译器、自动内存管理

  1. JVM作用

装载字节码到其内部,解释/编译为对应平台的机器指令。(二进制字节码的运行环境)

  1. JVM位置

  1. 整体结构

HotSpot VM为主流虚拟机。采用解释器和即时编译器并存的架构。

热点代码探测技术:

  • 通过计数器找到最具编译价值代码,触发即时编译或栈上替换。
  • 通过编译器与解释器协调工作,在程序响应时间与执行性能取得平衡。
  1. 执行流程

  1. 架构模型

栈的指令集架构

特点:

  • 设计和实现更简单,适用资源受限的系统
  • 避开寄存器的分配难题:使用零地址指令方式分配
  • 指令集更小,编译容易。
  • 不需要硬件支持
  • 缺点是需要更多的指令来实现功能。

生命周期

  1. 启动

由引导类加载器(bootstrap class loader)创建一个初始类来启动。

  1. 执行

程序执行时才运行,程序结束他就结束。

  1. 退出
  • 正常执行结束
  • 异常
  • 操作系统错误
  • 调用Runtime类或System类的exit方法

类加载子系统

简介

加载类的信息存放方法区的内存空间,方法区还会存放运行时常量池信息,字符串字面量和数字常量(常量池部分的内存映射)

  1. 加载
  • 获取该类的二进制字节流
  • 静态存储结构转化为方法区的运行时数据结构
  • 在内存中生成代表该类的java.lang.Class对象
  1. 链接

  1. 初始化

类加载器分类

虚拟机自带:

  1. 引导类加载器(启动类加载器 BootStrap ClassLoader)
  • C++实现
  • 加载Java的核心库,提供JVM自身需要的类
  • 没有父加载器,不继承java.lang.ClassLoader
  • 加载扩展类和应用程序类加载器,并为他们的父类加载器
  • 只加载包名为java、javax、sun开头的类
  1. 扩展类加载器(Extension ClassLoader)
  • Java实现
  • 派生于ClassLoader
  1. 应用程序加载类(系统类加载器 AppClassLoader)
  • java实现
  • 派生于ClassLoader
  • 程序默认的类加载器,Java应用的类均由其加载

用户自定义类加载器

目的:

  • 隔离加载类
  • 修改加载方式
  • 扩展加载源

双亲委派机制

java采用按需加载,并采用双亲委派模式

比如:自定义String类,并且在自定义的java.lang文件下,加载String时,先判断自定义的String是否有父类,从系统类加载器到拓展类加载器,最后到引导类加载器,只要父类里有String就一直向上找,如果上面没有就加载子类。

优势:

  • 避免类的重复加载
  • 保护程序安全,防止核心API被篡改

这也是一种沙箱机制,在规定好的盒子里运行不影响外面的环境。

两个Class是否为同一个类

  1. 类名、包名一致
  2. 加载这个类的ClassLoader必须相同

即使同一个class文件,但加载的ClassLoader实例对象不同,也是不等的

运行时数据区

内存

内存是硬盘和CPU的中间仓库和桥梁,承载存储系统和应用程序是实时运行。

JVM内存布局规定Java在运行时内存申请、分配、管理的策略。

每个线程:独立包括程序计数器、栈、本地栈

线程间共享:堆、堆外内存(永久代或元空间、代码缓存)

线程

每个线程都与操作系统的本地线程直接映射

java线程准备执行后,操作系统的本地线程同时创建,线程终止后,本地线程也会回收。

操作系统的线程杜泽所有线程的安排调度到任何一个可用的CPU,一旦本地线程初始化成功,就会调用Java线程的run()方法。


文章作者: Luan-bx
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Luan-bx !
  目录