打开jvm的黑盒子,梳理下jvm的垃圾回收以及选用对应的垃圾回收算法的原因

先说脉络,再说细节。先说下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++是需要手动回收垃圾,就是依赖程序编写人

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值