垃圾收集 java_Java的内置垃圾收集如何使您的生活更美好(大部分时间)

垃圾收集 java

通过从您的应用程序学习企业APM产品,发现更快,更有效的性能监控。 参加AppDynamics APM导览!

“无需为用户编写将寄存器返回到自由存储列表的程序。”

这条线(以及随后的十几条线)被埋在约翰·麦卡锡(John McCarthy)具有里程碑意义的论文中 ,该论文发表于1960年,“符号表达式的递归函数及其由机器进行的计算”。这是对自动内存的第一个已知描述。管理。

在指定如何在Lisp中管理内存时,McCarthy能够排除显式的内存管理。 因此,麦卡锡(McCarthy)减轻了开发人员对手动内存管理的烦恼。 使这个故事真正令人惊奇的是,这几个词激发了其他人将某种形式的自动内存管理(也称为垃圾收集 (GC))整合到此后开发的四分之三的更广泛使用的语言和运行时中。 该列表包括两个最受欢迎的平台,即Java的虚拟机 (JVM)和.NET的公共语言运行时 (CLR)以及Google即将推出的Go Lang 。 GC不仅存在于大型企业中,还存在于移动平台上,例如Android的Dalvik,Android Runtime和Apple的Swift。 您甚至可以在Web浏览器以及诸如SSD之类的硬件设备上找到运行的GC。 让我们探讨一些为什么行业更喜欢自动化而不是手动内存管理的原因。

自动内存管理的开端

那么,麦卡锡如何设计自动内存管理? 首先,Lisp引擎将Lisp表达式分解为子表达式,每个S表达式都存储在链接列表中的单个单词节点中。 节点是从空闲列表中分配的,但是不必将它们返回到空闲列表,直到它为空。

一旦空闲列表为空,运行时就会跟踪链接列表并标记所有可到达的节点。 接下来,它扫描包含所有节点的缓冲区,并将未标记的节点返回到空闲列表。 重新填写自由列表后,应用程序将继续。

今天,这被称为单空间,就地跟踪垃圾收集。 该实现非常简单:它只需要处理一个非循环定向图,其中所有节点的大小都完全相同。 只有一个线程运行,并且该线程执行了应用程序代码或垃圾回收器。 相比之下,当今JVM中的收集器必须应对循环和节点大小不一致的有向图。 JVM是多线程的,在多核CPU(可能是多插槽的主板)上运行。 因此,今天的实现要复杂得多,以至于GC专家很难预测任何给定情况下的性能。

进度缓慢:垃圾回收暂停时间

当Lisp垃圾收集器运行时,应用程序停止了。 在Lisp的初始版本中,收集器通常占用30%到40%的CPU周期。 在1960年代的硬件上,这可能导致应用程序停顿几分钟,这被称为“世界停止” 。 好处是分配几乎对应用程序吞吐量(完成的有用工作量)没有任何影响。 此实现突出显示了暂停时间和对应用程序吞吐量的影响之间的持续斗争,这一斗争一直持续到今天。

通常,收集器的暂停时间特性越好,它对应用程序吞吐量的影响就越大。 Java当前的所有实现都带有暂停时间/开销成本。 并行收集具有较长的暂停时间和较低的开销,而大多数并发的收集器具有较短的暂停时间并消耗更多的计算资源(包括内存和CPU)。

任何GC实现者的目标都是最大程度地保证保证变种线程接收的最少处理器时间,这一概念称为最小变种利用率(MMU)。 即使这样,当前的GC开销也可以很好地运行在5%以下,而在典型的C ++应用程序中,您会遇到15%到20%的开销。

那么,为什么不像在Java应用程序中那样感到这种开销呢? 由于开销在C / C ++运行时间中平均分布,因此最终用户看不到它。 实际上,有关托管内存的最大抱怨是,它在无法预测的时间内暂停了您的应用程序不可预测的时间。

垃圾收集进展

Sun Java最初的垃圾收集器并没有改善垃圾收集的形象。 它的单线程,单行距实现使应用程序停滞了很长时间,并极大地拖累了分配率。 直到Java 2才引入了代内存池方案(以及并行的(主要是并发的和增量的)收集器)。 尽管这些收集器提供了改进的暂停时间特性,但是暂停时间仍然是个问题。 而且,这些实现非常复杂,以致大多数开发人员不太可能具有调整它们的必要经验。 为了使情况更加复杂,IBM,Azul和RedHat拥有一个或多个自己的垃圾收集器-每个垃圾收集器都有各自的历史,优势和怪癖。 此外,包括SAP,Twitter,Google,阿里巴巴在内的许多公司都拥有自己的内部JVM团队,并带有Garbage收集器的修改版本。

随着时间的流逝,增加了备用且更复杂的分配路径导致分配开销图片的巨大改进。 例如,JVM中的快速路径分配现在比C / C ++中的典型分配快大约30倍。 麻烦之处在于:只有可以通过转义分析测试的数据才有资格进行快速路径分配。 (幸运的是,我们的绝大多数数据都通过了此测试,并从此备用分配路径中受益。)

另一个优点是撤离收集器带来的成本降低和成本模型简化。 在这种方案中,收集器将实时数据复制到另一个内存池。 因此,不存在恢复短命数据的成本。 这并不是分配广告恶心的邀请,因为每次分配都会产生成本,并且高分配率会触发更频繁的GC活动并累积额外的复制成本。 抽空收集器有助于提高GC的效率和可预测性,但是仍然存在大量资源成本。

那导致我们记忆。 内存管理要求您保留的内存至少是手动内存管理需要的五倍。 开发人员有时肯定知道应该释放数据。 在这些情况下,显式释放而不是通过决策使收集者有理由便宜。 正是这些成本使苹果最初选择了Objective-C的手动内存管理。 在Swift中,Apple选择使用引用计数。 他们为弱引用和自有引用添加了注释,以帮助收集器应对循环引用。

还有其他无形的或难以衡量的成本可以归因于运行时的设计决策。 例如,失去对内存布局的控制权可能导致应用程序性能受L2高速缓存未命中和高速缓存行密度的支配。 在这些情况下,性能下降很容易超过10:1。 未来实现者面临的挑战之一是如何更好地控制内存布局。

回顾一下当第一次将Lisp引入Lisp时GC的性能如何,以及通向目前状态的漫长而又令人沮丧的道路,很难想象为什么任何构建运行时的人都想使用托管内存。 但是请考虑一下,如果您手动管理内存,则需要访问底层的参考系统-这意味着该语言需要添加语法来操作内存指针。

依靠托管内存的语言始终缺乏管理指针所需的语法,因为可以保证内存一致性。 这保证了所有指针都将指向它们应指向的位置,而如果您碰巧踩了它们,则无需悬空(空)指针等待耗尽运行时间。 如果允许开发人员直接创建和操作指针,则运行时无法保证。 另外,将其从语言中删除会消除间接性,这是开发人员更难掌握的概念之一。 漏洞经常是由于从事精神体操的开发人员需要处理许多竞争问题并弄错而导致的。 如果这种混合包含通过应用程序逻辑进行推理,以及手动内存管理和不同的内存访问模式,则错误可能会出现在代码中。 实际上,依赖手动内存管理的系统中的错误是当今系统中最严重和最大的安全漏洞来源之一。

为了防止这些类型的错误,开发人员总是要问:“我是否仍然有可行的参考资料来阻止我释放这些资料?” 这个问题的答案通常是“我不知道”。 如果将对这些数据的引用传递到系统中的另一个组件,则几乎不可能知道是否可以安全地释放内存。 众所周知,指针错误会导致数据损坏,或者在最佳情况下会导致SIGSEGV。

从图片中删除指针往往会产生一个更具可读性,更易于推理和维护的代码。 GC知道何时可以回收内存。 此属性使项目可以安全地使用第三方组件,这在使用手动内存管理的语言中很少发生。

结论

在最佳状态下,内存管理可谓是一项繁琐的簿记任务。 如果可以将内存管理排除在待办事项之外,那么开发人员往往会提高工作效率,并产生更少的错误。 我们还已经看到,GC并不是万能药,因为它有其自身的一系列问题。 但值得庆幸的是,向更好的实现迈进的步伐还在继续。

Go Lang的新收集器结合了引用计数和跟踪功能,以减少开销并最大程度地减少暂停时间。 Azul声称已通过大大降低暂停时间来解决GC暂停问题。 Oracle和IBM一直在致力于收集器,他们认为收集器更适合包含大量数据的超大堆。 RedHat已与Shenandoah展开竞争,Shenandoah的目标是从运行时间中完全消除暂停时间。 同时,Twitter和Google继续改善现有的收藏家,因此它们继续对新的收藏家具有竞争力。

通过从您的应用程序学习企业APM产品,发现更快,更有效的性能监控。 参加AppDynamics APM导览!

翻译自: https://www.javacodegeeks.com/2017/02/javas-built-garbage-collection-will-make-life-better-time.html

垃圾收集 java

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/335410.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python函数的使用方法_百度资讯搜索_python函数的使用方法

金生水起程序猿 2020年11月22日 11:23函数语法格式及调用参数:默认值、元组和字典可变参数的使用全局变量和局部变量作用域,局部变量如何升级为全局变量函数是可重复使用的,实现单一功能的代码块。可以把项...百度快照金生水起程序猿 2020年11月22日 12:13函数类型定义:python中…

red hat 4.1.2_安装Red Hat Container Development Kit 2.2版本

red hat 4.1.2当应用程序开发人员或架构师负责探索容器化应用程序提供的可能性时,没有比“红帽容器开发套件”(CDK)容易的了。 Red Hat CDK具有本地OSX,Linux或Windows环境所需的所有Cloud工具,并且已预先配置了一些容…

高斯背景建模 matlab,高斯背景建模整理 – 要饭的

OpenCV 中高斯背景建模相关论文BackgroundSubtractorMOG:Paper : An Improved Adaptive Background Mixture Model for Real-time Tracking with Shadow DetectionWebsite : http://personal.ee.surrey.ac.uk/Personal/R.Bowden/publications/avbs01/avbs01.pdf创新点 &#x…

apache ignite_使用Apache Storm和Apache Ignite进行复杂事件处理(CEP)

apache ignite在本文中, “使用Apache Ignite进行高性能内存计算”一书的作者将讨论使用Apache Strom和Apache Ignite进行复杂的事件处理。 本文的一部分摘自 书 。 术语“复杂事件处理”或CEP没有广泛或高度接受的定义。 Wikipedia的以下引用可以简要描述什么是复…

tpm php,TPM系列

近来一直在整理资料,刚好看到有比较详细的介绍,就发扬一下“拿来主义”吧:)顺便鄙视一下某安全网站转载我的博客很乱:(1、安装环境准备1.1内核Linux内核2.6.12版本及以上,提供了对tpm芯片的支持,下载地址&a…

zookeeper 日志查看_每天使用的注册中心zookeeper,流量暴涨怎么办?

通过本文能学习什么?初步了解zookeeper监控如何运用tcpdump Wireshark抓包分析Dubbo在zookeeper上节点设计如何查看zookeeper节点快照背景zookeeper作为dubbo的注册中心,承载着服务的基础信息(方法名,分组,版本等),服…

javaone_JavaOne 2016 Essentials:您不应该错过的7个事件和会话

javaone参加JavaOne吗? 确保您不会错过这些活动 又到了每年的这个时候。 旧金山一年一度的Java假期即将来临,全市各地举行了超过400场会议和活动。 随着所有这些丰富的内容和新体验同时发生,很容易就无法跟踪正在发生的事情。 在这篇文章中…

python比较两张图片是否一样_opencv_判断两张图片是否相同

python金融风控评分卡模型和数据分析微专业课(博主亲自录制视频):http://dwz.date/b9vv本文为原创,转载请注明,作者 231469242qq.com OpenCV介绍 OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库&a…

bat 存储过程返回值_为什么不推荐使用存储过程?

之所以有这个题目,我既不是故意吸引眼球,也不想在本文对存储过程进行教科书般论述。最近项目中遇到的存储过程问题,让我想起了去年在武汉出差时一位同事的发问:我觉得存储过程挺好用的,为什么你不建议用?当…

Mac下载JDK/安装JDK/卸载JDK

文章目录下载JDK安装JDK配置环境变量卸载JDK下载JDK 访问这个地址:https://www.oracle.com/java/technologies/downloads/#java18 进入下载JDK的界面后,下拉界面到下图所示的位置: 或者访问这个地址:https://www.oracle.com/cn/…

kettle 只有一个输入记录期待设置变量并且至少已经收到2个变量._OPNET学习笔记2...

双击主机网络打开对应的节点模型,从图中可以看到网络的分层:应用层,传输层,网络层,链路层;其中在传输层中我们用到的主要是UDP(对实时性要求比较高),网络层又包括IP封装层…

python tkinter控件_Python3 tkinter基础 Label pack 设置控件在窗体中的位置

? python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 conda : 4.5.11 type setting : Markdown ? 普通布局 code """ Author : 行初心 Date : 18-10-1 Blog : www.cnblogs.com/xingchuxin GitHub : github.com/GratefulHeartCoder ""…

oracle的mins,分钟的英文缩写,10min还是10mins!

请问,分钟的英文缩写是min,小时的英文缩写是h,还是hr?秒的..._知乎[图文]时间分钟的英文缩写是什么minutes 10 minutes意思是十分钟的,比如说路程 10minutes就是十分钟 没有10minutes这种表达[图文]分钟 min【minute】 超过多少分钟就用介词past表示超过 还差几分钟…

postman测试工具,如何对参数使用md5加密

先创建环境变量password,并定义了变量值(例如:123456)访问登录接口通常是post提交登录用户名称和登录密码,且以json格式提交,所以在body-raw-json,填写json串如下图所示: 接着在pre-…

开源java性能分析工具_Java性能监控:您应该知道的5个开源工具

开源java性能分析工具鲜为人知但有用:开源应用程序性能监视的状态 对于任何应用程序来说,最重要的事情之一就是性能。 我们要确保用户获得他们能获得的最佳体验,并想知道我们的应用已启动并正在运行。 这就是为什么我们大多数人至少使用一种…

cmd编译可以通过执行没有结果_Go语言是如何完成编译的

Go语言是一门需要编译才能运行的编程语言,也就说代码在运行之前需要通过编译器生成二进制机器码,随后二进制文件才能在目标机器上运行,如果我们想要了解Go语言的实现原理,理解它的编译过程就是一个没有办法绕过的事情。预备知识想…

如何通过postman测试需要登录授权的接口

思路 请求需要登录授权的接口,就意味着你要传token给接口,所以请求接口(要测试的接口)之前就要先获取token,因为登录成功后服务端才会返回token,而token又设置了时效,所以每次请求接口&#xf…

wordpress linux 目录,快速搭建WordPress(Linux)

作者:彭济环境要求一、配置LAMP(LinuxApacheMysqlPHP)1、安装apachesudo apt-get install apache2 //安装apache2apache2 -v //查看版本网页访问本机ip地址,查看是否安装成功2、安装phpsudo apt-get install php //安装phpphp -v //查看版本sudo apt-get…

atheros蓝牙设备驱动 小米_小米Air 13笔记本黑苹果WiFi蓝牙硬件改装方案二

该方案适合小米笔记本Air 13初代,适合小米笔记本PRO等型号,适合通用的预留有M.2 PCIE通道SSD卡槽的电脑。也是作者极力推荐的终极改造方案。总体方案: 使用笔记本主板上的M.2 nvme通道 SSD硬盘接口进行拓展。使用BCM943602CS专用的M.2[NGFF]转接卡进行改…

python实现局域网攻击_通过python实现DNS欺骗

假设在一个的局域网内有两个人:Bob和Eve。Eve想让Bob访问他创建的恶意网页,这样她就可以通过隐藏性的下载给Bob的计算机上安装恶意软件,或者可能展示一个欺骗性的站点来试图窃取Bob的认证信息。(图片来自以上提供的链接&#xff0…