JVM,Java虚拟机基础知识新手入门教程(超级通熟易懂)

  做者:请叫我红领巾,转载请注明出处http://www.cnblogs.com/xxzhuang/p/7453746.html,简书地址:http://www.jianshu.com/p/b963b3c0ad53html

一.写在前面

  首先,本篇文章并无涉及原理,而是在笔者撸了《深刻理解Java虚拟机》好几遍的基础上讲解本身的经验,从一个新手到如今明白JVM是个什么玩意,怎么去理解和明白,讲解这样一个经验而已。这篇文章并对JVM并无挖掘得很深,在下目前暂时也没有这个能力,只是以通熟易懂的方式,让读者理解JVM是个什么玩意。下面开始个人讲解。java

二.谁说人神不得相爱——Java的跨平台

  理解Java的跨平台特性,是对JVM最直观的认识。所谓的“一次编译,处处运行”,为何C/C++ 却不能实现呢?这一类语言直接使用物理硬件(或者说操做系统的内存模型),那么不一样系统之间的内存模型是不一样的,好比说Linux和Window,这就意味,在Window编译好的代码,却不能在Linux上运行。《深刻理解Java虚拟机》记录说,Java虚拟机规范中试图定义一种Java内存模型(JMM)来屏蔽掉各类硬件和操做系统的内存访问差别,以实现让Java程序在各类平台上都能达到一致性的并发效果。举个现实的例子,一个只会据说中文的人,要如何和一个只会据说英文的人交流,在Java的世界里,采用的方式便是给两边的人各配一名翻译官(JVM),因此,这就是为何JVM要有window版本,也要有Linux版本。算法

  众所周知,Java的程序编译的最终样子是.class文件,不一样虚拟机的对每个.class文件的翻译结果都是一致的。而对于C/C++而言,编译生成的是纯二进制的机器指令,是直接面对计算机系统的内存,可是,java程序的编译结果是面向JVM,是要交付给JVM,让他再作进一步处理从而让计算机识别运行,这就是所谓的“屏蔽掉各类硬件和操做系统的内存访问差别”。这里的特色又和面向对象推崇的面向接口有着不可描述的关系,我只须要有这么个规范,不须要去知道接触你的底层原理实现。编程

三.活在梦里的真实——虚拟机

  JVM,全称Java Virtual Machine,英文为Java虚拟机,简单的探讨一下虚拟机这三个字,对后面的学习也是挺舒服的。百度百科描述说,“虚拟机(Virtual Machine)指经过软件模拟的具备完整硬件系统功能的、运行在一个彻底隔离环境中的完整计算机系统”,可是虚拟机本质仍是该计算机系统的一个进程,能够类比香港澳门具备高度自治,但本质上他们仍是属于中国的。为了方便描述,咱们把整个计算机当成一幢大楼,而虚拟机则是某一个楼层。大楼划分了一个区域给一个楼层,让这个楼层本身管理本身,也就对应着,计算机划分了一个内存给JVM,让JVM本身管理本身。下面这张图是笔者的阿里云服务器上的内存使用状况,能够看到JVM足足占用了接近500M的内存。那么问题来了,JVM要这么多的内存干什么,这里面又是怎么划分?服务器

四.你来到个人世界里——内存

  在现阶段不管什么编程语言,都是由人类设计发明的,编程语言对于人类来说,是方便本身实现目的的工具之一,因此,编程语言看似是全新的东西,可是这里面到处均可以看见人类思想的影子,均可以从现实中找到类似的例子。并发

  接着上面的例子,JVM是做为某一个楼层,单独占有了一大块区域(内存)。这个楼层中,有主厅,客厅,客房,这四个之间的区别之一就行,主厅和客厅是公有的,而主房和客房是私有的,这里对应到JVM层次上便是,有某几块内存,是不管是谁访问,有多少人(线程)访问,这些共有区域均可觉得他们服务,而客房,私有区域,假定咱们这个楼层比较牛逼,来了多少个客人,就会单独为他们建造每一件客房,每一个客人都有本身私有区域,A客人是进不了B客人的房间。编程语言

  对应的JVM的层次,便是JVM运行时数据区域划分为两大块,线程隔离的区域和线程共享的区域。咱们能够简单的理解为,每一个客人便是一条线程。具体对应的区域又是如何划分的,又有什么做用,这里只能从概念上理解和记忆了,传送门在此轻松认识JVM运行时数据区域工具

五.离开我,却没有带走你的痕迹——什么是垃圾

  回想起小时候,不少小伙伴都会一块儿结伴过来我家玩耍,虽然你们玩得很开心,等到了时间点以后,他们就拍拍屁股走人,留下我家里一片狼藉,这个时候若是我不收拾一下垃圾的话,我老妈估计就要来拍拍个人屁股了。客人(线程)一样如此,我来过你的世界,总会留下属于个人痕迹,是否是垃圾,就要看你本身如何断定了。这里就引出另外一个问题,我怎么判断是哪一个才是垃圾,哪一个不是垃圾,只不过是玩耍的时候,我或者小伙伴随手把老妈的戒指扔到地上而已。站在人类的视角上看,一眼就知道哪一个是垃圾,哪一个不是垃圾,可是计算机可不是这样,计算机有些时候确实不如人类,明明人类一眼或者几秒能完成的事情,要让计算机一样可以完成对应的功能的话,须要付出千万倍的代价才可以实现。学习

   笔者的老妈在家里收拾垃圾的时候,为了确保扔掉的东西是垃圾,她会将这个东西,一个一个问家里的每一个人,这个东西是否是你的,你还要不要,当没有一我的认可说这个东西是属于他的时候,老妈就将这个东西视为垃圾,当有人说这个不是垃圾,是他的宝贝的时候,我老妈就这个东西标记一下。JVM采用的是相似的作法,每一个对象到GC ROOT都有必定的联系和路径可达,当某个对象,对于GC ROOT不可达(即没有人说这个东西是属于他的)的对象,JVM则断定为垃圾。JVM里称此行为是可达性分析阿里云

  finalize的做用:假设一个本子已经被老妈认定为垃圾了,但老妈在扔掉垃圾的时候必须先通过一个程序,即finalize,假如在这个程序过程当中,我忽然想起这个本子对我仍是有用的,那么这个本子就不会被认定为垃圾,从而继续保留在内存中。

六. 我要怎样忘了你是谁——垃圾回收算法

  知道什么是垃圾,找到了垃圾的位置,接下来的问题是我要怎么处理这个垃圾,即垃圾回收。我要怎样忘了你是谁,关键是要怎么字,这个动做是怎么发生的。

  标记清除:在这个楼层中,垃圾四处都有,甚至散乱在非垃圾之间或者周围,即然我老妈已经给有用的东西作个标志,那么这就意味着我老妈只须要清除那些没有标识的东西。标记清除的作法形象成就是我老妈拿着垃圾桶,从头至尾,看到垃圾就把他扔到垃圾桶里面。这种作法无疑是最简单的,可是带来的后果也是很明显的,空间碎片太多。这里的空间碎片又要作如何理解,每一个物品(每一个对象)都是须要占据着必定的的面积(即内存),他要站住脚跟嘛,可是若是空间碎片的太多,就会致使大的物品来临的时候,区域(内存)不够用,就会再次引起垃圾回收(意味着你打游戏的时候可能要停顿个几秒)。再举个现实中的例子,打包行李箱的时候,随随便便,散乱的放置东西,行李厢很容易被撑满,这个时候你还想放一双鞋进去,你会发现空间不够用,只能把因此东西都倒出来,整整齐齐的,从上到下从左到右的放置物品。对于空间的利用率,整齐的作法比散乱无章的行为更来得高,这就引出了另一个作法,标记整理算法。

  标记整理:你见过有谁扫地的时候,看到垃圾就直接把扫到扫帚了里面,看到就扫。不存在的!人是有惰性的,全部总会找到更高效的作法,更习惯的作法是将垃圾扫到一块儿,再统一将其扔到垃圾桶中。

  复制:这个算法就有点奢侈了,无论这个内存里有多少垃圾,我老妈都统一将他们扔掉,而后从新再买一次那些咱们还须要用的物品,俗称复制。所以,若是存活对象太多,这个算法是不适合的(想一想就知道了-.-),其二,JVM里面须要将可用内存分为两半,一半供目前使用,一半供复制后的对象使用。

  未完待续……      

相关文章
相关标签/搜索