java gc算法_JAVA GC算法简介

java gc算法_JAVA GC算法简介GC 是 java 语言对回收不在继续使用的内存空间进行回收的程序流程的一个简介 所以说 GC 总共需要做以下的几件事情 1 首先需要确认哪些内存需要被回收 2 回收的时候应用程序是否可以承担这次操作 3 回收之后的内存如何在应用到程序中 1 首先我们需要判断哪些内存需要被回收目前大家应该理解 java 里对象的概念 如果说一个对象创建后 程序运行时 对象并没有被使用 或者之前被使用 但是运行一段时间之后 对象没

GC是java语言对回收不在继续使用的内存空间进行回收的程序流程的一个简介。

所以说GC 总共需要做以下的几件事情:

1.首先需要确认哪些内存需要被回收

2.回收的时候应用程序是否可以承担这次操作

3.回收之后的内存 如何在应用到程序中

1.首先我们需要判断哪些内存需要被回收

目前大家应该理解java里对象的概念,如果说一个对象创建后,程序运行时,对象并没有被使用,或者之前被使用,但是运行一段时间之后,对象没有被使用。

这样就代表这这个对象是应该被回收的一个状态。

下面咱们看一下java是如何判断这个对象有没有被使用的

1.引用计数法,编译时候 如果当前对象有引用的情况下 就给当前对象的引用计数器+1

当引用执行过后 将计数器-1;

当计数器为0的时候 java会判断当前对象是死亡状态,当前对象占用的内存可以被回收。

(但是 目前主流的GC都已经不再使用此算法,简单来说 如果俩个对象相互引用,那就会造成俩个对象的引用永远都为1,不会被回收)

2.可达性算法   利用树的概念 每一个对象都是一个节点,如果有节点链接不到这树上之后,当前节点 就会被回收。

此图是知乎上一个回答盗用的,https://www.zhihu.com/question/

24932bdfe401

从当前图中 我们可以看到 实例三和实例五 是可以被回收的,因为对于GCRoots来说 他们并不可达。

2.当那些被java虚拟机认定已经死亡的对象,并不会立马被回收,什么时候会回收这些内存?

如果对象复写了finalize(),当前对象会被加载到finalize F-Queue中

没有复写的话 就是直接被回收,

3.回收内存的算法(这里暂时不详细介绍这几种算法的实现,简单介绍下实现过程)

1、标记 清除算法

其实就是如果说不可达的内存就会被直接回收,然后每次都需要遍历一次,而且会产生大量的内存碎片(因为有些连续内存区的对象,有些被标记 有些被回收,如果想要一片连续的内存,就没有办法在这片内存区申请)

2.复制算法

其实就相当于是一种上述算法的优化 去解决连续内存的问题,实现方式比较简单,就是将现在正在使用的内存 开辟一个跟使用内存大小一样的区域,然后将所有可达的内存区域都复制到新开辟的区域,剩下之前的区域全部回收。

3.标记整理算法

这个其实就是一片连续的内存区域,将所有存活的对象都向左或向右移动,这样一侧的对象都是存活的 另一侧 都是空闲下来的内存,相较于复制来说  内存相对规整,不需要复制

但是效率不如复制算法。

现代商业虚拟机会将java堆分成新生代和老年代,老年代的对象大部分都是长期存活的对象采取标记整理算法,然后新生代对象 大部分都采取复制算法 ,因为新生代对象大部分存活时间比较短,每次会腾出很多新的空间。

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

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

(0)
上一篇 2026年3月18日 上午7:13
下一篇 2026年3月18日 上午7:13


相关推荐

  • vue修饰符简略总结[通俗易懂]

    vue修饰符简略总结[通俗易懂]vue修饰符主要分为:1.表单修饰符;2.事件修饰符;3.按键修饰符,其中包含特殊修饰符:系统修饰键,.exact修饰符;4.鼠标按钮修饰符;5.其他修饰符,包含:.sync,.prop,.camel一、表单修饰符(用法一致为表单元素使用v-model时加修饰符:v-model.修饰符)1).trim:去除仅首尾的空格2).lazy…

    2025年6月20日
    7
  • HDU 1754 I Hate It (段树单点更新)

    HDU 1754 I Hate It (段树单点更新)

    2022年1月7日
    48
  • java comparator 升序、降序、倒序从源码角度理解

    java comparator 升序、降序、倒序从源码角度理解环境 jdk 1 7 前言之前我写过关于 comparator 的理解 但是都理解错了 java 自定义排序 Comparator 升序降序的记法 特别是上面这篇 完全理解错了 排序的真正的意思 最近通过查看源码 打断点的方式 一步步的查看 演算 算是明白了 当时我心里的疑惑是 1 到底表示不表示倒序 1 0 1 这三个值真的需要同时使用吗 能不能只使用其

    2026年3月18日
    3
  • 学c++还是学java就业「建议收藏」

    学c++还是学java就业「建议收藏」Java更偏向业务型开发,比如银行的xx管理系统,安卓手机的软件以及WEB等等。java更容易入手,学会用框架基本就能来开发,开发效率(完成的速度)相对高,当前相对C++更好就业,薪资平均水平相比C++略高(参考2014年谷歌统计数据)。C++,难度相对高,入手较难深入也难,它涉及的内容很多,特性很多,可以做一些考虑性能(并发,速度)的东西,比如各种后台服务,游戏的后台部分,C++主要更服务器打交道,当然你要用上MFC,QT等也能做界面的东西。前途还是钱途:当前的话,可能Java性价比更高。不过游戏,

    2022年7月17日
    17
  • Mac 长按键盘快速输入(长按输入慢的问题)

    Mac 长按键盘快速输入(长按输入慢的问题)

    2021年5月13日
    137
  • PyCharm 调试Debug入门

    PyCharm 调试Debug入门为了摈弃 print 的暴力调试法 在 mentor 的耳濡目染下 我开始了 PyCharm 的 Debug 例程 defhelloworl print helloworld a 1b 2c 3foriinrange 5 print i a 3b 4c 5helloworld print end 1 先设置红

    2026年3月18日
    2

发表回复

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

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