虚拟机JVM

目标:

虚拟机jvm
jvm由类加载子系统、运行时数据存储区、执行引擎、JNI、垃圾回收器。

内容:

一、类加载子系统
类加载子系统使用三层类加载器,以双亲委派的形式实现类加载。
java文件编译成class文件后,首先由类加载子系统加载,才有之后的一系列运行。Java的每个类,在JVM中,都有一个对应的Klass类实例与之对应,加载的过程首先是这些Klass类实例生成。
JVM中有两种类型的类加载器,由C++编写的及由Java编写的。除了启动类加载器(Bootstrap Class Loader)是由C++编写的,其他都是由Java编写的。由Java编写的类加载器都继承自类java.lang.ClassLoader。

在这里插入图片描述
启动类加载器没有实体,只是将一段加载逻辑命名成启动类加载器。启动类加载器做的事情是:加载类sun.launcher.LauncherHelper,执行该类的方法checkAndLoadMain……启动类、扩展类、应用类加载器逻辑上的父子关系就是在这个方法的调用链中生成的

类的生命周期是由7个阶段组成,但是类的加载说的是前5个阶段:
1、 加载
a.通过类的全限定名获取存储该类的class文件(没有指明必须从哪获取)
b.解析成运行时数据,即instanceKlass实例,存放在方法区
c.在堆区生成该类的Class对象,即instanceMirrorKlass实例
2、 验证
3、 准备
为静态变量分配内存、赋初值
实例变量是在创建对象的时候完成赋值的,没有赋初值一说
4、 解析
5、初始化
二、执行引擎
jvm有两种解释器来执行class文件
1.字节码解释器
字节码解释器是先转换为c++再转硬编码解释执行。
2.模板解释器
模板解释器直接转换为硬编码解释执行。
可以使用一种,也可以两种都使用的混合模式
JIT
JIT Compiler(Just-in-timeCompiler) 即时编译
某些极少执行到的Java指令在编译时所额外花费的时间可能比转译器在执行时的时间还长,针对这些指令而言,整体花费的时间并没有减少。基于对JIT的经验,业界发展出动态编译器(dynamiccompiler),动态编译器仅针对较常被执行的程式码进行编译,其余部分仍使用转译程式来执行。
所以现在的即时编译器都是需要运行一段时间,运行一定循环次数才触发的(动态)即时编译器。
也分两种,C1编译器和C2编译器,可以使用一种,也可以两种混合使用。目前-server模式下默认就是混合编译模式。
目前的64bit机器上只有server模式。大家现在谈执行引擎,说的都是server模式启动的JVM中的执行引擎。触发即时编译的最小单位是代码段,最大单位是方法。
Client 编译器模式下,N 默认的值 1500
Server 编译器模式下,N 默认的值则是 10000

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值