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

相关推荐

  • 项目按年度管理指什么

    项目按年度管理,是指将项目的计划、执行、监控和收尾等各个阶段按照年度进行划分和管理。通常,这种管理方式包括了对项目目标的设定、对项目进度的监控、对项目成果的评估以及对项目风险的控制等。其中,对项目目标的设定是按年度管理的重要环节。每年开始时,项目团队会根据项目总体目标,设定一年的具体目标,包括项目完…

    2024年8月6日
    000
  • 乐鑫项目管理做什么

    乐鑫项目管理主要负责规划项目进度、协调资源、控制项目风险、确保项目顺利进行。具体来说,乐鑫项目管理会在项目开始前,详细规划项目的目标、进度、预算和人员配置等重要信息。在项目进行中,乐鑫项目管理需要协调各方资源,以确保项目的顺利进行。此外,乐鑫项目管理还需要对项目进行风险控制,及时发现和解决可能出现的…

    2024年8月6日
    000
  • 项目管理属于什么编制类

    项目管理属于企业管理编制类,通常涵盖规划、组织、执行、监控等多个环节。项目管理的核心在于通过系统化的方法确保项目目标的实现。规划是其中最为关键的一步,通过详细的规划可以明确项目的目标、范围、进度和资源分配,从而为项目的成功奠定坚实的基础。规划阶段不仅要明确项目的具体目标,还需要制定详细的项目计划,明…

    2024年8月6日
    000
  • 项目管理中什么最难学

    在项目管理中,最难学的是风险管理、团队管理、沟通技巧、资源分配。其中,沟通技巧尤为关键,因为它涉及到项目各个环节的协调与信息流通。有效的沟通技巧能够确保项目团队成员之间的信息传递准确无误,促进项目的顺利进行。很多项目失败的原因之一就是沟通不畅,导致误解和执行偏差。因此,掌握有效的沟通技巧是项目管理中…

    2024年8月6日
    000
  • 什么是境外投资项目管理

    境外投资项目管理,简而言之,是指对企业进行境外投资活动的全过程进行规划、组织、指导、协调、控制和评价的一种管理活动。其核心目标是通过有效的管理手段和方法,实现企业境外投资的经济效益和社会效益的最大化。该管理活动主要包括境外投资决策、投资实施、投资运营及投资退出等几个环节。在这其中,境外投资决策是企业…

    2024年8月6日
    000

发表回复

登录后才能评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

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

分享本页
返回顶部