Windows中的JDK和Linux中的JDK是否相同
前言
在面试中,被问到了一个问题:
Windows中的JDK和Linux中的JDK是否相同?
其实,以上这个问题是一个子问题。原本的问题是:如何理解Java的跨平台机制。由于原问题显得有些宽泛,因此延伸出一个子问题,在本篇博客中争取能够完整地回答。
本文力求建立起自己知识体系中Java的基石,希望在阅读本文之后,同时可以很好地回答上述的跨平台机制这个基础问题。
一、JDK的架构
下面这张是从Oracle官方文档中找到的JDK架构图,非常细致的展现了JDK每个层级的架构和组件。以下将会挑选重点,谈谈自己的理解。
JDK
首先我们来看JDK的组成,总的来说,JDK包括两部分:
- 第一部分是Tools & Tool APIs,这包括了将java文件编译成为class文件的工具,比如javac,java,还有调试java程序的各种工具;
- 第二部分是JRE,JRE是Java的运行时环境,被编译后的java程序,就是在JRE中得到执行。
由于本文只想要分析JDK、JRE等比较宏观的相关概念,所以可以将上面的复杂的JDK架构图简化,得到下面一张简图。 从中可以很好的看到JDK、JRE和JVM的架构关系。
JRE
JRE是Java的运行时环境,总的来看,包括三部分内容:
- 首先是java的class文件或者是java的package,这些class文件和package有时需要和被编译后的java程序一起,得到执行;
- 第二是java运行时的库文件,例如rt.jar,有了库文件的支持,被编译后的java文件才能得到正确的执行;
- 第三是JVM。JVM是Java虚拟机,是真正执行Java程序的地方。它使用了第一部分的java的class和第二部分的库文件来实际运行Java程序。不同的操作系统或者平台中,JVM是不同的。
看到这里,相信已经可以回答文章开头提出的问题了。Windows中的JDK和Linux中的JDK是否相同?回答是,不相同的!
JVM
JVM是Java虚拟机,是Java程序真正得到执行的地方。不同的操作系统或者平台中,JVM是不同的。这也就是为什么Oracle的官网上提供了不同平台的JDK给用户下载。
二、Java程序的编译和执行
下面从JDK,JRE等角度,来简略的描述Java程序编译和执行的流程。流程图如下所示:
- Java源代码,也就是java文件,首先会被JDK编译,具体来说,是被JDK中的Java Compiler编译了,然后就会生成Java字节码(Java Bytecode),这个Bytecode,就是class文件。
- Bytecode会被传输到JVM中,JVM会使用JRE中的java class和库文件与Bytecode一起编译执行。
- 所谓的编译执行,其实质上还是编译的过程,也就是说,JVM接收的输入是Java Bytecode,处理后的输出是基于特定平台和操作系统的机器码,这里说的机器码,也可以被认为是一组指令集。
- 可以看到在JVM中,有一个橙色的框,是JVM中包含的JIT Complier。JIT Compiler的作用是,对Java Bytecode中的部分字节码进行优化,这样可以生成更高效的机器码,被底层的物理硬件执行。
总结
写到这里,可以对“Windows中的JDK和Linux中的JDK是否相同”,或者“如何理解Java的跨平台特性”,进行回答。
- Java平台的跨平台特性,从最基础的角度来说,是因为JVM。不同操作系统或者平台上的JVM是不同的,因为JVM要把Java字节码编译成为机器码,机器码才是真正物理硬件执行的指令集。由于不同操作系统或者平台的硬件架构不同,所以必须制作不同的JVM,安装在不同的操作系统或者平台上。
- 看到一位网友的总结,觉得很好:正是因为JVM的不跨平台特性,才实现了Java语言的跨平台特性。
- Java的概念中,有“一次编写,到处运行”,即“Write Once, Run Anywhere”。真正跨平台的,是Java字节码,简单理解就是编译后的class文件。
- 例如,在Windows上,我javac了一个最简单的HelloWorld的Java程序,生成了HelloWorld.class,然后我可以java HelloWorld来执行它。此时,我把HelloWorld.class拷贝到Linux环境中,同样java HelloWorld来执行,可以得到与Windows中相同的结果。事实上,如果我拷贝HelloWorld.java文件到Linux环境中,同样javac,生成的class文件也是相同的。
- 为了在不同的操作系统中把相同的java程序编译成为相同的Java字节码,jdk中bin目录下的编译工具是不相同的,例如javac工具和java工具;因为要将Java字节码编译成为特定平台上的机器码,所以JVM所依赖的JRE中的库文件也是不同的,例如rt.jar。
- 所以,Windows中的JDK和Linux中的JDK是完全不同的,相同的是可以在两者之间通用的Java字节码。
创作时间:10/11/2016 4:30:18 PM
Windows中的JDK和Linux中的JDK是否相同的更多相关文章
- Linux下载jdk ,Linux如何下载jdk
Linux下载jdk Linux如何下载jdk >>>>>>>>>>>>>>>>>>> ...
- windows系统作为客户端时,linux中本地yum源挂载时,如何同时挂载DVD1和DVD2?
这里以CentOS6.5为例.他的镜像有两个DVD1和DVD2.DVD1中是系统和主要的安装包,DVD2中是剩下的安装包 当挂载时如果要同时挂载DVD1和DVD2.需要这样做: 1)在虚拟机的设置中选 ...
- Windows中的"簇"和Linux中的"块"是对应的
扇区是对硬盘而言,块是对文件系统而言. 簇”又称为“分配单元” ,文件系统是操作系统与驱动器之间的接口,当操作系统请求从硬盘里读取一个文件时,会请求相应的文件系统(FAT 16/32/NTFS)打开文 ...
- 关于 java中的SecureRandom在linux中每次生成不同结果
使用AES算法的时候,会发现下面的代码在windows每次产生确定的结果,但Linux就不同,导致无法正确解密 public static String encrypt(String content, ...
- linux中的&&和||(linux中=和==效果是一样的)
1. 命令1 && 命令2 命令1执行成功在执行命令2 2. 命令1 || 命令2 命令1执行失败后在执行命令2 我觉得这完全就是判断呀.
- windows与linux中的mysql配置主从
最近在给学生讲解数据库的主从配置,由于学生电脑里面装的虚拟机是linux的,但是本机的系统是windows的,所以需要用windows中的mysql与linux中的mysql进行主从配置.下面说一下主 ...
- linux中配置JDK环境变量
使用的centos版本为 7.5 首先我们要把jdk拷到linux中,这里我们借助XShell工具,我们先来看看Xshell的用法 打开Xshell 后点击文件,“新建“,如下图: 起一个名称,主机填 ...
- Windows 系统文件夹目录挂载到 Linux服务器中
在Windows系统文件上传到Linux服务器时有时候很麻烦,因为Linux无界面的系统不像Windows系统一样,可以直接复制粘贴,下面方法可以解决Windows系统文件拷贝到Linux服务器. 1 ...
- (原创)Windows下编译的Shell脚本不能再Linux中运行的解决办法
一.原理 Windows编译的文件和Linux编译的文件格式不太一样,导致在Linux运行Shell脚本的时候会提示:/bin/bash^M: bad interpreter: 没有那个文件或目录. ...
随机推荐
- python安装及pyCharm使用
1.官网下载Python https://www.python.org/downloads/
- WCF客户端简单动态配置服务地址
本来想实现WCF服务无论放到哪个机器上,我的客户端都不需要重新编译,只需要配置一个服务的地址即可.各种百度找到了很多解决方案.但都比较繁琐,(只要因为个人小菜看不懂太多的代码)我对WCF内部机制还不了 ...
- 二 mysql库表的详细操作
目录 1.库操作 1.创建数据库 2.数据库相关操作 2.表操作 1.存储引擎 2.表介绍 3.创建表 4.查看表结构 5.MySQL的基础数据类型 6.表的完整性约束 7.修改表 alter tab ...
- java架构之路-(JVM优化与原理)JVM类的加载机制
话不多说,先上图. ***.class文件执行大概就是这样来走的.我们都知道我们的java文件经过编译以后会生成对应的class文件.先经过类装载子系统,然后塞进运行时内存模型的元空间,开始执行方法, ...
- 一个随意list引发的惨案(java到底是值传递还是引用 传递?)
前两天写了一个递归,因为太年轻,把一个递归方法需要用到的list定义该递归方法外了,结果开始断点测试的时候有点小问题 ,然后上线之后因为数据量太多导致了一个java.util.ConcurrentMo ...
- hadoop之yarn详解(框架进阶篇)
前面在hadoop之yarn详解(基础架构篇)这篇文章提到了yarn的重要组件有ResourceManager,NodeManager,ApplicationMaster等,以及yarn调度作业的运行 ...
- 一致性哈希(PHP核心技术与最佳实践)
<?php /** * 分布式缓存部署方案 * 当有1台cache服务器不能满足我们的需求,我们需要布置多台来做分布式服务器,但是 * 有个问题,怎么确定一个数据应该保存到哪台服务器上呢? * ...
- 时间复杂度————被list.insert坑了
今天被一个很简单的坑到了,还想了很长时间,insert 函数,真的知道它内部执行的操作吗? 开始其实是在看一本算法的书,书里面给了两段工作内容差不多的伪代码 第一段如下: data = [] whil ...
- Cohen-Sutherland算法
Cohen-Sutherland算法 本算法又称为编码裁剪算法,算法的基本思想是对每 条直线段分三种情况处理: (1)若点p1和p 2完全在裁剪窗口内 “简取”之 (2)若点p1(x1,y1)和p2( ...
- Java学习笔记之面向对象
面向对象概念 面向对象编程 &面向过程编程 面向对象:关心是谁来做 面向过程:关心的是怎么做 面向对象总结成一句话:就是分工与协作,干活的是对象 生活中: 对象 -----抽象-------- ...