Java:JVM垃圾回收机制[通俗易懂]

Java:JVM垃圾回收机制[通俗易懂]JVM垃圾回收机制提到Java垃圾回收机制就不得不提到一个方法:system.gc()用于调用垃圾收集器,在调用时垃圾收集器将运行以回收未使用的内存空间,它将尝试释放被丢弃对象所占用的空间。作为程序员有必要了解gc方法,这也是在面试中经常会被问及的问题:我们从三个方面来理解gc:1.JVM如何确定哪些空间能被回收?2.JVM会在什么时候进行垃圾清除的动作?3.JVM如何清除垃圾的?1.JVM如…

大家好,又见面了,我是你们的朋友全栈君。

JVM垃圾回收机制

提到Java垃圾回收机制就不得不提到一个方法:
system.gc() 用于调用垃圾收集器,在调用时垃圾收集器将运行以回收未使用的内存空间,它将尝试释放被丢弃对象所占用的空间。

作为程序员有必要了解gc方法,这也是在面试中经常会被问及的问题:
我们从三个方面来理解gc:
1.JVM如何确定哪些空间能被回收?
2.JVM会在什么时候进行垃圾清除的动作?
3.JVM如何清除垃圾的?


1.JVM如何确定哪些空间能被回收
通过两个算法:
  • 引用计数算法:
     简单的来说就是判断对象的引用数量。实现方式:给对象共添加一个引用计数器,每当有引用对他进行引用时,计数器的值就加1,当引用失效,也就是不在执行此对象是,他的计数器的值就减1,若某一个对象的计数器的值为0,那么表示这个对象没有人对他进行引用,也就是意味着是一个失效的垃圾对象,就会被gc进行回收。
     但是这种简单的算法在当前的jvm中并没有采用,原因是他并不能解决对象之间循环引用的问题。
     假设有AB两个对象之间互相引用,也就是说A对象中的一个属性是BB中的一个属性时A,这种情况下由于他们的相互引用,从而是垃圾回收机制无法识别。
  • 可达性分析算法:
    因为引用计数法的缺点有引入了可达性分析算法,通过判断对象的引用链是否可达来决定对象是否可以被回收。可达性分析算法是从离散数学中的图论引入的,程序把所有的引用关系看作一张图,通过一系列的名为GC Roots的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链。当一个对象到 GC Roots 没有任何引用链相连(就是从 GC Roots 到这个对象不可达)时,则证明此对象是不可用的。

2.JVM会在什么时候进行垃圾清除的动作
  • 会在cpu空闲的时候自动进行回收
  • 在堆内存存储满了之后
  • 主动调用System.gc()后尝试进行回收(不一定成功)

3.JVM如何清除垃圾的?
通过四个算法:
  1. 标记-清除算法:

标记
所有需要回收的对象,然后
清除
标记的对象
缺点:会产生
空间碎片
,资源浪费
  1. 复制算法

内存分为两块
,当使用的一块满了就将
存活对象
复制到另一块中,再将使用的那一块清空
缺点:内存缩小约为原来的一半

  1. 标记-整理算法

标记
所有需要回收的对象,然后
清除
标记的对象,再将剩下的
存活对象整理
,避免了空间碎片的产生

  1. 分代收集算法
分代收集算法是比较智能的垃圾回收算法,也是现在JVM使用最多的算法,他本身其实并不算是一种算法,而是会在具体的场景上选择上面三种方法来进行垃圾回收
“代”指的是
新生代、老年代、永久代
【新生代】
按8:1:1分为
eden、survivorl0、survivor1
三个区域
一般情况下所有新生成的对象都存放于新生代
在新生代中,每次垃圾收集时都发现有
大批对象死去
,只有少量存活,那就选用复制算法。只需要付出少量
存活对象
的复制成本就可以完成收集。
【老年代】
老年代中存放的一般都是生存周期比较长的对象
老年代中因为
对象存活率高
、没有额外空间对他进行分配担保,就必须用标记

清除或者标记

整理
【永久代】
主要用来存放静态文件
【注意】在jdk8的时候Java废弃了永久代,同时提供了与永久代类似的叫做“元空间”的技术。元空间的本质和永久代类似。不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。也就是不局限于
jvm
可以使用系统的内存。理论上取决于
32

/
64
位系统可虚拟的内存大小。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/136666.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 超详细的CentOS7.4下载与图文安装

    超详细的CentOS7.4下载与图文安装一、CentOS7.4下载官网下载地址:http://vault.centos.org/1、进入CentOS下载官网,找到CentOS7.4版本2、在CentOS7.4版本页面中,找到isos/3、进入页面后,可以看到x86_644、在CentOS下载页面中,选择CentOS-7-x86_64-DVD-170…

    2022年4月26日
    71
  • 一分钟学会Python中pip的安装与使用

    一分钟学会Python中pip的安装与使用文章目录一、简单介绍二、下载安装三、最常用命令1、显示版本和路径2、获取帮助3、升级pip4、安装包5、升级包6、卸载包7、搜索包8、显示安装包信息9、列出已安装的包10、查看指定包的详细信息一、简单介绍pip是Python包管理工具,该工具提供了对Python包的查找、下载、安装和卸载的功能,现在大家用到的所有包不是自带的就是通过pip安装的。Python2.7.9+或Python3.4+以上版本都自带pip工具。给出pip官网链接:pip官网。二、下载安装可以通过命令

    2022年4月30日
    85
  • 利用Matlab对经典鸢尾花数据集实现决策树算法分类,并绘图

       最近在学习数据挖掘,其实决策树分类看过去好久了,但是最近慢慢的想都实现一下,加深一下理解。  知道决策树有很多现成的算法(ID3,C4.5、CART),但是毕竟核心思想就是那几点,所以本篇博客就是我随便实现的,没有参考现有的决策树算法。考虑到实现分类起码需要一个数据集,所以我选择了经典的鸢尾花数据集,下载地址:Iris   选择iris.data点击右键连接另存为,即可…

    2022年4月7日
    197
  • jmeter性能测试方案

    jmeter性能测试方案性能测试方案性能测试概述性能测试是通过自动化的测试工具模拟多种正常 峰值以及异常负载条件来对系统的各项指标进行测试 测试前期准备 1 测试需求 1 1 需要将开发给定的需求 前端页面的智能问答接口性能 转为吞吐量和响应时间 1 2 根据测试目的 细化需求 2 测试准备 测试准备包括测试客户端机器准备 测试数据准备 测试脚本准备 3 测试执行 测试的执行中 需要监控测试客户端和服务器性能 监控服务器端应用情况 1 3 1 客户端的系统资源 cpu io memory 情况 1

    2025年6月6日
    4
  • ZBrush中必须记住的常用快捷键

    ZBrush中必须记住的常用快捷键ZBrush是一款数字雕刻和绘画软件,它以强大的功能和直观的工作流程彻底改变了整个三维雕刻行业。强大的功能离不开便捷的操作,为此ZBrush提供了一系列常用操作快捷键,熟练掌握这些快捷键

    2022年8月2日
    6
  • Git clone 超级慢

    Git clone 超级慢使用命令:gitclone-br1.13.0https://github.com/tensorflow/models.git克隆GitHub上的一个仓库,但是速度超级慢,最高速度不超过30KB/s解决办法:使用国内镜像网站:github.com.cnpmjs.org,你访问这个网站和访问github.com没有任何区别,但是速度快很多,所以我们可以从这个镜像网站进行克隆仓库。原命令:gitclone-br1.13.0https://github.com/tensorfl

    2022年7月21日
    19

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号