java跨平台扩展
提问1:为什么java语言有跨平台特性
1、因为是运行在JVM虚拟机上的,而不是CPU上的
2、一次编译,多次运行的,就是说java编译器会将源文件编译为二进制字节码(class),然后拿这字节码去jvm上直接运行(解释执行)的
3、主要是在jvm上运行的,那么有jvm就可以四处运行(而jvm是安装jre或jdk就有的,window或unix不自带)
以上三点baidu下就有了,但我理解的还有一点都没说出来,即
4、那么主要是java是运行在jvm上的,所以它的代码就能不经修改在不同平台的jvm上运行(因为别人(设计师)已经开发好了window或unix的jvm)
提问2:我们常说的jvm是指啥?类似jre,jdk都是包括在一个文件夹里的文件,那么jvm大概是在哪里呢?有具体的文件或路径吗?
如果有人问jvm的定义是啥?
答曰:jvm是java程序(java二进制字节码)的运行环境。
拓展:负责与操作系统交互的,用来屏蔽操作系统环境的 --引申出–> 跨平台、平台无关性
是Java程序运行的环境,但是他同时一个操作系统的一个应用程序一个进程,因此他也有他自己的运行的生命周期,也有自己的代码和数据空间。
怎么理解上面的后半段呢,这里就涉及到jvm的生命周期
jvm并不是装载一次后就一直存在的
1、jvm实例的诞生:当一个java程序启动时,产生一个jvm实例。任何一个拥有public static void main(String[] args)函数的class都可以作为JVM实例运行的起点
2、Jvm实例的运行: main()作为该程序初始线程的起点,任何其他线程均由该线程启动,
说明 :jvm内部有两个线程:
守护线程:jvm自己使用的线程(垃圾回收线程)
普通线程:java线程 (main函数)
3、jvm实例的消亡: 当程序中的所有非守护线程都终止时,JVM才退出
参考:https://www.jianshu.com/p/0fce7902c336
此处回答提问2的jvm具体的文件或路径:
1.创建JVM装载环境和配置:当运行一个java程序时,会根据path找到java.exe, java.exe会根据一系列的过程查找到jvm的路径和参数的配置,过程如下:
a. 首先查找jre路径:
a1、Java是通过GetApplicationHome api(该方法存在于java_md.c,个人理解为此处java调用c的一个方法获取)来获得当前的Java.exe绝对路径
a2、C:\j2sdk1.4.2_09\bin\Java.exe,那么它会截取到绝对路径C:\j2sdk1.4.2_09\,判断C:\j2sdk1.4.2_09\bin\java.dll文件是否存在, 如果存在就把C:\j2sdk1.4.2_09\作为jre路径
b 如果不存在则判断C:\j2sdk1.4.2_09\jre\bin\java.dll是否存在,如果存在这C:\j2sdk1.4.2_09\jre作为jre路径.
如果不存在调用GetPublicJREHome查HKEY_LOCAL_MACHINE\Software\JavaSoft\Java RuntimeEnvironment\“当前JRE版本号”\JavaHome的路径为jre路径
2.装载jvm.dll: 通过第一步已经找到了JVM的路径,Java通过LoadJavaVM来装入jvm.dll文件
3.初始化JVM.dll并挂界到JNIENV(JNI调用接口)实例:初始化JVM,获得本地调用接口
4.调用JNIEnv实例装载并处理class类。运行jar:Java -jar XXX.jar;运行class文件
那么这里的jvm.dll可以理解为jvm的文件路径所在(个人方便理解)
后续jvm深入了解可以参考
https://blog.csdn.net/ligh_sqh/article/details/79481040