Java JVM虚拟机垃圾回收机制简要总结

前言
----以后每当我遇到不会的问题就会在这里记录并且自己琢磨琢磨把它搞懂,一起学习的小伙伴也可以关注我,也希望在我自己琢磨之后大佬们看到我总结的有错误的地方帮我指点下,谢谢大家了。

JVM虚拟机是什么?

JVM虚拟机(JAVA Virtual Machine)
-----读了几篇关于JVM虚拟机的文章,大概了解到在JAVA开发中程序会将我们写的代码(源文件)编译成通用的字节码文件,这样JVM虚拟机就可以处理执行这些字节码文件,但是其他语言例如C语言就没有将源文件编译成字节码文件这一机制,所以用C语言在windows下开发的程序到了其他平台并不通用。这对我们JAVA程序员来说 是个好消息,我们并不需要考虑程序在其他平台的兼容性问题,这就是为什么大家常说JAVA拥有一次编写,到处运行的能力。JVM虚拟机在这一过程中扮演着中间层的角色,正是有了JVM虚拟机这一机制,才是我们JAVA程序员不用在意程序在各个平台的运行问题,使开发变得更加容易。
说了这么多,我就发现了一个问题,其他语言没有JVM虚拟机这一机制,但是JAVA中多了一层中间层,那JAVA开发的程序会不会比别的语言开发的程序速度上有所损失(多了JVM会不会影响到JAVA程序的运行速度)。 据我了解到,JVM虚拟机这一中间层确实会使JAVA程序比C语言及以他没有JVM的语言开发的程序更慢,但是JAVA这些年在JVM这块已经有了很大的进步,而且速度慢这一缺点和JVM带来的好处来说就显得不那么重要了。值得一提的是只要是可以被编译成字节码文件的语言都可以被JVM虚拟机解析执行,这就意着这些能被编译成字节码文件的语言都可以使用JAVA的类库,想想就很方便。

JIT是什么?

----JIT(Just in Time)即即时编译的意思,当JVM虚拟机检测到哪段代码的执行频率很高就会选择性的将这段代码编译为本地代码来提高执行速度,可以被即时编译的最小单位是方法,一般某段代码被执行1500次以上才会被JVM即时编译,当然这个数字也是可以进行配置的。因此就出现了给JAVA程序热身的这一说法,正是有了即时编译的优化,程序运行的时间越长运行速度就会越快。但是JIT也有坏处,当JIT运行时会带来时间和资源上的开销。

什么是垃圾回收机制

垃圾回收指的是当对象或者其他引用类实体被创建时,会在内存中分配内存空间,当内存没有被对象引用时(这块内存就会成为垃圾),JVM虚拟机的回收器会不定时自动回收这些没有被对象引用的内存空间(垃圾)。

垃圾回收的两个判断计算方法

知道了JVM垃圾回收的概念之后我还要继续研究JVM是怎么判断这块内存该不该被回收呢?

1.引用计数法

顾名思义就是判断对象的引用数量,在对象身上添加一个计数器,每当对象被引用时计数器就会+1,每当其他对象取消对该对象的引用计数器就会-1,所以当对象没有被任何对象引用时(计数器为0)就会被回收器判定为垃圾进行回收。
注意:现在JVM回收器中并没有使用该方法,因为该方法并不能判断循环引用该不该被回收,即A对象引用B对象,B对象也引用A对象。

2.可达性分析算法(现在垃圾回收器使用的算法)

JVM虚拟机的垃圾回收器会通过一系列名为GC-Roots的对象作为根节点从这个根节点往下进行搜索,搜索经过的路径称为引用链,当一个对象没有被任何一个引用链连接时就判断这个对象为垃圾并回收。接下来放一张从别处盗过来的图就简单明了了,也不知道侵权不。
在这里插入图片描述
只要在没有被引用链连接的对象,即使是右侧循环引用的这种情况也同样会被回收。

垃圾回收的四种算法

有的同学该问了,上面不是已经说过算法了吗,拜托这两个不一样,上面的是如何判断对象是否为垃圾的算法,现在要说的是JVM回收器如何回收垃圾,明白了吧?

1.标记—清理算法

这个是最简单的算法,简单来说就是在内存中将未被引用的内存进行标记,之后再进行统一的清理,但是这个算法有很大的缺点,先不说耗时问题,在内存被清理之后会出现大量的碎片化的内存空间,当这个时候要保存占用内存大的对象时,程序无法为这个对象找到连续的足够大的内存空间,从而造成了空间浪费。下面也是盗的图。看了就明白啦!
在这里插入图片描述

2.复制算法

这个方法会把原本的内存空间平均分成两部分,一部分放置对象,当第一部分的内存空间占满了之后会将还存活的对象放置到第二部分,之后清理第一部分的所有对象,这样每当内存占满或者不够用时就会清理掉垃圾对象,并且不会产生内存碎片,缺点就是将内存空间分成两部分,相比之前内存被缩小了一半。
在这里插入图片描述

3.标记—整理算法

这个算法相当于标记清理法的升级,区别在与该算法会将存活的对象放置在内存的一端,之后将端以外的垃圾内存清理掉。
在这里插入图片描述

3.分代收集算法

这个算法会根据对象存活周期的不同,将内存划分为几块(新生代和老生代),之后再根据每个年代不同的的特点选择不同的的算法来进行清理内存,例如对象周期短,刷新频率高就可以存放在新生代中使用复制算法,而周期长,生存率高的对象可以放在老生代中,使用标记—清理算法或者标记—整理法。

引用类型

最后我想在记录一下引用类型的清理规则
强引用——我们在编写代码的时候大多数用到的都是强引用,例如创建对象,只要该对象的强引用还在,这个对象就永远不会被清理。
软引用——当内存不足时才会被清理。
弱引用——被GC回收器扫描到就会被回收。
虚引用——随时有可能被回收。

总结

JVM这块知识很容易在面试的时候问,我在面试的时候就没有做好准备,被问到的时候一脸懵逼,希望大家好好背背基础知识,喜欢我的也可以关注我,我以后会发java的知识点总结,以此来让自己研究研究基础知识,也欢迎小伙伴一同学习。如果有写的错误的地方还请大佬们指出,我会尽力改正的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值