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

本文介绍了Java虚拟机(JVM)的原理,包括其跨平台特性、与字节码的关系、类加载器的工作机制,以及JIT编译器如何提升性能。还探讨了类构造器和类加载器的双亲委派机制,以及常用的Java应用调优工具。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沛权

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值