分享
 
 
 

JAVA虚拟机实例学习笔记二

王朝java/jsp·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

11.数组

数组也是类的对象。具有相同类型和维数的数组属于同一个类(不管长度只看维数)。数组的长度属于对象实例。多维数组也是一维数组。如二

维数组,即为一个一维数组,该一维数组的每个元素是一个数组的引用。数组和普通对象一样也存储在堆中。

数组名为数组的引用,通过索引即数组标号来访问数组内容。

12.异常

在java栈帧的帧数据区内保存有针对该方法的异常表的引用。异常表记载了该方法的字节码(*.class)受catch子句保护的范围(即try子句里的

字节码)。当某个方法抛出异常时,虚拟机在对应的异常表中寻找匹配的catch子句,并将控制权交给catch子句中的代码。

13.java执行引擎

实现平台无关性,以java方法帧里的操作数栈为中心,将局部变量数组当作cpu的寄存器。每操作一个数据都要压人操作数栈,然后返回至局部

变量区。java虚拟机规定强类型转换,即低精度可以隐式转换到高精度,高精度必须强制转换到低精度。

14.线程

线程即存在于进程中的某个执行体。

每个线程必须遵守对象锁定,线程等待和通知。

对象锁定使线程互斥的访问对象资源。等待和通知则是遵守线程合理调度以达到同一个目的。java对象通过指令集达到上锁目的,同过继承

object类的wait(),notify(),notifyall()方法来等待和通知。当某个线程调用某个对象的wait()方法时,该线程被阻塞,并加入到该对象的线

程阻塞队列中,直到另一个线程调用同一对象的通知方法,才能唤醒阻塞队列中的线程。

15.常量池

常量池用来存放类型的各种信息,包括类型的各种直接常量,和对其他类型,字段,方法的符号引用。

常量池分为两种,存储在.class字节码中的常量池和存储在方法区中的运行时常量池。

常量池以入口形式(类似于中断向量表)出现,每个入口都指向一个表,表中存储常量的信息。但从常量池的入口的标志位就可以判断对应的表

中存储的常量类型。

常量池入口以一个标志位开始,该标志位指示该常量的类型。每个入口对应一个表,该表以符号_info结尾,表中存放常量的压缩形式。

常量池除了存放直接常量外还容纳如下几种符号引用:

类和接口的全限定名。

字段名称和描述符(该描述符是一个指示字段类型的字符串。字段是一个类或接口的类变量或实例变量)。

方法名称和描述符(该描述符指示方法返回类型,参数类型,数量,顺序)。

运行时,虚拟机用常量池的全限定名和方法,字段的描述符来建立类与类的关系。

常量池仅仅是一个引用和描述符的集合,并不接受任何赋值操作。

所有对象的创建,方法和类变量的调用均要从常量池中获取信息,但实例变量的调用从堆里获得。(猜想)

符号引用是由虚拟机解析后得到具体的地址来使用。

常量池解析就是将常量池中的符号引用替换成直接引用。

当要使用某个类的方法或字段时,首先从常量池中找到该方法或字段的符号引用,然后进行解析,找到其物理地址。

把代码中出现的各种符号引用,类与类的联系,进行常量池解析,叫做动态连接。

16.常量池结构

常量池由很多狠多的单元组成,每一个单元都形如(入口|内容),访问常量池单元时通过索引找到入口,然后访问其内容。但有时单元的内容也

可能是一个常量池入口(比如类或接口的常量池单元,入口包含该类的符号引用即constant_class_info,而内容则指向一个

constant_utf8_info的常量池单元,该单元里存放了该类的全限定名)。而直接常量如int,float等,内容处就是常量的值。

17.方法区的结构

方法区存储所有关于类型,接口的信息。方法区包含:

常量池:存储类型的直接常量和所有的字段,方法,其他类型的符号引用(仅仅是引用,并不存放具体信息)。

字段信息:所有声明的字段(包括字段名,类型,修饰符)。

方法信息:所有定义的方法(包括方法名,返回类型,修饰符,方法的字节码,方法栈帧的大小,方法的异常)。

类变量信息:虚拟机在方法区中为所有类变量分配空间,以后的初始化,赋值等操作也在方法区中进行,以便为所有类实例共享。

为提高访问速度,虚拟机在方法区中为每个非抽象类设置了一个方法表,该表是一个数组,每个元素是一个方法的直接引用。当类的对象调用

方法时,就在方法表中搜索(抽象类没有实例,所以不用调用方法,所以没有方法表)。

18.堆

堆存放类的实例和数组(包括实例变量,指向对应方法区中类数据的引用)。

19.一个例子

class test{

public static void main(string args[])

{

string a=new string("hello");

string b=new string("hello");

string c="hello";

string d="hello";

}

}

则a==b返回false,c==d返回ture。

因为:==比较双方是否是同一个对象。

首先:

string a=new string("hello")

string b=new string("hello")

a和b分别各自新建了hello的对象和引用变量,即在堆中有两个hello,他们各自的引用是a和b。

而:

string c="hello"

string d="hello"

先建立一个字符串类实例hello,再建立两个字符串引用变量c和d,然后让c和d都指向开始建立的hello实例。因此c和d指向的是同一个对象。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有