来张图:这个帖子写给新人的,老玩家就直接无视他,因为这个完完全全是白话基础原理。

解释:上面的图是从上往下依次调用的关系。

操作系统(Windows/Linux)管理硬件,让硬件能够正常、合理的运行,当然各种硬件的驱动实现了操作系统的接口,操作系统调用这些接口就能管理硬件,操作系统还像程序员提供了一层接口,叫做系统呼叫层,程序员可以面向这一层的接口编程,来实现对计算机的控制,而不同的操作系统(或者说不同的CPU架构)所提供的接口都是不一样的,Windows和Linux提供给的那肯定是完全不一样的,虽然站在最终的角度来看都能实现某一功能。所以同样一个程序是不能在不同的系统上运行的,甚至可能在同一个系统的不同版本都不一定能完美运行,这就是所谓的平台相关的程序,比如C/C++程序,然而计算机和互联网的飞速发展,计算机种类和型号千千万,操作系统也有很多种类,Window、Linux、iOS等,同样一款软件不能不做改变就在不同的操作系统上面运行,这对开发者来说不是很友好。Java语言就能解决这个问题(说成是Java平台更准确,JVM+JavaAPI),鉴于不同的操作系统所需要的程序是不一样的,那么就可以寻找一个方法来解决这个问题,于是JVM就诞生了,又JVM来向下关联所有操作系统,他能操作所有操作系统,向上提供统一接口,也就是JavaAPI,开发者只需要面向JVM(JavaAPI)编程,至于JVM是如何各种不同的操作系统打交道开发者完全不用管,管他是怎么沟通交流的,于是只要面向JVM+JavaAPI编程,一个程序可以在任意操作系统平台上面运行,这就是所谓的跨平台,Java代码和平台是无关的,没有任何关系。---而这,就是Java的跨平台性质。

  特别指出:也并不是只能面向JavaAPI编程,其实也可以掉本地接口,只不过不推荐这样做,这样就跟平台相关了,除非万不得已,否则就只使用JavaAPI,据我的经验,还没见过Java不能解决而需要调用本地接口的问题,可能是我才疏学浅。

  其实这个理念跟Linux的shell是一样的,Linux操作系统管理硬件,Linux向上提供统一接口,而Shell(就等于是上面的JVM)作为命令输入这和操作系统接口的中间人,中间人会将输入的命令解释给操作系统接口来管理和调用各种硬件,只不过shell没有JVM做得那么彻底,这也就是为什么对于那么多不同的shell来说,输入的命令都基本上是一样的的道理。我们形象的称之为“壳”,说白了跟设计模式里面的门面模式一个道理,让用户能控制的都是安全稳定的,有风险的或者不希望用户触摸得到的就隐藏在门面后面。同事“壳”也能调用其他应用,像什么ls -l,vi,fdisk -l,df -h这种。

  举个例子:我们国家有很多方言,比如广东人至听得懂广东话,四川人只听得懂四川话,天津人只听得懂天津话,这些方言就是所谓的地域相关的语言,对应计算机软件来说就是平台相关性,如果我一个北京人要跟广东、四川和天津人说话,我必须要会说这三种方言,这对于我的语言能力来说很痛苦,要学会这三种话。但是我们知道湖南卫视汪涵很牛逼,会说各种方言,我把他请来当翻译,汪涵就是JVM,他能说这三种方言,并且他只听懂得普通话,但是会说各种方言,这好像有点奇怪,所有想要跟广东、四川和天津打交道的人都跟汪涵说普通话,让他来帮忙翻译,我们说一句他翻译语句,这样的最终目的我们只需要学会普通话就可以跟任何人交流了。这就是Java平台。正是因为多了中间翻译人这么一个过程,所以很明显我说普通话跟广东人交流显得很慢,需要等汪涵来翻译,肯定是没有我直接说广东话来的直接。这也就是为什么Java比C/C++慢的原因,虚拟机需要解释执行。虽然速度慢,但是换来的是我们只需要说普通话就能跟所有人交流,这样的代价是值得的,而且虚拟机性能和各种Java技术的发展,这个解释执行的过程越来越快,以后说不定就追上C/C++了,也就是汪涵的语速会变得和好声音华少的语速,甚至再快,到了周杰伦唱歌速度那么快,我们和不同地区的人交流就更快了。当然现在的JVM不仅仅是逐行解释执行,还有部分JIT技术和其他很多各方面的提升。

  操作系统的核心是不能够让用户随便操作的,于是就有了各种应用来操作操作系统核心,比如java应用,各种桌面英勇,所有应用其实都应该叫做shell,只不过一般的应用都有一个很好听的名字,而Linux就是各种shell,什么bshell、cshell,shell也是一个应用,只不过很特别,通过指令来控制操作系统核心而不是GUI来控制,就跟Windows环境下的DOS模式差不多。

  题外话,关于我的理解,我们对于计算机的操作,事实上都是对内存模型(或者说内存的数据结构)在操作,CPU和内存的通信会触发计算机相关的硬件控制,内存变化的时候他会给CPU发送信号,然后CPU执行相关的操作显示到显示器上面。内存首先是建立操作系统的内存模型,然后其他内存模型都建立在操作系统的内存模型之上或者跟操作系统内存模型有关。就包括JVM的内存模型,当我们操作数据的时候,JVM内存模型发生变化,从而控制操作系统,操作系统跟CPU之间完成非常复杂的沟通,然后得出结果,从IO送出信号。而这一切的一切在计算机内部都是所谓的二进制在运行,再向下一点,就是无数个高低电平的变化。而我们的代码其实就是这些内存模型的另一种表示方法,这种表示方法可以让人很容易看懂和改变。我们平常所谓的内存,硬盘这些数据和控制都是逻辑性的,这让人才容易懂,而转换到底层就是物理性的。举个例子:我们平常的String str = "123",我们人看懂,字符串str赋值123,那么当我们在eclipse中输入String str = "123"点点击Ctrl + S保存,其实CPU和内存之间已经经过了无数次沟通,首先会把"123"转换成二进制,从而保存在硬盘上面的,当我们的JVM开始运行之后,从硬盘把"123"加载内存,当我们调用str这个引用的时候,内存会把"123"在内存中的的数据结构通过高低电平传给cpu,cpu做出运算,控制之后会通过IO,把信号送到屏幕,当然,还需要经过显卡,然后屏幕通过送过来的信号拉扯液晶,从而屏幕上面显示"123"字样。总之一句话,计算机软件其实就是无数次的改变内存模型,我们操作的其实都是内存。

Java、JVM和操作系统之间的关系,写给新人,的更多相关文章

  1. Java 中类与类之间的关系

    在java中类和类之间的关系基本上有依赖.关联.聚合.组合等 一.继承关系     继承指的是一个类(称为子类.子接口)继承另外的一个类(称为父类.父接口)的功能,并可以增加它自己的新功能的能力.在J ...

  2. java 学习笔记——类之间的关系之封装、继承与多态的详解

    封装 一个封装的简单例子 封装就是把对象的属性(状态)和方法(行为)结合在一起,并尽可能隐蔽对象的内部细节,成为一个不可分割的独立单位(即对象),对外形成一个边界,只保留有限的对外接口使之与外部发生联 ...

  3. java 类与类之间的关系 及uml图

    类与接口之间的关系 : 继承 类与类之间的关系 :继承关系  包含关系 类与对象之间的关系 : 实例 UML 类图中类与类之间的关系: 泛化关系(generalization) 关联关系(associ ...

  4. java抽象类和抽象方法之间的关系

    抽象类和抽象方法之间的关系有抽象方法的类,一定是抽象类:抽象类不一定有抽象方法当子类继承抽象类时,必须要将抽象类中的抽象方法全部实现(或者称为重写),否则子类依然是抽象类因为子类是继承父类全部内容,所 ...

  5. 一句话了解JAVA与大数据之间的关系

    大数据无疑是目前IT领域的最受关注的热词之一.几乎凡事都要挂上点大数据,否则就显得你OUT了.如果再找一个可以跟大数据并驾齐驱的IT热词,JAVA无疑是跟大数据并驾齐驱的一个词语.很多人在提到大数据的 ...

  6. Java基础 【类之间的关系】

    在Java与其他面向对象设计语言中,类之间常见的关系有6种 分别是:  依赖.关联.聚合.组合.继承.实现,他们的耦合度依次增强. 其中,关联.聚合.组合关系仅仅是在语义上有所区别,所谓语义就是指上下 ...

  7. java jvm学习笔记六(实现写自己的安全管理器)

    安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用AccessController的checkPerssiom方法,访问控 ...

  8. 《Java基础知识》Java类与类之间的关系

    类与类之间最常见的关系主要有三种:依赖(uses-a).聚合(has-a)和继承(is-a). 下面以在线书店订单系统为例,来详细的讲述这三种关系的概念. 在线书店订单系统的主要功能是:注册用户可以登 ...

  9. java jvm jre jdk三者的关系

    jvm:java虚拟机器(跨平台的关键) jre:java运行环境 jdk:java 开发工具包(kit) jdk>jre>jvm 环境变量配置 https://www.cnblogs.c ...

随机推荐

  1. 【长期有效】1分钱抢100M上网流量及iPhone5S免费抽奖

    声明:本活动经作者亲自体验,绝对真实.安全.可靠.下文中图片为手机界面截图,最终得到官方手机流量增加100M的短信通知,回家过年使用最合适! 0.点击下方活动图片,进入“百度钱包”页面,你也可以直接 ...

  2. Ninject简单的Demo

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  3. Java 多线程Future和FutureTask

    Future表示一个任务的周期,并提供了相应的方法来判断是否已经完成或者取消,以及获取任务的结果和取消任务. Future接口源码: public interface Future<V> ...

  4. CAM350测量

    CAM350 测量方法 1. 单位设置:在菜单:Settings 下选中 Unit: 英制 公制 精确度 CAM350 软件默认的是英制,不习惯用英制的人,就改为公制的呀 软件默认的是英制 就改为公制 ...

  5. 删除SSMS中保存的帐户信息

    通常我们在对象资源管理器中连接服务器时,会发现在服务器名称下保存有之前的实例信息.随着连接增多,要找某个连接还得费劲.sql2012:此时可以删除C:\Users\Administrator\AppD ...

  6. Java Servlet(三):Servlet中ServletConfig对象和ServletContext对象

    本文将记录ServletConfig/ServletContext中提供了哪些方法,及方法的用法. ServletConfig是一个抽象接口,它是由Servlet容器使用,在一个servlet对象初始 ...

  7. JDK安装 配置环境变量

    我将JDK安装在D盘中 在D盘中新建一个文件 文件名为JAVA 运行jdk安装软件 更改jdk安装路径为 下一步 等待jdk安装完成 安装jre路径 jre路径改为 点击下一步 等待jre安装完成 注 ...

  8. C++Builder组件

    1.TOpenDialog: Title属性:用于获取或设置对话框标题,如果么偶有给该属性赋值,则系统将使用默认值标题:“打开” .InitialDir属性:用于获取或设置文件对话框显示的初始目录.如 ...

  9. [原创]java WEB学习笔记87:Hibernate学习之路-- -映射 继承关系(subclass , joined-subclass,union-subclass )

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  10. 如何为 Eclipse 中的 Java 源文件设置为 UTF-8 默认编码(转)

    要让一个 Java 源文件打开时编码格式为 UTF-8,需要做2件事情: 1)设置Java 源文件的默认编码格式为UTF-8: 2)设置workspace的编码格式为UTF-8. 相应设置如下: 设置 ...