00:00
好,那么咱们关于这一章呢,呃,简单的hello word这个代码呢,咱们就编写完了,然后下边的话呢,咱们讲一个还是一个介绍性的内容,前面的话呢,我们也提到一个概念,叫做GVM。啊,这个GM跟我们现在写的这个程序的关系在哪呢?诶回到我们刚才讲这个代码这块啊,咱们呢,在编译的时候针对的是这个源文件,源文件编译以后呢,生成的是这个叫自解码文件,这个磁解码文件呢,我们接下来使用的这个叫诶java.es这个指令进行的解释运行。那么一旦解决运行了,我们就要使用内存的资源,哎,执行这个程序了,那么这个时候呢,谁。帮我们去做整个这个程序内存的分配和执行的。就是GVM。哎,对,就是它,所以呢,针对于这个GVM呢,诶我们有必要呢,稍微的了解一下啊,那么要想了解GM,首先咱们先说一下这个Java语言的一个优缺点。这个很早以前的时候呢,在面试的时候会有人问啊,说你觉得Java的优点是什么呢?
01:03
啊,缺点是什么呢?是吧?哎,这块我们来看一看啊,呃,那么提到Java的优点这块大家做一个了解就行啊,我写了这样几个点,第一个叫跨平台性,哎,第二呢,叫做立向对象性啊,健壮性高,呃,这个安全性高,简单性啊,高性能啊,稍微简单说一下啊,尤其我们说的第一个点叫跨平台性。所以呢,这是Java的一个核心的优势。啊,怎么叫跨平台性呢?大家你看哈,咱们写了一段Java代码。啊,还记不记得咱们早上讲那个,呃,汇编语言的时候。呃,你在各个平台下呢,我们说是不是都不太一样,你针对于某一个平台,你去写这个汇编的代码是吧?诶当然对于我们这个高级语言Java程序来讲呢,哎,你在各个不同的这个平台下,它可能是不同的这个架构。啊,不同的架构啊,你比如说。嗯,像咱们上边这块去下载的时候。
02:00
嗯,下载我这儿找一下啊。嗯。比如在这吧,大家你看啊,在这块的时候呢,你看基于Linux这它这块你看有这个ARM的架构,还有这个叉64位的这个架构,比如说还有这个叉八六的这个架构,这就是不同的这个架构。哎,那你架构不同的话呢,诶说那是不是我们Java代码还得,呃编写方式也不一样呢,诶你会发现他说没事儿,呃,因为Java语言呢,它有个优点呢,叫跨平台性,也就是说我们只需要呢,编写一份Java代码就可以让它在不同的。操作系统上面去运行。啊,那么怎么能够实现这样一个特征呢?这个主要原因呢,归结于GM。哎,我们在不同的操作系统上安装不同版本的GM。啊,那么我们的程序呢,不是直不是说直接在你这个操作系统上去运行的,而是在你操作系统上的GM里边去运行的,给你提供了一个良好的环境,所以呢,我们只需要写一份就可以了,把这种特性呢,我们称为呢,叫right one run anywhere。
03:05
啊,疑似编写到处运行。或者叫一次编译,到处运行都可以。啊,这个呢,举一个生活中的例子呢,你看我这儿放了一个是吧,诶说大家好,我是程璇康师傅。诶这句话呢,我是用普通话来说的,那我不用考虑呢,在不同的国家的这个,呃,人跟我对接的时候呢,他们听不懂,因为呢,我有对应的这个翻译啊,他就直接翻译成能够识别的这个啊语言呢去。啊,这个这个表达了啊,哎,那么这里边这个所谓的翻译呢,就是相当于我们这边的啊GM。啊很好理解啊,行,诶针对于不同平台的这个指令,我们就不用考虑那么多了啊,那又由于这个GM哈,首先你注意一下,它在不同的操作系统下呢,它是不一样的,而这个GM呢,它又包含在。啊,这个咱们高中讲的这个真包含于是吧,哎,包含在我们的JDK里边吧。那么问题啊,就是我们上午说的啊,咱们各个不同的系统的GM不一样,那么问各个系统的JDK一样吗?
04:09
是不是也不一样了?所以咱们装JDK的时候呢,你得看清楚你是装Windows版的JDK,还是装Mac版的,还是Linux版的。啊,因为呢,JDK里边的那个GVM不一样。哎,注意一下啊好。然后第二个特点呢,叫面向对象性啊,Java是个面向对象语言啊,我这一句话带过了啊,后边我们再专门讲这个面向对象的这个特征,第三个呢,叫做健壮性。啊,咱们也说了啊,基本上现在的一些语言都是基于C的啊,诶,那么Java呢也同样如此,它呢吸收了C和C加加语言的优点,去掉了影响其健壮性的部分,比如说啊,在C里边呢,我们有大量的指针啊,指向这个内存的具体的位置啊,往后移几个位置就下一个数据啊,那么在Java里边我们使用的话,就把这个指针呢给它去掉了。啊,处理起来的太繁琐就给去了啊,然后另外一个呢,就是呃,你要使用C语言去编写程序的话呢,你使用了内存了,那么你还要呃手动的把这个内存空间不用的时候呢,要释放掉,那成员呢经常可能就忘了,一旦忘了那这个内存呢就会泄露。
05:14
啊,那么Java程序员的话呢,说你就不用管这个事儿了啊,整个内存的分配,还有释放,我自动的帮你去做。哎,很高级。啊,所以这个呢,就使得我们扎程序的这个健壮性会更好一些,呃,怎么能够实现这个事儿,一会我们讲GM的时候来说啊,诶下边一个呢,叫安全性高啊,有这个比较好的安全防范机制,比如呢,像使用这个类的加载器啊,类似的比如双性尾派机制等等的,我们让它呢更安全,这个以后我们讲到专门说GM的时候呢再讲。下面这个呢,叫简单性啊,Java语言可以看成是叫C加加语言的一个简化版啊,这个减减。C加加语言的简简版。啊,这叫简单性啊,相较于CC语言,C加加语言来讲呢,Java呢要易学一些啊,然后下一个呢,叫高性能啊,这里边就提到了,在Java呢,发展的最初的时候呢,总会被人诟病为性能低,相较于C和C加加来说,但实际上现在的话呢,Java已经今非昔比了。
06:12
啊,因为呢,它呃有非常牛的GVM里边的啊,这个我们叫即时编译器。可以针对这个代码呢,我们提前呢,就把它啊针对热点代码呢,给它提前编译出来,并且缓存了啊,甚至说呢,这个性能可以达到跟CC加加呢就不相上下的这个程度。啊,所以这呢,呃,已经不是当初的那个啊,性能低的一个账号程序了啊。好,那么这是扎程序的优点,缺点是什么呢?语法相较于比如像Python啊PP来讲呢,还是比较复杂的。往好里说呢,叫严谨是吧?哎,那么语法比较复杂,大家学Java呢,我们要学一个月,那当你后边呢,你想在学pthon的时候呢,哎,我也说了啊,在你工作之余一周时间就够。啊,所以呢,你再接触一些语法简单的话,你上手会很快的啊。包括呢,后边我们讲这个,呃,咱们Java的同学啊,咱们会讲这个javascript,在第二阶段讲javascript也是一个面向对象的编程语言,这个咱们讲多久呢。
07:10
前端的讲好久。啊,前段学科咱们讲一天。这一天你也会发现他讲的还挺细致的。啊,因为说你看这个跟Java一样,这个一样,这个一样这样下边是吧。所以说呢,你在接触一些相关的语言的时候呢,学的会很快啊。好,然后呢说呢,一般啊适用于大型网站的开发啊,整个架构呢,会显得比较重一些,呃,经常呢,有这种创业型的公司,呃,比如说就几个人,他想快速的把这个网站搭建起来,他可能会选择PP或者是Python。很快啊,你要选Java的话呢,它这个底儿键呢,就需要比较厚重一些。呃,也就是说Java呢,其实主要呢,是针对这种中大型的网站开发。啊,来做的。啊,当然呢,你对一些初创型公司,你要后期这个网站要重写的话,那你还要改成Java,那也是比较费力这个事儿,所以很多公司呢,可能在一开始的时候就也选择Java直接做后台了啊OK。
08:05
啊,并非适用于所有领域啊,这个咱们知道不同的语言都有不同的特点啊,适用的场景也不一样,OK啊像这呢,是我们说Java的一个优点和缺点,然后接着我们来看这个GM啊,这个GM的话呢,我们叫Java虚拟机啊,Java virtual machine。诶,它呢,是一个虚拟的计算机,是Java程序的一个运行环境。咱们不是说生成的这个CG码文件吗?这个C码文件呢,它呢是跑在GM的,这个GM呢是安装在具体的操作系统里,哎,操作系统呢,再去调具体的啊内存呐,CPU啊是吧,来帮我们做具体的这个计算,那这样的一个过程。OK啊。啊,他负责呃,这个执行指令管理数据内存寄存器啊,这个了解一下就行啊好,那么关于GM这块呢,想给大家提他的两个主要的功能。呃,GM还是挺强大的啊,第一个功能,实现Java程序的跨平台性。
09:00
刚才我们讲过这个事儿,把它归结为Java的一个优点,那这个Java的优点呢,就是因为有GM存在。啊,有TM存在,所以呢,我们可以实现这个跨平台的特征。啊,使用GM前后的一个对比啊,大家可能这样一看脑子有点晕是吧。啊,简单说一下啊,你像我们写的这个C程序,呃,因为呢,你要在不同的这个指令下呢去运行,你要没有这个所谓的像GM这样一个结构的话呢,呃,你得针对不同的这种指令集去编写相关的这种代码。啊,那这块呢,如果有M种程序右边呢有N种这个指令集,那一共呢是M乘N种。编译器。啊很复杂啊,但是你如果要有了GM以后呢,诶我们呢,只需要面向GM进行编程就可以了啊这呢有M种,然后这个GM的话呢,它会帮你啊在相应的平台下呢,去做这个解运行,这呢是有N个指令集,就M加N了。啊,一切呢,变得都简单起来。啊,所以GM呢,还是挺强大的啊。
10:01
啊,具体的细节呢,以后我们再慢慢聊GM啊,那么第二个功能呢,就是自动的内存管理机制。这呢体现为两方面啊,就是一个呢叫内存的自动分配,哎,第二呢叫内存的自动回收。哎,这个呢,其实很方便,就有点儿像咱们,哎,家里边儿大家雇了一个。保姆一样。对,雇了个保姆一样,你回家以后呢,比如说你的衣服啊,你的包啊,诶你一进门啊,他就自动的说,诶,我来帮你放。啊,相应的东西呢,就放到指定位置了,然后呢,你自己在家里边儿啊,比如说吃饭,吃完饭以后呢,你这个呃,这这这一些这个要洗的这样一些锅碗瓢盆吧,是吧,你不用管啊,它自动的会帮你去清理收拾。太方便了是吧,啊这个呢,就是GM它的一个作用,以前的话呢,呃,你要是C或者C加加,你可能得自己呢去分配自己呢去回收,你要忘了那就泄露了。啊,这里边儿提到个词儿叫内存泄漏。
11:00
哎,啥叫内存泄露啊?多了,溢出来了,那叫内存溢出。是吧,诶所以这块呢,你看有了一个名人题哈,说Java程序还会出现内存泄露和内存溢出的问题吗。哎,我这写了会。那不是有自动的内存管理了,那咋就还泄露还溢出呢是吧。诶,那通过这个呢,咱们把这个面试题说一下啊,首先什么叫内存溢出。啥叫溢出啊?啊,这个这个这个你对你你你的女朋友这个感情特别好啊,对她的爱呢,都用不完,都溢出来了是吧。啥叫溢出呢?就是超出了你本身这个容量范围了,叫溢出,这个内存的话呢,我们假设两个G。啊,两个G呢,那就意味着你占用的话呢,最多只能分配两个G的数据放到这里边儿,现在呢放不下了。啊,那这时候呢,不就溢出了吗?一旦溢出了,你想这个数据根本都放不到内存里边,这个程序是不是就报错了。
12:02
哎,所以内存溢出的话呢,就会报错啊,那问说Java程序还会溢出吗?你不是说你会自动的会清理这些垃圾吗。关键问题就是,这些也不是垃圾呀。啊,你不是垃圾我就清理不了,那你这块还多,那当然还是会移除的啊,没问题,好,下边讲内存泄漏。那什么叫泄露?啊,可能生活当中我们一说泄露呢,比如说泄露风声了。让别人不想让别人知道给知道了,或者那个海洋上这个原油的泄漏。是吧,哎,那么跟这个呢。没有任何关系啊,那这个怎么叫泄露呢?注意哈,Java中的这个泄露。哎,我说一下啊,大家来理解。比如说你回家了,哎,你往地上,假设你感冒了是吧,啊相当于说感冒还挺敏感的,这个身体不好是吧,然后呢,你自己这个,比如擤鼻涕啊,直接把这个纸就扔到地上了。
13:00
这其实是不是应该是垃圾啊?啊,就是你自己或者咱们作为程序员,明明是垃圾了,我给扔到地上了,但是呢,这个呃,咱别说保姆了,咱就说是一个机器人吧,这个机器人呢,就是GM它自动的帮你去清理垃圾的,结果呢,他走到这个纸这块的时候呢,它判断以后,他如果认为这也是垃圾。那他就回收了。那这就没有泄露问题。什么叫泄露呢?就是明明啊,我扔到地上的这个纸是垃圾,我是成员,我知道是垃圾,但是他不认为这是垃圾。他就看了看,他就走了。这就是泄露。啊,这就叫泄露。啊,这个大家去体会一下啊好,那么以后呢,我们会去讲说诶GM呃,他判断这个是不是垃圾的标准是什么,这个会有相关的算法的支持的。OK啊,行。那么内存泄露。严重吗?你觉得这个事儿重要吗?重要啊。
14:00
你看啊,内存溢出呢,只要一出这个程序就挂了,所以你很容易知道啊,出现溢出问题了,但是内存泄露呢,是不太容易发现的,你可能这个程序呢,你运行完诶挺好的是吧?哎,你这个垃圾有有就有呗,又不影响我使用,我内存这么大呢是吧?哎,可能还没事,但关键问题就是如果你要泄露问题多的话。可能还是会导致溢出的。就像你家里边呢,本来就那么大空间,然后你咔咔一顿扔,然后呢,他还不认为这是垃圾,你扔多了盛不下了,不就照样溢出了吗?啊,你就相当于在内存当中啊,这块呢,是咱们知道这是垃圾,我也不再去使用了,但是呢,这个GM呢,一判断发现呢,他不认为这是垃圾,你像这个空间如果占的多了,最后呢也满了,是不是就移除了。所以呢,内存泄露多了,会导致内存溢出。啊,这个点,那至于说呢,在面试当中通常还会再问你说你能举一些内存泄露的例子吗?啊,那么现在呢,大家要回家说不能是吧,因为我们刚开始讲,咱们还没有讲过举的例子,后边呢,咱们慢慢的呃接触啊,就会给大家举很多的例子了啊好,那么这呢是关于啊Java语言的特点和GM的一个主要的功能啊,大家呢,去体会一下。
我来说两句