jvm初识(一)jvm相关概念以及类加载

1 篇文章 0 订阅

jvm初识(一)jvm相关概念以及类加载

一、java虚拟机的概念

jvm即java虚拟机,所有的java程序都要编译为.class文件由ClassLoader加载到jvm中才能运行。jvm是一个运行平台,依赖于操作系统,类似于操作系统于物理机的关系,不论各种物理机的区别如何,只要安装了windows系统,windows平台上的软件就可以在机器上执行,具体底层的转换实现由windows平台去负责。这就是java可移植性强的原因,编程者只管编译出符合jvm规范的字节码,由jvm负责转换会符合各种操作系统的命令。

二、jvm内存结构

在这里插入图片描述
在这里插入图片描述

jvm中主要结构有三部分:类加载子系统、运行时数据区以及执行引擎

1.类加载子系统

在这里插入图片描述
类加载子系统包含三种类加载器,类加载器将字节码文件加载进jvm中,存放在jvm内存结构中的方法区成为元数据模板,包含了类的具体信息。
其中类加载器分别为BootstrapClassLoaderExtensionClassLoaderAppClassLoader,从上往下三者为父子关系。BootstrapClassLoader 加载包名为java、javax、sun等开头的类;ExtensionClassLoader加载从java.ext.dirs系统属性指定的目录下加载类库,或从jdk安装目录的jre/lib/ext子目录下加载类库。AppClassLoader加载系统属性classpath下的类库,一般自己编写的类都由该加载器加载。

双亲委派机制是类加载的一个重要知识,其主要内容是当一个类加载器加载类时,如果其有父加载器,就由父加载器先去加载,层层递进,如果父加载器加载了该类,那么子加载器就不在加载,否则再由子加载器进行加载。
使用双亲委派机制的好处是防止类的重复加载保护程序安全,防止核心api被随意篡改(即时定义了同包名同类名的类,系统也是从核心包中加载类,而不是加载自定义的替换类)

由类加载器加载后就会进行链接阶段,主要分为三步:验证、准备、解析
验证阶段判断字节码文件是否符合jvm规范,准备阶段是为类中的静态变量赋默认初始值(并不是用户赋的值,而是默认零值,用户赋的值将会在初始化阶段执行),解析阶段是将常量池中的符号引用转换为直接引用(符号引用就是象征对象的符号值,直接引用才是真正指向对象的指针)ps:final修饰的静态量不会在准备阶段处理,因为其在编译期间就被编译器分配了值。

最后是初始化阶段,初始化阶段实际上就是执行类的“构造方法”(类实际上在jvm中也会被当作一个对象被保存,因而类似地就有其构造方法‘clinit’,其内容就是执行对类中静态变量地赋值以及静态代码块中内容)。若类中没有对静态变量的赋值或者静态代码块则无该方法。

至此,类的加载阶段完成,类信息被加载到方法区中共运行时使用。

2.运行时数据区

运行时数据区由虚拟机栈、堆、程序计数器、方法区以及本地方法栈构成。
在这里插入图片描述
其具体结构在下一节说明。

3.执行引擎

执行引擎的功能是将字节码指令转换为机器指令交由机器执行。jvm是半解释半编译执行(并不是所有jvm都是,这里以hotspot为例)。在最初的jdk版本中,jvm只有解释器解释执行java程序,在后来的版本中,为了提高执行效率,加入了即时编译器(JIT),加热点代码进行编译,编译结果存储在元空间,下次执行时便不用解释可直接运行。而对于热点代码的检测则是用基于计数器的热点探测。分别是方法计数器以及回边计数器,方法计数器统计方法的调用次数,回边计数器用于统计循环体的循环次数。当一定时间内计数器到达设定阈值时就会将该方法或者循环体作为热点代码编译。

以上便是jvm的三个重要组成部分: 类加载子系统(负责加载类)、运行时数据区(负责存储)、执行引擎(负责执行)。而其中运行时数据区则是jvm中最关键的部分,下节仔细讲解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值