先说脉络,再说细节。先说下jvm如何工作的,后面再谈下jvm的垃圾回收。
java virtual machine 简称jvm,它是虚构出来的一台计算机,包含两个模块:1.字节码指令集(汇编语言),2.内存管理(堆,栈,方法区等)。乍一看这名字啊,java虚拟机好像是属于java语言的虚拟机,其实不是,jvm跟java语言没什么关系,至少是没有直接的关系。jvm上面是运行.class文件的,任何语言包含java语言只要是能编译成对应的.class,那么这个.class文件就能运行在jvm上面,jvm是运行在各物理服务器上面的,所以java是跨平台的。如下图:
说一下java从编码到执行:首先是编译java源代码*.java,经过编译后成*.class文件,然后运行java *.class命令 ,这个时候一个jvm就启动了。jvm启动了,首先要运行的class文件以及java类库里面需要用到的文件 ,注意啊,class文件加载进jvm之后还要经过翻译,翻译成汇编语言之后再交给执行引擎,执行引擎再调用服务器硬件,开始执行逻辑。如下图:
先说语言翻译吧 :翻译的方式有两种:1. 编译,2. 解释。两种方式只是翻译的时机不同。
编译型语言写的程序执行之前,需要一个专门的编译过程,把程序编译成为机器语言的文件,比如exe文件,以后要运行的话就不用重新翻译了,直接使用编译的结果就行了(exe文件),因为翻译只做了一次,运行时不需要翻译,所以编译型语言的程序执行效率高。
解释则不同,解释性语言的程序不需要编译,省了道工序,解释性语言在运行程序的时候才翻译,比如解释性basic语言,专门有一个解释器能够直接执行basic程序,每个语句都是执行的时候才翻译。这样解释性语言每执行一次就要翻译一次,效率比较低。
上面比较了编译和解释,再回到jvm里里面,道理是一样的:
上面标红加粗的文字,jvm里面还要对class文件进行翻译,注意啊,不是对java语言进行翻译,翻译的工具有两种,分别是:字节码解释器 和 JIT即时编译器。
道理是一样的,字节码解释器开始一句一句的解释执行,注意啊用到的时候才去解释,每用到一句就解释一句,每次都要解释所以效率比较低。那如果有热点代码呢,比如频繁调用某一方法或者循环调用某一段代码呢,那这样是不是总在做重复的翻译啊,那么怎么办呢?
所以就用到了JIT即时编译器,它把热点代码只做一次翻译,保存起来,用到的时候直接调用就行了,不用每次重复的翻译。
下面说jvm的垃圾回收
我们写程序啊,在运行的时候,是需要在内存里面申请空间的,如果在执行的过程中,总会有程序或者叫数据吧,它们完成了自己的使命,没有用了,白占用空间,这个时候就成了垃圾,如果不清理,空间占满了,那后面的程序就没法申请了。
c和c++是需要手动回收垃圾,就是依赖程序编写人