acm-header
登录

ACM通信

Kode恶性

bug和吹牛的权利


bug和吹牛的权利,插图

图片来源:Iwona Usakiewicz / Andrij Borys Associates

回到顶部亲爱的KV

我一直在处理一个用Java编写的大型程序,它似乎花了大部分时间要求我重新启动它,因为它耗尽了内存。我不确定这是否是JVM (Java虚拟机)的问题,我正在使用或在程序本身,但在这些频繁重启期间,我一直在想为什么这个程序是如此令人难以置信的膨胀。我本以为Java的垃圾收集器会防止程序耗尽内存,特别是当我的桌面有很多内存的时候。似乎8g已经不足以处理现代IDE了。

缺乏公

回到顶部

亲爱的缺乏

8 g ? !这就是你的全部吗?你是在电脑死亡的荒漠荒原给我写信吗?在现代社会,没有人会用低于48GB的内存来运行机器,至少没有人会想要运行某些非常特殊的Java代码片段。

虽然我想花几百个字抨击java,像所有语言一样,它有许多缺点,您正在经历的问题可能与垃圾收集器中的bug无关。这与你正在运行的代码中的错误有关,也与人类思维中的某个基本错误有关。我将依次说明这两个问题。

代码中的bug很容易描述。任何将内存管理从程序员手中夺走并将其放入自动垃圾收集系统的计算机语言都有一个致命的缺陷:程序员可以很容易地阻止垃圾收集器完成其工作。任何仍然具有引用的对象都不能被垃圾收集,因此被释放回系统内存中。

不释放引用的粗心程序员会导致内存泄漏。在有许多对象的系统中(Java程序中几乎所有的东西都是对象),一些小的泄漏会很快导致内存不足的错误。这些内存泄漏很难找到。有时它们驻留在您自己正在处理的代码中,但通常它们驻留在您的代码所依赖的库中。如果不能访问库代码,就不可能修复这些bug,即使能够访问源代码,谁会想要花时间修复其他人代码中的内存泄漏呢?我当然不喜欢。摩尔定律经常保护傻子和小孩子不受这些问题的影响,因为当频率调整停止时,内存密度会继续增加。当你的老板嚷嚷着要发布你正在开发的新版本时,为什么还要费心去寻找代码中的小漏洞呢?“系统坚持了一整天,发货吧!”

第二种危害要大得多。您没有问的一件事是:“为什么我们的系统中要有一个垃圾收集器?”我们使用垃圾收集器的原因是,在过去的某个时候,一些人——实际上是一群人——想要解决另一个问题:程序员无法管理自己的内存。c++是另一种面向对象的语言,它在程序执行时也有很多对象。众所周知,在c++中,必须使用new和delete创建或销毁对象。如果它们没有被销毁,那就是内存泄漏。程序员不仅必须管理对象,而且在c++中,程序员还可以直接访问作为对象基础的内存,这将导致调皮的程序员接触他们不应该接触的东西。c++运行时并没有说,“糟糕的操作,请联系大人”,但这就是分割错误的真正含义。根据您的不同观点,垃圾收集的发布要么是为了将程序员从手工管理内存的乏味中解放出来,要么是为了防止他们做一些不正经的事情。

问题是我们用一套问题换了另一套问题。在垃圾回收之前,我们会忘记删除对象,或者错误地重复删除对象;在垃圾收集之后,我们必须管理对对象的引用,坦率地说,这与忘记删除对象是完全相同的问题。我们用指针交换参考资料,却一点也不明白。

KV的长期读者知道,银弹永远不起作用,而且必须非常小心地保护程序员不受他们自己的伤害。创建垃圾收集语言的一个副作用是,让虚拟机管理内存的开销对于许多工作负载来说都太高了。性能上的损失导致人们构建巨大的Java库,这些库不使用垃圾收集,并且必须手动管理对象,就像在c++等语言中所做的那样。当您的一个关键特性的开销如此之高,以至于您自己的用户创建了巨大的框架来避免该特性时,就出现了严重的问题。

目前的情况是这样的:对于c++(或C)程序,您更有可能看到分割错误和内存破坏错误,而不是在拥有大量RAM的现代系统中看到内存不足的错误。如果你运行的是用Java写的东西,那么你最好花钱购买所有你能管理的内存棒,因为你会需要它们。

KV

回到顶部

亲爱的KV

我不禁注意到,许多大型系统自称为“操作系统”,但实际上它们与操作系统并没有太多相似之处。操作系统的定义已经改变到任何大型软件都可以自称为操作系统的地步了吗?

是否为操作系统

回到顶部

亲爱的操作系统

当然,我对操作系统的定义并没有改变到任何大型软件都可以自称为操作系统的地步,但我也发现了这种趋势。一个古老的笑话是,每个程序的大小都在增长,直到它可以用来阅读电子邮件,如果你相信维基百科,这是杰米·扎文斯基,基于格雷格·库伯伯格的一个早期笑话,“麻省理工学院的每个正在开发的程序都在扩大,直到它可以阅读邮件。”现在看来,光靠邮件是不够的。每个大型程序都会展开,直到它的名字后面加上“OS”。


程序员永远不会停止将自己的代码与同行的代码进行比较。


操作系统是一种用于有效访问底层硬件的程序,希望是一种可移植的方式,尽管这不是严格的要求。该软件的目的是为程序员提供一组一致的api,这样他们每次想在新的计算机模型上运行程序时就不需要重写底层代码。这可能不是牛津英语词典定义为一个操作系统,但最近它把“自拍”(selfie)加入了它的字典,并将其命名为2013年的年度词汇,无论如何,我开始对他们的输出质量不太满意了。

我认为,程序员倾向于将自己的大型作品贴上操作系统的标签,是因为他们需要获得炫耀的权利。程序员永远不会停止将自己的代码与同行的代码进行比较。甚至在实际的操作系统项目中也可以看到相同的情况。每个人似乎都想(重新)编写调度程序。为什么?因为对许多程序员来说,这是系统中最重要的代码,如果他们做得很好,调度器运行得很好,他们会让同行羡慕不已。尽管调度程序应该非常小,非常非常简单,但这不是重点。问题的关键在于,一个人可以从改写它(通常是无数次改写)中获得吹牛的权利。

这并不是要贬低那些长期辛苦地编写复杂代码、让我们的生活变得更好的程序员或程序员团队。但是,如果仔细观察,您会发现这些代码片段的名称是恰当的,它们不需要附加在操作系统上使它们看起来更大。

KV

ACM队列的q戳相关文章
queue.acm.org

陶醉于约束
布鲁斯·约翰逊
http://queue.acm.org/detail.cfm?id=1572457

获得你的Kode On
乔治Neville-Neil
http://queue.acm.org/detail.cfm?id=1117397

现代操作系统中的自愈
迈克尔·w·夏皮罗
http://queue.acm.org/detail.cfm?id=1039537

回到顶部

作者

乔治诉Neville-Neilkv@acm.org)是内维尔-尼尔咨询公司的所有人,也是ACM队列编辑委员会。他从事网络和操作系统的代码编写工作,从中获得乐趣和利润,教授各种与编程相关的课程,并鼓励您发表与他有关的评论、妙语和代码片段通信列。


版权由所有人/作者持有。

数字图书馆是由计算机协会出版的。版权所有©2014 ACM股份有限公司


没有发现记录

Baidu
map