获取和解析网站将比垃圾收集器花费更多时间,其影响可能是不可理解的。此外,自动内存管理在处理大量小对象(如字符串)时通常比通过new / delete进行手动内存管理更有效。没有谈论垃圾收集内存更容易使用的事实。
垃圾收集(GC)基本上是一个时空权衡。您拥有的内存越多,您的程序执行垃圾收集所需的时间就越少。只要相对于最大实时大小(使用的总内存),您有大量可用内存,GC的主要性能 - 整堆集合 - 应该是罕见的事件。 Java的其他优势(特别是健壮性,安全性,可移植性和出色的网络库)使这一切变得简单。
对于与您的同事共享的一些硬数据,显示GC的性能和 malloc / free 有足够的可用内存,请参阅:
malloc
free
“ 的 量化垃圾收集与显式内存管理的性能 强> “,Matthew Hertz和Emery D. Berger,OOPSLA 2005。
本文为一个古老的问题提供了经验答案:是 垃圾收集更快/更慢/与malloc / free相同的速度?我们 介绍oracular内存管理,一种让我们测量的方法 不加改变的Java程序,好像他们使用malloc和free一样。结果:a 好的GC可以匹配好的分配器的性能,但需要5倍 更多的空间。但是,如果物理内存很紧,常规垃圾 收集器遭受一个数量级的性能损失。
纸: PDF 演示幻灯片: PPT , PDF
C ++程序员对GC的典型关注点是延迟。也就是说,当您运行程序时,周期性GCs会中断mutator并导致延迟峰值。回到以前,我曾经以Java Web应用程序为生,我有几个客户会看到日志中的延迟峰值并抱怨它 - 我的工作是调整GC以最大限度地减少这些峰值的影响。多年来,GC的一些相对复杂的进步使得怪异的Java应用程序以一致的低延迟运行,并且我对Sun(现在的Oracle)的工程师的工作印象深刻,他们使这成为可能。
但是,GC始终非常擅长处理高吞吐量的任务,其中延迟不是问题。这包括cron工作。你的工程师没有根据的担忧。
注意:一个简单的实验GC将内存分配/释放的成本平均降低到少于两个指令,这提高了吞吐量,但这种设计相当深奥,需要大量内存,而EC2上没有这些内存。
最简单的GC提供了大堆(高延迟,高吞吐量)和小堆(低延迟,低吞吐量)之间的权衡。需要进行一些分析才能使其适合特定的应用程序和工作负载,但这些简单的GC在大型堆/高吞吐量/高延迟配置中非常宽容。
我没有任何硬数据支持这一点,但是执行大量小字符串操作的代码(在很短的时间内进行大量的小分配和解除分配)应该是 的 快多了 强> 在垃圾收集环境中。
原因是现代GC通过将对象从“eden”空间移动到幸存者空间然后再移动到终身对象堆来定期“重新打包”堆,而现代GC则针对许多小的情况进行了大量优化对象被分配,然后快速释放。
例如,在Java中构建一个新字符串(在任何现代JVM上)是 的 和堆栈分配一样快 强> 在C ++中。相比之下,除非你在C ++中使用花哨的字符串池,否则你将会为你的分配器带来大量小而快速的分配。
此外,还有其他几个很好的理由可以考虑将Java用于这种类型的应用程序:它对网络协议提供了更好的开箱即用支持,这对于获取网站数据是必需的,并且它对于面对恶意内容时缓冲区溢出的可能性。