Java学习笔记(二)JVM运行原理

继上篇java基础总结篇后,来总结一下Java的编译,JVM启动流程和运行原理。首先简要介绍一下JDK和JRE,JDK是针对Java开发人员的产品,它包括了Java运行时环境JRE、Java工具(编译工具javac、生成文档工具javadoc等)和Java基础类库。JRE是运行JAVA程序所必须的环境集合,包含JVM标准实现及Java核心类库。JVM是Java Virtual Machine(Java虚拟机)的缩写,是整个java实现跨平台的最核心部分,所有的java程序会首先被编译为.class文件,这种文件可以在虚拟机上执行,也就是说class并不直接与机器的操作系统相对应,而是经过虚拟机间接与系统交互,有虚拟机将程序解释给本地系统执行。只有JVM还不能执行class,因为在解释class的时候JVM需要调用解释所需要jre中的类库lib。JVM屏蔽了与具体操作系统平台相关的信息,使得程序只需生成在java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java中一切皆对象,它的运行需要核心类库的支持,jdk中还提供一些java工具和基础类库,并且形成了三个版本的jdk,J2SE、J2EE和J2ME,它们所提供的类库不同,集成的框架不同,定义的标准不同。J2EE只是Java的企业应用,有一系列的规范集,包括JDBC、JNDI、EJBs、RMI、JSP、Servlets、XML、JMS、Java IDL、JTS、JTA、JavaMail和JAF等规范集。J2EE的新名称为JavaEE,J2EE只是一个企业应用,而我们需要一个跨J2SE/WEB/EJB容器的微容器,保护我们的业务核心组件,以延续它的生命力,而不是依赖J2SE/J2EE。

一、编译

Java源文件需要被编译成class文件才能被JVM解释执行,下面看一下.class字节码文件都有哪些写内容呢?

java源码如下:

package test;
class A {
	String name = "A";
	public void print(){
		int a = 6;
		System.out.println(name);
	};
	
}
public class B extends A{
	String name = "B";
	public void print(){
		int a = 8;
		System.out.println(name);
	}

}

编译生成的B.class字节码文件16进制显示部分如下:


其中包含了:魔数及主次版本信息、常量池、访问标识access_flags、(类索引、父类索引、接口索引集合)、字段表集合、方法表集合、属性表集合。我们通过javap工具来看一下class文件,运行javap -verbose B.class:




结果主要显示了常量池和方法的字节码信息,我们这里不对class中其它的信息做讨论,只查看方法和常量池,因为它涉及到JVM解释执行时的符号引用与直接引用。

常量池constant pool里面主要存放两大类数据,字面量和符号引用。字面量如文本字符串,声明为final的常量值。符号引用包括类和接口的全限定名,字段的名称和描述符,以及方法的名称和限定符。

由于java代码在进行javac编译时,并不像C和C++那样有连接这一步,而是在虚拟机加载class文件的时候进行动态链接。也就是说class文件中,并不会保存各个方法字段的最终内存布局信息。当虚拟机运行的时候,需要从常量池获得对应的符号引用,再在类创建时或者运行时解析,翻译到具体的内存地址中。从上图中可以看到,常量类型有Class、Utf8、Fieldref、Methodref、String、NameAndType等,我们来考察print()方法里的一条字节码指令:

invokevirtual #27 //Method java/io/PrintStream.println:(Ljava/lang/String;)V

它的操作码是invokevirtual,操作数时#27,这个操作数是指常量池的下标,那么去找下标为27的常量池项,是:

#27 = Methodref #28.#30 // java/io/PrintStream.println:(Ljava/lang/String;)V

后面的#28#30也是常量池的两项,顺着这条线索把能传递引用到的都找出来,会看到(按深度优先顺序):

#27 = Methodref #28.#30 // java/io/PrintStream.println:(Ljava/lang/String;)V

#28 = Class #29 // java/io/PrintStream

#29 = Utf8 java.io.PrintStream

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值