Java虚拟机-Firstday

许久没看java的东西了。

java用多了就不想再多看什么没用的费代码,也不想再写这种代码了。还是看看虚拟机。写正文:

1、本来以为一台机器上只有一个java虚拟机的。但是看了《深入java虚拟机》之后,才知道,原来每次执行一个java程序,都有一个java虚拟机实例,当程序结束之后,虚拟机实例也随之结束。

2、java中的8中基本数据类型,其中boolean比较特殊:虚拟机会用int或者byte来表示boolean。或许这就是为什么boolean可以用0或者非0来表示了。除了boolean之后,其他的7种基本类型构成了java虚拟机中的数据类型。

Java虚拟机-Firstday_第1张图片

3、java虚拟机中还有一个内部使用的类型:returnAddress。java coder不能使用这个类型。这个内部类型被用来实现finally字句。

4、类装载器子系统:

类装载器在装载类的时候,首先会检查class文件的正确性。为了能正确维护命名空间,java虚拟机必须明确记录每个类都是由哪个类装载器装载进来的。

5、大多数虚拟机的实现是:并不等到所欲的类加载完毕之后才开始运行。而是在运行过程中如果发现某一个类还没有加载,那么加载(ClassLoader的作用)这个类(Clas文件)。加载了Class文件之后,在堆上新建一个对象(首先虚拟机需要从虚拟机中的“方法区”读取该类的一个对象占用内存的大小,并在堆中分配这么大的内存),并将该对象的引用压入栈(每个线程一个的java调用栈)。

6、堆:

在5里面提到了在堆上创建一个对象。其实在java中, 所有的对象和数组等都是放在同一个堆中的。在一个java虚拟机实例中,仅仅存在一个堆空间。因此所有的线程都共享这一个堆。堆空间也可以是不连续的。并且可以动态的扩展或者收缩。

7、数组

关于数组的部分没有看明白:

Java虚拟机-Firstday_第2张图片

这里不明白的是为什么维度相同的数组就是同一个类的实例。

____________________________________________魂歌____________________________________________


之前不明白的,现在大概是明白了。在java中,可以定义一个二维数组,int a[][],每一维都是一个int数组。不管第二维的int数组长度是多少,第一维都可以存放。或许这就是文章中说的,只要维数和类型相同的数组,就是同一个“类”的实例。

____________________________________________魂歌____________________________________________

8、栈帧:

Java虚拟机-Firstday_第3张图片

上面这个图右侧是一个栈帧,看下面截图:虚拟机在栈帧中对byte、short、char和boolean的处理都转换为int型来存储。之前说过虚拟机不直接支持boolean,在栈帧中,这四种类型都不支持,需要转换为int。有一点需要注意到的是,在右侧,有一个hidden的this,是对任何一个实例方法都隐含存在的,用来表示调用该方法的对象本身。记得,在Python中的构造方法中,也有类似这样一个语法。

栈帧中,存储的都是对象的引用。

Java虚拟机-Firstday_第4张图片

9、java虚拟机没有寄存器。虚拟机中指令大部分是从操作数栈而不是从寄存器中取得操作数的。另外,指令还可以从跟随在指令之后的的字节码流中或者是从方法区中去的操作数。

10、虚拟机调用本地方法的时候,从下面的5.3.9可以看出,调用本地方方法的时候,虚拟机并不会再继续操作栈了,

11、java程序执行引擎:

运行中的每一个java程序都是一个执行引擎的实例。


以上是深入java虚拟机的第五章。电子书真费眼睛,酸痛!

你可能感兴趣的:(java,虚拟机,ClassLoader,Class,byte,引擎)