在本讲,我会给大家介绍一下虚拟机和Java虚拟机这两个概念,关于这俩概念,大家都应该不感到陌生才行。
虚拟机所谓虚拟机(英文为Virtual Machine,可简称为VM),就是一台虚拟的计算机。从概念上来讲,它是一款软件,而并不是所谓物理意义上的硬件,当然,它可以用来执行一系列虚拟计算机指令。
在我往下继续讲解之前,大家不妨先看一下下面这张图,相信大家对下图所描述的内容应该不会感到陌生。
可以看到,基于计算机硬件,我们会安装操作系统,常见的操作系统无非就是Windows和Linux了,然后在操作系统之上我们就可以跑一些具体的应用软件了,例如听歌的、办公的、聊天的等,从软件层面来分,这些都是属于应用软件,而操作系统则属于系统软件。
至于虚拟机,虽然我们可以将其理解成是一台虚拟的计算机,但是它还是一个软件层面上的概念,大体上,虚拟机可以分为系统虚拟机和程序虚拟机。
大名鼎鼎的Visual Box、VMware就属于系统虚拟机,它们完全是对物理计算机的仿真,提供了一个可运行完整操作系统的软件平台。
说到这,大家应该对Visual Box、VMware这两虚拟机软件并不感到陌生吧!像我现在自己的Windows本,如果想在它上面装一个Linux操作系统,那么我就需要有一台虚拟的计算机了,而使用Visual Box或者VMware都可以达到这个目的。
其实,如果大家想在Windows本上做安卓开发,并同时希冀能有一个安卓模拟器可以运行开发好的安卓程序,那么你也得装一个相应的虚拟机才行。
介绍完系统虚拟机之后,那就得给大家介绍介绍程序虚拟机了。程序虚拟机的典型代表就是Java虚拟机,Java虚拟机无非就是来模拟具体Java程序的运行环境的,总之,它是专门为执行单个计算机程序而设计的,而且在Java虚拟机中执行的指令我们一般称为Java字节码指令。
注意,程序虚拟机是要装载在操作系统之上的,所以大家不难知道它其实就是属于应用软件。
这里说个题外话,相信有一些小伙伴在公司开发时公司会给配备苹果本,一般来说,好的公司都有免费配备苹果本,一来是因为大家都习惯使用苹果本来做开发了,二来是因为苹果本的硬件(包括硬件当中一些具体的像CPU等等结构的设计)、操作系统以及常用的一些软件都是由苹果公司自己来完成的,这样便导致了苹果本的一个高耦合度,所以它的整体性能就会发挥的非常好了。
说来惭愧,至今为止,我还没有一台属于自己的苹果笔记本,不过,我很期待这一天的到来。很多时候,我们会看到一个比较诡异的现象,就是有一些小伙伴买了一台苹果本之后,竟然不用苹果自己的Mac系统,反而在其上面装一个Windows系统,这就让人百思不得其解了,因为苹果本也不便宜,而且最主要的还是它的操作系统做的比较好,不用苹果自己的Mac系统,反而在其上面装一个Windows系统,纯粹是比较装了,压根就没有这样的必要,用苹果自己的Mac系统多优美啊!
题外话说完,最后我再给大家说一点,就是无论是系统虚拟机还是程序虚拟机,在上面运行的软件都被限制于虚拟机提供的资源中。
Java虚拟机 概述相信大家对Java虚拟机已经不陌生了,Java虚拟机(Java Virtual Machine,可简写为JVM)无非就是一台执行Java字节码的虚拟计算机,它拥有独立的运行机制,而且其运行的Java字节码也未必一定是要由Java语言编译而成。
正如制作面包的机器需要有原材料一样,Java虚拟机的原材料就是字节码,只不过以前我们会将这个字节码称为Java字节码,这是因为Java虚拟机主要就是用来解释运行Java程序的。但是有了前面几讲的基础之后,我们知道现在Java虚拟机已经是一个跨语言的平台了,它解释运行的字节码不光是可以由Java语言编译而成的了,而且还可以是由任何一门语言编译而成,例如Groovy、Scala等,只要这门编程语言的编译结果满足并包含Java虚拟机的内部指令集、符号表以及其他的辅助信息即可。所以,现在这个字节码我们其实应该是称为JVM字节码才合适。关于这一点,大家需要不断地去强化记忆。
总之,只要字节码遵循Java虚拟机相应规范,那么它就可以作为原材料被Java虚拟机解释运行,或者叫做即时编译也行,最终展现一定的运行效果。
最后,还有两点大家知道一下就行,因为比较简单,大家就快速过一遍即可。要知道的第一点是JVM平台的各种语言可以共享Java虚拟机带来的跨平台性、优秀的垃圾回器,以及可靠的即时编译器;而要知道的第二点则是Java技术的核心就是Java虚拟机,因为所有的Java程序都运行在Java虚拟机内部。
作用Java虚拟机就是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器指令执行。每一条Java指令,Java虚拟机规范中都有详细定义,如怎么取操作数,怎么处理操作数,处理结果放在哪里。
关于Java指令具体内容,我会在字节码与类的加载这一篇章中来给大家进行详细讲解,所以大家也不要太着急。
特点Java虚拟机的特点,我总结出来了有如下三点。
- 一次编译,到处运行。
- 自动内存管理。
- 自动垃圾回收功能。
第一点其实是针对字节码文件来说的,而第二三点则是相较于C/C++语言的两个明显优点,说白了,就是不需要开发人员来手动参与内存的分配和回收了,好处当然是省事了,此外,从代码层面来讲,也降低了内存泄漏和内存溢出的风险,而对于程序员来讲,则只需要把重心关注到自身的业务方面就可以了。
总之,大家只需要把程序写完以后,编译成字节码文件,然后交由Java虚拟机解释运行即可,Java虚拟机则会自动地帮我们进行内存的管理。
这是不是感觉就非常好啊!但是,转折出现了,我们常说任何事物都是有利有弊的,既然如此,那么使用Java虚拟机的弊端又是什么呢?最大的弊端其实就是会降低程序员的能力要求,弱化程序员,长此以往下去,极有可能会给大家带来一些灾难性的问题。例如,Java程序员在程序处理过程当中,一旦遇到内存溢出错误和性能调优等问题,他可能就束手无策了,压根不知道该如何去解决这些问题,而这一切的缘由就是Java虚拟机自身会帮我们做很多事情。
所以,对于自动内存管理和自动垃圾回收,Java虚拟机是怎么设计的,我们的头脑一定要有一个清楚的认识。
就拿这几年炒得沸沸扬扬的人工智能来说,随着人工智能的崛起,大家现在都在讨论一个问题,就是这个人工智能未来到底会不会取代人类,或者超越人类,乃至于领导人类。关于该问题,国际上是存在两方不同的意见的,这两方不同意见的背后都有一些国际上的重量级人物在支持。
从深度学习的角度来讲,当然,大家得提前知道深度学习的组成,从网上不难搜索到深度学习的网络是由输入层、隐藏层、输出层组成的,如下所示。
- 输入层(Input layer):输入训练数据。
- 隐藏层(Hidden layer):提取特征,它有几层至几千层。
- 输出层(Output layer):输出计算结果。
大家不妨再看一眼下面这张图,相信大家现在对深度学习的组成有了一个很直观的认识,有了这样一个直观的认识之后,下面我才能继续给大家讲解。
摆出一张猫的图片在面前,对于人类来讲,是很容易识别照片中的是一只猫的,比如猫的眼睛紧闭着,耳朵直挺挺地竖立着,尾巴被挡在了树的后面,这些人眼是一眼就能看出来的,但是对于计算机来说,它其实是并不认识猫的,它底层就知道0101...,然而计算机最终却识别出来了照片中的是一只猫,那么它是怎么做到的呢?
通过以上我们对深度学习的简单了解,不知道大家能不能知晓计算机最终是怎么做到的,如果不知道的话,那我就简单说一说吧!很简单,就是让猫的照片作为输入层的数据出现,然后经过中间很多层的隐藏层之后,使得程序的最终输出结果就是判断照片中的为一只猫。
正是因为如此,就出现了现在人们争论的焦点,人们争论的焦点就是计算机现在的隐藏层越来越多,比方说有可能会达到100多层之多,那么计算机在计算出我们想要的数据之外,它还做了哪些事情呢?它会不会在计算出我们需要的数据之外,还计算出来了一些其他的数据呢?而且由于我们人类并不清楚这些数据,那么后面会不会导致给人类造成一些不必要的灾难呢?这些都是我们不确定的。
这就像上面所说的Java虚拟机一样,程序员是可以不用再去对内存进行手动管理了,但这其实也有可能会带来一些灾难性的问题,所以我们就需要去了解Java虚拟机方方面面的细节了,嗯,就是这样!