当前位置: 首页 > news >正文

JVM 第一部分 JVM两种解释器 类加载过程和类加载器

JVM是跨平台跨语言的虚拟机,不直接接触硬件,位于操作系统的上一层

跟字节码文件直接关联,和语言没有关系

一次编译成字节码文件,多次执行

请添加图片描述

虚拟机可以分成三部分:类加载器,运行时数据区,执行引擎(解释器+JIT编译器)

JIT编译器是把一些常用代码编译成 机器指令,并缓存起来,加快执行速度【解释器相当于步行,响应快但是速度慢。JIT要先编译成机器指令,相当于公交车,要等一段时间,但是速度块。只用解释器很慢,只用JIT要等比较久】

请添加图片描述

零地址指令是因为栈里面每次只会有一个元素在栈顶,一次只处理一个

栈式架构指令集小,但是完成一个操作用的指令数量多

反编译:运行写的程序之后,会输出编译后的文件夹,cmd,cd进到某class文件的文件夹,javap -v class文件名 > xxx.txt 【就可以把字节码文件的信息放到txt文件看】

一个Java程序对应一个java虚拟机(应该是)(服务器部署多个服务,应该有多个虚拟机)所以不同程序的堆栈不共享

第一部分:类加载器

请添加图片描述

  • 加载:获取类的全类名,读取class文件,在方法区创建对应的Class对象
  • 链接
    • 验证:验证字节码文件是否合法之类
    • 准备**:把类变量(加了static的变量)创建处理,赋零值**
      • 【加了final的常量在编译时就已经分配内存,在准备阶段显式初始化】
      • 【不会为实例变量分配初始化,实例变量,就是成员变量,是在对象创建时,分配到堆时,默认赋零值】
    • 解析:把常量池内的符号引用换成直接引用【事实上,解析操作往往在JVM初始化之后执行】
  • 初始化:执行类构造器方法的过程。就是如果有类变量或者静态方法块,虚拟机会自动把他们整合在一起,按顺序创建变量和赋值,由字节码中的方法执行,这个方法称为类构造器方法
    • 子类如果有类变量或者静态方法块,会先执行父类的方法,然后执行子类的
    • 多线程下,会给方法加锁
    • 是类构造器,每个类的字节码文件都有

请添加图片描述

  • 通过 某个类.class.getClassLoader() 可以得到它的类加载器
  • 获取的类加载器对象.getParent() 可以获得它包含的类加载器
  • 引导类加载器
    • 用C/C++写,不能获取到
    • 加载Java的核心类库(String类就是用它加载)
  • 扩展类加载器
    • 用Java写
    • 加载ext文件夹下的类库
  • 系统类加载器
    • 用Java写
    • 默认的类加载器,加载环境变量或系统属性

请添加图片描述

  • 好处:
    • 避免用户创建自己的类替换Java的一些核心类,比如String
      • 【如果包名和核心api包名一样,即使是新的类,也不允许创建】
      • 【实践中,如果新建一个String类,这个类的包也是 java.long 里面有个main方法。但是启动不了会报错】
      • 因为它经过双亲委派机制,到达引导类加载器,但是引导类加载器加载的是api里面的String,加载不了这个类,所以就启动不了main方法
    • 避免类的重复加载:向上委托,一旦父加载器加载了,子加载器就不会重复加载
    • 不同的类加载器加载的类 就算包名一样且同名也是不同的类(也是说要是从同一个class文件加载,不同类加载器,类也不同)

请添加图片描述

常用调优工具

  • JDK命令行
  • Eclipse: Memory Analyzer Tool
  • Jconsole
  • VisualVM
  • Jprofiler
  • Java Flight Recorder
  • GCViewer
  • GC Easy
http://www.lryc.cn/news/310518.html

相关文章:

  • 用Java语言创建的Spring Boot项目中,如何传递数组呢??
  • [笔记] 使用 Java Swing 实现一个简单的窗口
  • 2024.03.03蓝桥云课笔记——排序
  • Vue3和ElementPlus封装table组件
  • 第一篇:参考资料地址
  • wordpress 开源主题
  • 【Linux网络命令系列】ping curl telnet三剑客
  • 于月仙主动与赵本山握手表示欢迎,赵:怎么着要跟我第二次牵手啊?
  • Unity UGUI之Slider基本了解
  • 【Linux】进程间通信之共享内存
  • 文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《基于条件风险价值的虚拟电厂参与能量及备用市场的双层随机优化》
  • 前端架构: 脚手架通用框架封装之CommonJS和ESM混合开发兼容解决(教程五)
  • 基于主从模式的Reactor的仿muduo网络库
  • Linux服务器搭建超简易跳板机连接阿里云服务器
  • Windows Server 各版本搭建文件服务器实现共享文件(03~19)
  • ARM总结and复习
  • 非功能测试的定义、类型和示例
  • Angular基础---HelloWorld---Day1
  • k8s部署项目常见的问题及解决方案
  • Redis实现乐观锁+秒杀场景demo
  • 阅读笔记 | Transformers in Time Series: A Survey
  • WPF MVVM中List<>和ObservableCollection<>的区别与对比分析
  • python给企微发消息
  • TCP/IP状态迁移
  • C语言实现各类排序算法
  • Network LSA 结构简述
  • 揭示IP风险画像的作用与价值
  • [python] dataclass 快速创建数据类
  • opencv实现图像的融合
  • Orbit 使用指南 02 | 在场景中生成原始对象| Isaac Sim | Omniverse