目录
1 为什么学习jvm
为什么学java要认识jvm,因为电脑只认识00001111这些机器码,而我们平时写程序直接用的高级语言 xxx.java,可是对于计算机他不认识,且要java文件编译为字节码文件,也就是class文件,然后让java虚拟机进行编译,这样计算机能执行我们所写的代码咯。
2 为什么说java是跨平台语言
因为jvm可以部署在各个系统中,例如win,linex,mac ,这些平台都能下载对应的jvm,而java文件编译成字节码文件都能被这些jvm读取,java有JVM从软件层面屏蔽了底层硬件、指令层面的细节让他兼容各种系统,而c和c++在不同系统中实现的代码不一样
3 Jdk和Jre和JVM的区别
jre包含了jvm,而jdk包含了jre和jvm,对比之下,jre不仅有jvm还多了classload 和 java库,而jdk就多了编译环境,监控...
4 jvm运行类的生命周期
我们平时在编写代码时,直接创建一个类就能用了,可他底层做了什么不知道吧?知其然还有知其所以然
大致分为5个步骤 1 加载 2 连接 3 初始化 4 使用 5 卸载
我们平时就是处于04使用层,在此之前还有3个步骤,简单来说一下
加载: 读取从各个渠道获取的字节码然后加载,分别在方法区 和 堆中产生对象 ,在堆里别产生的对象类似于复制方法区的对象,是他的子集,因为要保护原对象操作数据,在jdk9后且其中一些静态变量位于堆里
连接:连接也可以分为3个小步骤:分别为验证,准备,引用,第一为检测魔方,版本信息...
准备就是将变量赋初值,引用就是将字节码文件中的引用符给转变成对应常量池的地址
初始化:给变量赋值,执行字节码指令,这里要知道什么情况才会导致初始化进行,一共有四种情况:1.直接new 2.使用静态方法和变量但如果使用了final就不会初始化 3.执行main()方法 4..调用class.classforname
在继承的关系中,如果调用子类的静态方法父类会初始化,且在子类前边,而使用多态时,调用父类静态方法,子类不会进行初始化
这三种比较重要,知道这三个就够了
今天还要补充一下 jvm能读懂的字节码是啥 class 我直接介绍他的组成有五大部分
1. 基本信息:继承关系,访问权限
2. 常量池:常量引用地址下存放
· 3.字段: 字段名
4.方法区 方法执行字段指令码
5.属性 类的一些信息
哟西,复习完昨天学习的,分享一下心得,有错误和补充请大家鞭策我