jvm -字节码篇

1.jvm 概述

一次编写(写的.java 文件) 一次编译(生成的.class文件)jvm 虚拟机 执行.class 文件
jit 编译器

1.0 为什么 java 是 半编译 半解释语言

因为在javac把.java文件编译成.class文件后
执行引擎中 两种执行方法
解释器 解释
JIT 编译器 预热过程
c

1.1 jvm结构图

图1

c1

图2 详细

C2
这个架构可以分成三层看:

  • 最上层:javac编译器将编译好的字节码class文件,通过java 类装载器执行机制,把对象或class文件存放在 jvm划分内存区域。
  • 中间层:称为Runtime Data Area,主要是在Java代码运行时用于存放数据的,从左至右为方法区(永久代、元数据区)、堆(共享,GC回收对象区域)、栈、程序计数器、寄存器、本地方法栈(私有)。
  • 最下层:解释器、JIT(just in time)编译器和 GC(Garbage Collection,垃圾回收器)

描述类加载器

类加载器子系统
loading-linking-initialization
loading 加载器 引导类加载器-扩展类加载器-应用类加载器
linking :
验证 准备 解析


lv 局部变量表
os 操作数栈
dl 动态链接
ra 返回地址

执行引擎

2.字节码指令

一个字节的操作码 +操作数
aload_0
bipush 30 b

2.1 字节码指令面试题目 i++

public void test2(){
        int i = 10;
        i = i++;
        System.out.println(i);//10
    }

ca

cc

2.2 intern()

字符串常量池 1.7后 在堆中
1.6前在 方法区中
需要掌握

3.class文件部分

阅读宋红康jvm 字节码笔记 完整

魔数

  • 0xca fe ba be (4个字节)

class版本

  • 最低版本 00 00
  • 最高版本 00 34 0x34=52 jdk编译版本1.8

常量池

常量池中主要存放两大常量:字面量和符号引用
字面量:使用""引起来的字符串、使用final修饰的基本数据类型变量
符号引用:类和接口的全限定名、字段的名称和描述符、方法的名称和描述符
cc

常量池表顶中,用于存放编译时期生成的各种字面量和符号引用
这部分内容将在类加载后进入方法区的运行时常量池

直接引用和常量引用的区别?

符号引用
符号引用一般一一组符号来描述所引用的目标。符号引用与虚拟机的内存布局无关,引用的目标不一定已经加载到内存中了。
直接引用:
直接引用是直接指向目标的指针、相对偏移量或是一能能间接定位到目标的句柄。真实中内存中存放的地址。

在class字节码文件中所表示的是指向某索引的符号有引用,不代表真正的内存地址;
当被类加载器加载到内存中,所存放到运行时数据区中,此时的符号引用就编译成了真正指向真实内存地址的直接引用

访问标识

public

类索引 父类索引 实现接口集合

字段表集合

方法表集合

属性表集合

4.题目

c

4.1 Integer x = 5;int y = 5;比较 x == y 都经过哪些步骤?

true 自动拆箱
intValue();

4.2 Java虚拟机中,数据类型可以分为哪几类?

Java虚拟机是通过某些数据类型来执行计算的,数据类型可以分为两种:基本类型和引用类型基本类型的变量持有原始值而引用类型的变量持有引用值。

c1

4.3 为什么不把基本类型放堆中呢?

  • 首先是栈、堆的特点不同。(堆比栈要大,但是栈比堆的运算速度要快。)
  • 将复杂数据类型***(引用数据类型)放在堆中的目的是为了不影响栈的效率***,而是通过引用的方式去堆中查找。(八大基本类型的大小创建时候已经确立大小。三大引用类型创建时候无法确定大小
  • 简单数据类型比较稳定,并且它只占据很小的内存,将它放在空间小、运算速度快的栈中,能够提高效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值