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

相关推荐

  • 项目管理pmp有没有用

    项目管理职业资格(PMP)认证代表项目管理领域的高专业水平。拥有PMP对于职业发展具有积极作用。1、提升个人项目管理能力;2、增强雇主信任;3、促进薪酬增长;4、开启更多工作机会。在众多行业中,PMP认证已被视为衡量项目管理专业人士资质的重要标准。它不仅有助于个人发展项目管理技能和知识,而且可以帮忙…

    2024年1月8日
    23800
  • Java和c语言有啥区别呀学哪个好

    Java和c语言的区别有:1、在继承中的区别;2、在动态、静态绑定中的区别;3、在初始值的区别;4、在抽象方法或抽象类的区别;5、super关键字的区别。在继承中的区别是指C语言是多线继承,JAVA是单继承的。 1、在继承中的区别 C语言是多线继承,比如:小轿车和货车都继承了汽车类,奥迪2000是继…

    2023年2月13日
    62400
  • 为什么配置vscode需要调试

    配置VSCode需要调试,是因为它能确保开发环境正确、有效率、并且适合开发者的个性化需求。具体来说,调试过程可以帮助我们检测配置错误、提高编码效率、定制个性化开发环境、保证插件或扩展之间的兼容性、及时解决潜在问题,还有优化整个软件开发的运行流程。 详细来说,提高编码效率是调试配置VSCode非常重要…

    2024年4月3日
    6800
  • oa办公系统首页

    OA办公系统首页通常作为企业信息化管理的门户,承载了任务管理、通知公告、邮件服务和个人工作台等多项功能。这一界面对于提升员工工作效率、优化企业工作流程具有显著作用1、提供即时信息交流的平台,确保员工及时获取企业最新动态2、集成多种办公应用。相较于其他页面,其设计理应注重易用性与信息实时性,同时具备高…

    2024年1月15日
    23000
  • 产品迭代如何取舍

    在产品迭代的过程中,决策者要面对一系列的取舍问题。明确产品目标、理解用户需求、分析资源限制、关注长期发展、维护核心竞争力和合理安排时间线是成功迭代至关重要的方面。决策者必须搞清楚哪些功能需要保留、强化或是去除,同时考虑哪些新功能或改进能为用户带来更大价值。考虑资源限制,合理分配,确保产品按时上线且质…

    2023年12月15日
    33100
  • 如何有效监控项目进度

    有效监控项目进度需要确立明确的项目目标和里程碑、创建详细的项目时间表、选择合适的进度跟踪工具、定期审查进度、使用进度跟踪指标、使用甘特图、及时沟通、处理偏差和问题、使用Earned Value Management、提前预测潜在的延误、考虑资源管理、监控关键路径、考虑外部因素、持续改进、培训和教育等。监控项目进度是项目管理的核心环节之一,它确保项目按计划进行并在预定时间内完成。

    2023年10月31日
    52200
  • DevOps中的自动化配置管理最佳实践

    自动化配置管理在DevOps实践中确保一致性、提高效率、减少手动错误。立即采用的最佳实践包括:1、使用版本控制、2、持续集成和部署、3、基础设施即代码、4、配置监控与审核、5、立即汇报与透明性。 这些实践之中,基础设施即代码(IaC)特别值得关注。这是一种通过高级机器可读的定义文件来自动设置和调整I…

    2024年1月4日
    26700
  • 前端devops是什么意思

    开篇直言,前端DevOps指的是将DevOps文化、实践和工具链引入到前端开发的流程中,旨在提升软件交付的速度、质量和效率。该概念中关键要素包括1、持续集成和部署(CI/CD)、2、自动化测试、3、监控与性能优化。专注于其中的持续集成和部署(CI/CD)环节,可明显观察到对开发周期效能的提升,这一实…

    2024年3月26日
    6700
  • 声明式编程和命令式编程有什么区别

    区别是:声明式编程是一种编程范式,与命令式编程相对立。它描述目标的性质,让计算机明白目标,而非流程。命令式编程是一种描述计算机所需作出的行为的编程典范。几乎所有计算机的硬件工作都是命令式的,大部分的编程语言都是命令式的。 声明式编程 声明式编程(英语:Declarative programming)…

    2023年2月16日
    1.6K00
  • 工程项目如何委托管理机构

    工程项目可以通过委托外部管理机构进行全面或部分管理。有效的委托管理、精选专业机构、建立明确的合作关系、实施常规监督是成功委托的关键因素。其中,精选专业机构尤为重要,需要确保所选机构具有丰富的工程管理经验、良好的市场信誉和专业的管理团队。只有在这样的基础上,才能通过紧密合作和有效沟通,确保项目目标的顺…

    2024年4月11日
    5100

发表回复

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

400-800-1024

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

分享本页
返回顶部