先不讲java虚拟机,我们从最最基本的出发。

当我开始学习java之初,老是听我老师吹牛逼说java能跨平台,如何如何厉害,我一直有疑问,java可以跨平台,别的就不行?很惭愧,现在才正式开始总结一下:

1.、java是如何做到跨平台的,为什么有了JDK,JRE就能跨平台

2、为什么tomcat能在各个平台运行,靠的是啥,为啥运行之后访问的东西都是一样的,不会有linux和window的区别?

以下以windows平台为例

【解决第一个问题:为什么有了JDK、JRE,就能跨平台】

首先我们先了解下进程的概念:

第一,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。----来自百度百科

第二,进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),它才能成为一个活动的实体,我们称其为进程。

为什么要先了解进程的概念,在我的理解来看java虚拟机就是一个进程

然后我们在看问题,JDK和JRE分别是什么作用:最简单的理解,JDK就是个工具包,JRE全称Java runtime enviroment,java运行时环境。

jre既然是java运行环境,那么环境是怎么产生的呢?

表面上看,执行java.exe就产生了JVM,其实可以分为四步:

1.执行代码时(如JAVATEST),操作系统会查找java.exe程序,具体执行过程,先执行方法CreateExcutionEnvironment(java_md.c),在这个方法中,根据GetApplicationHome查找你的java.exe所在目录,然后截取目录c:/program/java/jdk/bin,并查找java.dll是否在此目录中,如果存在就把c:/program/java/jdk作为jre路径,如果不存在则判断c:/program/java/jdk/jre/bin/java.dll是否存在,如果存在则把c:/program/java/jdk/jre作为路径,如果不存在,则调用GetPublicJREHome查HKEY_LOCAL_MACHINE/Software/JavaSoft/JavaRuntimeEnvironment/“当前JRE版本号”/JavaHome的路径为jre路径。

其次,我们要找到相应的jvm.cfg,确定要使用哪个jvm.dll,因为在我们的jdk目录中jre/bin/server和jre/bin/client都有JVM.dll文件,所以我们从JRE路径+/lib+/ARCH(CPU构架)+/JVM.cfg找到配置文件。CPU架构ARCH是在java_md.c中getArch方法判断的,里面只有两个分支,一个是64为的,一个是X86。找到jvm.cfg之后,我们就可以确定要使用哪个jvm.dll。

2.找到jvm.dll之后,就开始载入JVM.dll,里面是C代码(dll为动态链接库文件:含义为程序共享执行特殊任务所必需的代码和资源。白话:调用系统资源,调用系统API),具体载入方法为通过LoadJavaVM(具体实现在java_md.c,line365,里面包含了createJavaVM,以及获取jvm初始化参数的方法)。装入工作很简单就是调用WindowsAPI函数:LoadLibary装载jvm.dll动态链接库,然后吧jvm.dll中的导出函数jni_createjavavm和jni_getDefaultjavavminitargs挂接到invocationFunctions变量的CraeteJavaVm和GetDefaultJavaVMInitargs函数指针变量上。

3.初始化JVM.dll并挂界到JNIENV(JNI调用接口)实例。如果jvm要调用内部代码,需要JNIEnv(包含了本地window函数的接口),jvm如果要调用的话,需要在C或者C++代码中申明。

4.调用JNIEnv实例装载并处理class类。这里必须要说一下,怎么运行java程序,一种是class运行,一种是jar。java.exe调用GetMainClassName函数,该函数先获得JNIEnv实例然后调用java类,

Java.util.jar.JarFileJNIEnv中方法getManifest()并从返回的Manifest对象中取getAttributes("Main-Class")的值即jar包中文件:META-INF/MANIFEST.MF指定的Main-Class的主类名作为运行的主类。之后main函数会调用Java.c中LoadClass方法装载该主类(使用JNIEnv实例的FindClass)。main函数直接调用Java.c中LoadClass方法装载该类。如果是执行class方法。main函数直接调用Java.c中LoadClass方法装载该类。

然后main函数调用JNIEnv实例的GetStaticMethodID方法查找装载的class主类中

“publicstaticvoidmain(String[]args)”方法,并判断该方法是否为public方法,然后调用JNIEnv实例的

CallStaticVoidMethod方法调用该Java类的main方法。
--------------------- 
参考:https://blog.csdn.net/wyt4455/article/details/8717328

【Java虚拟机】第一章、Java虚拟机是如何产生的相关推荐

  1. java篇 第一章java概述

    java概述 java是由sun公司开发的一套编程语言,主要设计者是James Gosling. java版本 1.java SE 桌面,服务器,嵌入式环境 Java SE(Java Platform ...

  2. 【Java开发语言 01】第一章 Java语言概述(基础常识+Java语言概述+Java程序运行机制及运行过程+Java语言环境的搭建+开发体验hello world+错误:编码GBK的不可映射字符)

    java入门-第一章Java语言概述 1基础常识 软件开发 人机交互方式 常用的DOS命令(win系统,有一些直接通过命令执行的) 2 Java语言概述 什么是计算机语言 关于面向对象和面向过程 Ja ...

  3. 【JAVA SE】第一章 Java语言概述、环境变量和HelloWorld

    第一章 Java语言概述.环境变量和HelloWorld 文章目录 第一章 Java语言概述.环境变量和HelloWorld 一.Java语言概述 1.Java简介 2.Java发展历史 3.Java ...

  4. 基于《java2实用教程》的java知识点复习整理【第一章——java入门】

    第一章--java入门 一.知识结构框架 二.知识点详解 1.java特点:编写一次,随处运行 简单 Java要比C++简单,C++中许多容易混淆的概念,被Java弃之不用了,或者以一种更清楚更容易理 ...

  5. Java 学习笔记:第一章 Java入门

    Java 学习笔记:第一章 Java入门 1.1 计算机语言发展史以及未来方向 1.2 常见编程语言介绍 C语言 C++ 语言 Java语言 PHP 语言 Object-C和Swift 语言 Java ...

  6. 第一章 Java环境搭建、IDEA、Java语言

    JavaSE基础大纲: 一. Java环境搭建.IDEA.Java语言 二.Java语法.运算符.随机数 三.分支.循环.控制关键字 四.数组详解.案例训练 五.方法详解.案例训练 六.面试常见编程案 ...

  7. java标识命名服务_阿里巴巴Java开发规约第一章编程规约-命名风格篇

    1.[强制] 代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束. 反例: _name /__name / $name / name_ / name$ / name__ 老四附言: ...

  8. Java极速入门系列:第一章Java概述、Java环境、IDEA开发工具

    Java极速入门-第一章Java概述.Java环境.IDEA开发工具 一.什么是Java 1.好的编程语言的特性 2.Java的特点 3.Java的运行机制 4.Java的三大体系 5.Java环境 ...

  9. 第一章 QEMU虚拟机与ARM64平台搭建

    系列文件目录 <ARM64体系结构结构编程与实践>学习与应用记录 第一章 QEMU虚拟机与ARM64平台搭建 文章目录 系列文件目录 本章前言 一.ubuntu虚拟机安装 1.ubuntu ...

  10. java 3D 第二章 java 3D基本概念

    java 3D 第二章 java 3D基本概念 java 3D基本概念 java 3D的包及其功能 java 3D 高分辨率大尺度坐标 Java 3D场景图(Scene Graph) VirtualU ...

最新文章

  1. 用Android UEventObserver监听内核event
  2. Java 基础 之 赋值运算符
  3. 小汤学编程之JAVA经典例题——嵌套集合
  4. python做日历牌_中秋节到了,送你一个Python做的Crossin牌“月饼”
  5. 无法重新声明块范围变量。此处也声明了 。_Go 语句块与作用域
  6. Ruby数组(2):数组方法详细整理
  7. BC95-G NB-IOT 模块使用
  8. JavaScript模态框实现
  9. 魔兽世界拍卖行稳定服务器,魔兽世界TBC:大量玩家拍卖行卡到抓狂,分析其中可能的原因...
  10. python显示中文字_Python - 图片上显示中文字符
  11. 如何用python画太阳花
  12. 【rmzt:进击的巨人三笠帅气主题】
  13. 最小生成树-Borůvka算法
  14. 小米 note3 android,小米NOTE3 MIUI9.6稳定版 开启全面屏手势和屏蔽经典物理按键全攻略...
  15. 跨平台测试框架--STAF介绍
  16. 让笔记本触摸板默认关闭
  17. 分数阶傅立叶变换中午matlab,怎么做短时分数阶傅里叶变换
  18. 几种查询局域网内在线弱电设备IP地址的方法,总有一款你会用的到
  19. L->data 与 L.data比较
  20. 为黑客打工能挣多少?月薪最高达2万美元

热门文章

  1. in-place运算总结
  2. jquery文字提示框
  3. 【小样本分割 2020 ICCV】PANet
  4. My sql 统计一个字段某种类型的总数(非group by)
  5. puzzle(0711)《机关排布》接水管、搭桥
  6. 教你快速给多段视频添加同一个片尾和转场特效
  7. 矩阵论极简笔记(2):列空间、正交补、零空间、行空间
  8. 物理系统碰撞相关原理及算法
  9. codeforces EDU suffix array
  10. 应该从哪些方面选择适合自己的光时域反射仪?