1.JVM(Java Virtual Machine):Java虚拟机。
①是一个虚构出来的计算机规范结构。
②是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
③是Java最核心的部分,在计算机内存中虚拟并提供了java代码可以在其中运行的基础环境。
④是java代码和计算机之间的一个桥梁。
1.编写好的java代码,编译成了class文件,然后加载到JVM中再运行。
java代码编译后计算机并不能直接运行,必须要经过JVM进行解释后,才能运行。所以,java其实并不算是真正的编译语言。
2.JVM本质上是一个规范,每个公司都可以按照这个规范实现自己的JVM虚拟机。
我们现在默认使用的JVM就是oracle公司提供的名为HotSpot的虚拟机。
3.当使用java命令来运行程序的时候,会先启动JVM,这个JVM在JDK中对应了一个dll或so文件。而Linux下面的so文件就类似于Windows中的dll文件。
2.GC(Garbage Collection):垃圾回收器。
①在java语言中,编程人员不需要在代码中控制内存的开辟和释放。
在java代码中,开辟要使用的内存空间,使用new关键字即可完成。
在JVM中,对内存空间的释放,使用GC来完成。
②在JVM中,不同类型的GC,会根据不同的算法,对不同的内存区域内标记为垃圾的空间,进行回收释放。这个过程不需要编程人员的干预,会主动完成。
③在代码中,也可以调用JavaSE-API提供的方法,通知GC现在去进行垃圾回收的工作:
java.lang.System.gc();
java.lang.Runtime.gc();
虽然可以主动通知,但是最后GC并不一定会真的的立刻执行。因为这个垃圾回收的过程什么时候执行,最终还是要根据GC的具体算法和当前内存的使用情况来确定。
3.字节码验证:
(1)编写好的java代码,编译成class文件(字节码),再被JVM加载到内存之后,首先要经过字节码验证主要包括:
①检查当前class文件的版本和JVM的版本是否兼容。
②检查当前代码是会破坏系统的完整性。
③检查当前代码是否有栈溢出的情况。
④检查当前代码中的参数类型是否正确。
⑤检查当前代码中的类型转换操作是否正确。
(2)验证通过后,再确定哪些代码是解释执行的,哪些代码是JIT即时编译执行的。
①class文件内容需要让JVM进行解释执行,解释成计算机可以执行的代码。整体效果就是JVM解释一行代码就执行一行代码。所以如果java代码全是这样的运行方式的话,效率会稍低一些。
②JIT(Just In Time):即时编译。
这是执行代码的另一种方式,JVM可以把java中的热点代码直接编译成计算机可以运行的代码,这样接下来再调用这个热点代码的时候,就可以直接使用编译好的代码让计算机直接运行,提高了运行效率。