JVM原理
1.JVM是由软件技术模拟出的Java编译器与os平台之间的虚拟计算机,我们编写出的Java程序不能直接被操作系统直接识别,此时就需要JVM出来翻译,java程序经编译器编译产生.class文件(即字节码文件),而字节码文件又通过ava虚拟机中的解释器(字节码指令集)编译成特定机器上的机器码;
2.JVM针对每个操作系统开发其对应的解释器,所以只要其操作系统有对应版本的JVM,那么这份Java编译后的代码就能够运行起来,每一种平台的解释器是不同的,但是实现的虚拟机是相同的,因此Java能一次编译,到处运行,可跨平台;
3.当一个程序开始运行,虚拟机就开始实例化,一个Java程序会开启一个JVM进程,如果一台机器上运行多个程序,那么就会有多个运行中的JVM进程;程序停止或结束,虚拟机实例化 也结束;多个虚拟机实例之间数据不能共享;
4.java中线程有两种:守护线程,普通线程
守护线程是JVM自己使用的线程,比如垃圾回收(GC)。
普通线程是java程序的线程,只要JV吗中有普通线程在执行JVM就不会停止。
此题的简单回答:
java源文件由jre编译成为字节码文件,jvm会根据编译的字节码文件(.class)调用类装载器进行装载ClassLoader,并验证文件的属性(方法,修饰符,属性等)信息和错误信息,最后使用反射机制初始化类对象。 |
详细答案:
JVM的运行机制主要包括以下三个部分: 1.类装载子系统:装载具有适合名称的类或接口 Java执行原文件的过程: Java源文件—->编译器—->字节码文件—->JVM—->机器码。 装载:类装载器class loader负责加载.class文件:JVM通过类名、类所在的包名通过ClassLoader来完成类的加载,同样,也采用以上三个元素来标识一个被加载了的类:类名+包名+ClassLoader实例ID 连接:链接过程负责对二进制字节码的格式进行校验、初始化装载类中的静态变量以及解析类中调用的接口、类;在完成了校验后,JVM初始化类中的静态变量,并将其值赋为默认值。最后一步为对类中的所有属性、方法进行验证,以确保其需要调用的属性、方法存在,以及具备应的权限(例如public、private域权限等),会造成NoSuchMethodError、NoSuchFieldError等错误信息。 初始化:初始化过程即为执行类中的静态初始化代码、构造器代码以及静态属性的初始化,在四种情况下初始化过程会被触发执行:调用了new;反射调用了类中的方法;子类调用了初始化;JVM启动过程中指定的初始化类。 2.执行引擎:负责执行包含在已装载的类或接口中的指令 每个线程在创建后,都会产生一个程序计数器(pc)和栈(Stack),其中程序计数器中存放了下一条将要执行的指令,Stack中存放Stack Frame,栈帧,表示的为当前正在执行的方法,每个方法的执行都会产生Stack Frame,Stack Frame中存放了传递给方法的参数、方法内的局部变量以及操作数栈,操作数栈用于存放指令运算的中间结果,指令负责从操作数栈中弹出参与运算的操作数,指令执行完毕后再将计算结果压回到操作数栈,当方法执行完毕后则从Stack中弹出,继续其他方法的执行。 在执行方法时JVM提供了invokestatic、invokevirtual、invokeinterface和invokespecial四种指令来执行: (1)invokestatic:调用类的static方法 (2) invokevirtual: 调用对象实例的方法 (3) invokeinterface:将属性定义为接口来进行调用 (4) invokespecial: JVM对于初始化对象(Java构造器的方法为:<init>)以及调用对象实例中的私有方法时。 3.运行时数据区:方法区, |