Java语言的GC为什么不实时释放内存

Java的GC不使用引用计数器方法,而是使用可达性分析算法。GC的目的是恢复已分配和未使用的内存,提高内存利用率和程序执行效率。如果我们对内存进行实时的垃圾分析和回收,将会消耗更多的资源和执行时间。

Java语言的GC为什么不实时释放内存-Worktile社区

1、最基本的纯引用计数方式的自动内存管理可以做到实时释放死对象,但却无法处理存在循环引用的对象图的释放。这个问题一定程度上可以通过引入弱引用的概念来解决,但通用的能处理带循环引用对象图的引用计数都是有别的管理方式备份的(通常是某种tracing GC,例如mark-sweep;也有名为“trial-deletion”的循环检测方法,但这个通常比tracing性能更差所以用得较少),例如CPython使用以引用计数为主、mark-sweep为辅的方式,Adobe Flash的ActionScript VM 2(AVM2)也是以延迟引用计数(DRC)为主、增量/保守式mark-sweep为辅。反之,像C++的std::shared_ptr就是纯引用计数,无法靠自己处理带循环引用的对象图,而必须靠程序员自己小心使用,在必要的地方用std::weak_ptr来破除循环;CPython在2.0之前也使用纯引用计数,无法处理循环引用,只能等着泄漏内存。既然通用的引用计数还得用tracing GC来备份,实现这样的自动内存管理等于得实现两份,想偷懒的话还不如一开始就只实现某种tracing GC,例如mark-sweep。

2、最基本的纯引用计数方式对引用计数器的操作非常频繁,这里有额外开销,至于是否严重到成问题就看具体应用的可忍受程度。在内存充裕的前提下,基本的tracing GC比基本的引用计数方式的性能更好(特别是从throughput角度看),不需要做冗余的计数器更新。同时,在多线程环境下引用计数器可能成为线程间共享的数据,需要做同步保护(这里把原子更新算同步保护的一种),这也是个额外开销的来源;因为tracing GC不需要维护引用计数器所以也就没有这种同步的开销。引用计数的这些性能缺点可以通过一些高级变种来缓解,例如前面提到AVM2的延迟引用计数,只记录堆上对象之间的引用计数而不记录栈上(主要是表达式临时值)对对象的引用计数,以此减少对计数器的更新次数来提高性能。详情可参考文档:MMgc | MDN。这些引用计数的高级变种通常意味着一定程度的延迟释放,跟楼主想实时释放的初衷就不符了。另一方面,虽然最基本的tracing GC会有较长的延迟,但它们也有高级变种,可以并行、并发、增量式执行,降低延迟;也有办法实现thread-local GC来应对像是“请求-响应”式的Web应用批量释放一个线程临时分配的对象的需求。

3、如果选用tracing GC来实现自动内存管理,它是不显式维护对象的引用计数的,也就没有“引用计数到0”的概念。所以基于tracing GC的JVM或其它语言的运行时环境自然不会“引用计数到0就释放对象”。

4、引用计数方式其实也有经典的卡顿情况。例子之一就是一个对象个数很多、引用链很长的对象图假如只是被一个引用而留活,那么那个引用一死就会引发大量对象扎堆释放(但却不是“批量释放”,开销不同),这一样会引起卡顿。单纯讨论最坏情况的话其实引用计数也有这样糟糕的一面。纯人工的malloc()/free()或new/delete可以让程序员人肉找出生命周期相同的对象,然后利用诸如arena之类的方式为它们分配内存,就可以它们死的时候真正批量释放掉它们,这样就很高效;但纯引用计数却不是这么回事。使用引用计数会否遇到这种卡顿全看你的程序里对象图的引用关系是怎样的。

作者:RednaxelaFX
链接:https://www.zhihu.com/question/21663879/answer/19007323
来源:知乎

延伸阅读

Java 编程语言是什么

Java具有大部分编程语言所共有的一些特征,被特意设计用于互联网的分布式环境。Java具有类似于C++语言的”形式和感觉”,但它要比C++语言更易于使用,而且在编程时彻底采用了一种”以对象为导向”的方式。使用Java编写的应用程序,既可以在一台单独的电脑上运行,也可以被分布在一个网络的服务器端和客户端运行。另外,Java还可以被用来编写容量很小的应用程序模块或者applet,做为网页的一部分使用。applet可使网页使用者和网页之间进行交互式操作。

文章标题:Java语言的GC为什么不实时释放内存,发布者:小编,转载请注明出处:https://worktile.com/kb/p/37402

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小编小编站长
上一篇 2023年2月8日 上午11:13
下一篇 2023年2月8日 上午11:52

相关推荐

  • citespace是什么软件

    citespace是一款优秀的文献计量学软件,全称为Citation Space(引文空间),是一款着眼于分析科学文献中蕴含的潜在知识,在科学计量学、数据可视化背景下逐渐发展起来的一款引文可视化分析软件,该软件是由陈美超教授支持开发的。 一、citespace简介 citespace是一款应用于科学…

    2023年3月18日
    98600
  • 软件怎么开发出来的

    软件开发流程是:一、需求收集与分析;二、原型设计;三、UI设计;四、开发;五、发布和推广;六、运营和维护。在开始任何一个项目之前,首先需要进行需求收集与分析。只有在清楚地了解用户需求和功能需求之后,才能进行后续的开发工作。 一、需求收集与分析 在开始任何一个项目之前,首先需要进行需求收集与分析。这一…

    2023年4月16日
    6000
  • 管理需求的软件有哪些

    管理需求的软件有:1、PingCode;2、Worktile;3、Jama Software;4、Visure;5、codebeamer;6、ReQtest;7、Xebrio;8、Calibre。PingCode 是国内知名的需求管理工具之一,曾在2021年曾获得36氪企服点评-国内研发管理工具榜单…

    2023年4月9日
    23300
  • JetBrains 的核心技术是什么

    Jetbrains的核心技术包括:只是用Java编写的增量解析器和词法分析器,通过Swing APIs在桌面上呈现。没有使用大数据、Hadoop、Kafka、NodeJS或任何其他 “很酷很时尚 “技术。他们没有做出只是服务于一种时尚和流行趋势的技术决定:比如把整个IDE放在…

    2023年2月21日
    14600
  • 企业开发软件前需要思考哪些问题

    企业开发软件前需要思考的问题有:1、不要盲目跟风;2、结合自身公司状况;3、不重视开发人员的建议;4、想好自己想要的功能。有些企业看到另一个企业有自己的软件,就有了软件开发的想法,而不考虑行不行得通,因为不是所有的公司都适合的。 一、不要盲目跟风 有些企业看到另一个企业有自己的软件,就有了软件开发的…

    2023年5月7日
    4300
  • 为什么要用IoC和AOP

    用IoC和AOP的原因包括:1、提高代码的可维护性;2、增强模块间的解耦合;3、提升代码的复用性;4、减少代码重复;5、提高开发效率。使用IoC和AOP可以提高代码的可维护性。在IoC中,对象的创建和生命周期管理都交给IoC容器来处理,这意味着开发者不需要关心对象的创建和销毁,只需关心业务逻辑的实现…

    2023年7月13日
    9800
  • resultType和resultMap的区别是什么

    resultType和resultMap的区别是:1、对象不同;2、描述不同;3、类型适用不同。resultMap如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。 一、对象不同 1、resultmap:resultMap如果查询出来…

    2023年5月12日
    11900
  • T语言的特点是什么

    T语言的特点是:1、易上手的编程语言;2、完整的功能库支持;3、支持多线程;4、简单实用的界面设计。简单易用的语法,多语言语法编写,T语言的代码看起来就是像一篇文章一样,简单易懂,可以让人细细品尝。 一、什么是T语言 T语言(Ttyu software language)是一种通过定义的方式自动生成…

    2023年5月12日
    7100
  • 日程app哪个好用

    好用的日程app有:一、中华万年历日历;二、365日历;三、滴答清单;四、生日管家;五、万年历;六、奇妙日程;七、多多便签;八、微约日历;九、腾讯日历;十、超级日程表。中华万年历日历直接上手机里面看一些传统的日历就可以了,而且里面还会显示天气。 一、中华万年历日历 很多人都喜欢在家里挂一个万年历,那…

    2023年3月31日
    16100
  • 多开浏览器是什么

    浏览器多开,又称为浏览器分身,是指通过一个浏览器能够同时登录同一网站的多个账号而不相互影响。多开浏览器是可以在同一时间内登录多个账号,并且可以保证每个账号都是独立运行的超级浏览器,也可用于跨境电商行业多账号防关联使用。 多开浏览器是可以在同一时间内登录多个账号,并且可以保证每个账号都是独立运行的超级…

    2023年5月29日
    18700

发表回复

登录后才能评论
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部