JVM垃圾回收机制(一)[通俗易懂]

JVM垃圾回收机制(一)[通俗易懂]一、什么是垃圾?1:引用计数算法:给对象中加一个引用计数器,每当有一个引用指向它时,计数器的值就加一,引用失效时,计数器的值就减一。当该对象引用计数器等于0的时候就被视为垃圾。该算法存在很大的缺陷,若两个对象存在互相引用,则两者的引用计数器都不为0,都不能被GC。如:publicclassReferenceCountingGC{publi

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

一、什么是垃圾?

1:引用计数算法:给对象中加一个引用计数器,每当有一个引用指向它时,计数器的值就加一,引用失效时,计数器的值就减一。当该对象引用计数器等于0的时候就被视为垃圾。
该算法存在很大的缺陷,若两个对象存在互相引用,则两者的引用计数器都不为0,都不能被GC。
如:

public class ReferenceCountingGC{
                public Object instance = null;
                public static void testGC(){
                      ReferenceCountingGC objA = new ReferenceCountingGC();
                      ReferenceCountingGC objB = new ReferenceCountingGC();
                      objA.instance = objB;
                      objB.instance = objA;
                      objA = null;
                      objB = null;
                      System.gc();
         }
        }

JVM显然不会采用这种算法。

2:可达性分析算法:通过一系列的称为“GC Roots”的对象作为起始点,从这些节点向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象从GC Roots不可达的时候,该对象则不可用,会被GC。
GC Roots包含:

  • 虚拟机栈(栈帧中的本地变量表)中引用的对象。
  • 方法区中类静态属性引用的对象。
  • 方法区中常量引用的对象。
  • 本地方法栈中JNI(即Native方法)引用的对象。

二、垃圾收集算法

1:标记清除算法(Mark-Sweep):首先标记出所有需要回收的对象,在标记完成后统一回收。
这里写图片描述

该算法的优缺点其实都很明显:效率较高,但是标记清楚之后会产生大量不连续的内存碎片,导致以后如果有大对象需要分配时无法找到足够大的连续内存空间,触发另一次GC动作。

2:复制算法(Copying):将可用的内存划分为可用的两块,每次只使用其中一块,当这一块内存满了之后,将这一块当中存活的对象复制到另外一块上去,再把原来的这一块空间一次清理掉,这样使得每次只对半个空间进行GC,简单高效,代价是内存缩小为原来的一半。

这里写图片描述

3:标记整理算法(Mark-compact):与标记清除算法一样,首先标记出所有需要回收的对象,然后再将所有存货的对象都向一端移动,然后直接清理掉端边界以外的内存。
这里写图片描述

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

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/134176.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 杀进程 AIX_进程杀不死

    杀进程 AIX_进程杀不死1. kill-9强制杀进程发现在pl/slq中找到对应的sessionid杀不掉直接记住id登录下linux下kill-9id强杀2. ps-ef|grepjava  在系统所有进程数中用管道符查找包含"java"的进程 3. taillog查看log   ======================在AIX机器…

  • 罗技k380无线键盘怎么连接电脑_罗技k480切换输入法

    罗技k380无线键盘怎么连接电脑_罗技k480切换输入法一、核实蓝牙键盘是否开启:蓝牙键盘有单独的开关,若蓝牙键盘没有打开,则无法使用。开启方法:键盘开机键在键盘的左侧位置,将开关向左移动到ON即可开启,二、核实蓝牙键盘是否有电:蓝牙键盘是需要单独充电的设备,若蓝牙键盘没有电,则无法使用。充电方法:在键盘左侧位置有充电端口,将充电器连接到此端口即可为键盘充电注:键盘充电时,电源指示灯会变为红色,充电完毕后,电源指示灯会变为蓝色。三、将键盘与平板电脑重新…

    2022年10月15日
  • Git创建远程分支并提交代码到远程分支「建议收藏」

    Git创建远程分支并提交代码到远程分支「建议收藏」1、可以通过gitbranch-r命令查看远端库的分支情况如图所示,远程仓库只有一个master分支2、从已有的分支创建新的分支(如从master分支),创建一个dev分支但此时并没有在远程仓库上创建分支如图所示还是只有一个master分支3、建立本地到远端仓库的链接–这样代码才能提交上去使用命令行gitpush–set-…

  • textmate快捷键 汇总

    textmate快捷键 汇总TextMate列编辑模式按住Alt键,用鼠标选择要插入字符的行。如果仅仅是插入字符,注意选择0列-选择多列的话会把它们覆盖掉。选择完毕应该是看到一条细细的竖线,然后输入要插入的字符。TextMate会实时显示所有的更改,很直观,这是TextMate比VIM好的地方。如果只是在许多行前插入空格,则可以选中这些行,使用快捷键Cmd+]增加缩进,在Text…

  • 很好的理解遗传算法的样例

    很好的理解遗传算法的样例

  • BeanUtils.populate的用法

    BeanUtils.populate的用法BeanUtils位于org.apache.commons.beanutils.BeanUtils下面,其方法populate

发表回复

您的电子邮箱地址不会被公开。

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