文章目录
从此篇博客开始,专注JVM相关内容,从浅到深.
1.JVM入门
1.1 什么是JVM
其实:JVM是一种规范,人们常说Java是跨平台的语言,而JVM帮助屏蔽了不同操作系统的底层,是跨语言的平台.它不仅仅应用于Java语言,它是可以认识所有能编译成.class格式的文件(字节码文件).
1.2 JVM和JDK,JRE的关系(面试有可能问)
1.3 JVM的常见实现
其中,我们目前安装JDk使用的是HotSpot,这个是oracle官方那个是用的,有很多实力公司不依赖oracle公司的这个,他们会根据JVM规范自己实现一些虚拟机,比如淘宝的是TaobaoVM(免费,Java虚拟机收费大家可以可以使用这个),还有商业版本收费,垃圾回收最快的azul zing(有钱公司使用).所以说:一流的公司制造规范,二流的公司实现规范,三流的公司使用规范.
1.4 如何查看当前机器安装的JVM?
打开 dos系统,输入java -version即可查看.
上面可以看出:
使用的是HotSpot,1.8版本,执行模式是mixed mode,解释执行和编译执行混合执行
2.class文件认识(有兴趣了解)
大家知道,JVM只认识.class文件,但是.class文件是什么样子的,大家认识吗?
2.1 class文件查看
其实:
1:class文件是一个进制字节流.
2:这个文件的数据类型有u1 u2 u4 u8和_info(表类型) uX:表示X字节的无符号整数 _info的来源是hotspot源码中的写法
3:当然我们一般打开16进制的,可以使用 sublime / notepad或者 IDEA插件 -BinEd查看(一般使用这个)
安装好插件后,File–>Open As Binary, 选择编译好的.class文件即可
上面的16进制码一开始看有点迷糊,但是单独提出来:
解释:
1:Magic Number:CA FE BA BE指的是文件统一的标识符,是Class文件,不是png文件等等
2:Minor Version:00 00,小版本号 ,这里表示00
3:Major Version:00 34,大版本号,0034换成十进制就是52,对应jdk版本1.8
4:constant_pool_count: 00 10,表示常量池中的常量数,最大为164-1,常量池编号从1开始
5:constant_pool表示长度为constant_pool_count-1的表
6:access_flags:修饰符(piblic/…),interface…
7:this_class:当前类指到常量池的位置
8:super_class:父类指到常量池的位置
9:interface_count:接口数量
10:interfaces:具体接口实现
11:fields_count:属性属性
12:fields:具体属性
13:methods_count:方法数量
14:methods: 集体方法
15:attributes_count -u2:附加属性数量
16:attributes:具体附加属性
但是上面是如何让实现的,大家可以借助IDEA的jClasslib插件,手动编译class文件,光标放入class文件大括号内,view - show byteCode with jclasslib
2.2class文件结构总结
classFile构成:
classFile{
u4 magic;
u2 minor_version;
u2 major_version;
U2 constant_pool_count;
Cp_info constant_pool[constant_pool_count-1]
U2…
}
2.3未完
上面其实只是入门,还有很多值得深入的,比如常量池中的都是哪些,表示都是什么意思,方法区是什么样子的,有兴趣的话可以查找资料了解,当然,面试应该问不到这种程度吧.
注意:本文仅代表菜鸟博主的个人观点,如果哪里不对或者路过技术大大有更好的想法,欢迎留言告知,分享和交流使我们进步,谢谢。