【Java虚拟机】第一章、Java虚拟机是如何产生的
先不讲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虚拟机是如何产生的相关推荐
- java篇 第一章java概述
java概述 java是由sun公司开发的一套编程语言,主要设计者是James Gosling. java版本 1.java SE 桌面,服务器,嵌入式环境 Java SE(Java Platform ...
- 【Java开发语言 01】第一章 Java语言概述(基础常识+Java语言概述+Java程序运行机制及运行过程+Java语言环境的搭建+开发体验hello world+错误:编码GBK的不可映射字符)
java入门-第一章Java语言概述 1基础常识 软件开发 人机交互方式 常用的DOS命令(win系统,有一些直接通过命令执行的) 2 Java语言概述 什么是计算机语言 关于面向对象和面向过程 Ja ...
- 【JAVA SE】第一章 Java语言概述、环境变量和HelloWorld
第一章 Java语言概述.环境变量和HelloWorld 文章目录 第一章 Java语言概述.环境变量和HelloWorld 一.Java语言概述 1.Java简介 2.Java发展历史 3.Java ...
- 基于《java2实用教程》的java知识点复习整理【第一章——java入门】
第一章--java入门 一.知识结构框架 二.知识点详解 1.java特点:编写一次,随处运行 简单 Java要比C++简单,C++中许多容易混淆的概念,被Java弃之不用了,或者以一种更清楚更容易理 ...
- Java 学习笔记:第一章 Java入门
Java 学习笔记:第一章 Java入门 1.1 计算机语言发展史以及未来方向 1.2 常见编程语言介绍 C语言 C++ 语言 Java语言 PHP 语言 Object-C和Swift 语言 Java ...
- 第一章 Java环境搭建、IDEA、Java语言
JavaSE基础大纲: 一. Java环境搭建.IDEA.Java语言 二.Java语法.运算符.随机数 三.分支.循环.控制关键字 四.数组详解.案例训练 五.方法详解.案例训练 六.面试常见编程案 ...
- java标识命名服务_阿里巴巴Java开发规约第一章编程规约-命名风格篇
1.[强制] 代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束. 反例: _name /__name / $name / name_ / name$ / name__ 老四附言: ...
- Java极速入门系列:第一章Java概述、Java环境、IDEA开发工具
Java极速入门-第一章Java概述.Java环境.IDEA开发工具 一.什么是Java 1.好的编程语言的特性 2.Java的特点 3.Java的运行机制 4.Java的三大体系 5.Java环境 ...
- 第一章 QEMU虚拟机与ARM64平台搭建
系列文件目录 <ARM64体系结构结构编程与实践>学习与应用记录 第一章 QEMU虚拟机与ARM64平台搭建 文章目录 系列文件目录 本章前言 一.ubuntu虚拟机安装 1.ubuntu ...
- java 3D 第二章 java 3D基本概念
java 3D 第二章 java 3D基本概念 java 3D基本概念 java 3D的包及其功能 java 3D 高分辨率大尺度坐标 Java 3D场景图(Scene Graph) VirtualU ...
最新文章
- 用Android UEventObserver监听内核event
- Java 基础 之 赋值运算符
- 小汤学编程之JAVA经典例题——嵌套集合
- python做日历牌_中秋节到了,送你一个Python做的Crossin牌“月饼”
- 无法重新声明块范围变量。此处也声明了 。_Go 语句块与作用域
- Ruby数组(2):数组方法详细整理
- BC95-G NB-IOT 模块使用
- JavaScript模态框实现
- 魔兽世界拍卖行稳定服务器,魔兽世界TBC:大量玩家拍卖行卡到抓狂,分析其中可能的原因...
- python显示中文字_Python - 图片上显示中文字符
- 如何用python画太阳花
- 【rmzt:进击的巨人三笠帅气主题】
- 最小生成树-Borůvka算法
- 小米 note3 android,小米NOTE3 MIUI9.6稳定版 开启全面屏手势和屏蔽经典物理按键全攻略...
- 跨平台测试框架--STAF介绍
- 让笔记本触摸板默认关闭
- 分数阶傅立叶变换中午matlab,怎么做短时分数阶傅里叶变换
- 几种查询局域网内在线弱电设备IP地址的方法,总有一款你会用的到
- L->data 与 L.data比较
- 为黑客打工能挣多少?月薪最高达2万美元