我正在考虑的科学应用程序大多受处理器限制,并且堆使用量很大(至少几个GB)。在一年中的任何其他时间,我都会很高兴地使用C ++,但是在这种情况下,我想知道,与Java压缩收集器的优势相比,C ++内存管理器的自然碎片是否会成为一个严重的问题。
有人可以指出与此相关的真实示例吗?
我正在考虑的科学应用程序大多受处理器限制,并且堆使用量很大(至少几个GB)。在一年中的任何其他时间,我都会很高兴地使用C ++,但是在这种情况下,我想知道,与Java压缩收集器的优势相比,C ++内存管理器的自然碎片是否会成为一个严重的问题。
有人可以指出与此相关的真实示例吗?
Answers:
如果你正在谈论这势必会应用强调的机器的限制,例如,你希望你会做的编程技巧,以避免超过这些限制,那么C ++是要走的路。C ++不仅为您提供了Java所没有的优化空间(正如Emilio所指出的那样),而且垃圾回收器是非常消耗内存的设备,它们需要大量额外的空闲内存才能有效地工作。
这个问题的答案:StackOverflow:垃圾回收需要多少额外的内存?画一个相当严峻的画面,但即使垃圾收集需要的空闲内存只有约尽可能多的已分配的内存,(这是我听说过的,)这还意味着,Java中,你仍然需要大量的空闲内存使其有效运行。
另一方面,如今,我们通常更喜欢购买更昂贵的硬件,而不是必须执行编程技巧来避免超出硬件限制。在您的情况下,通常可以通过使用64位计算机并在必要时在其上抛出尽可能多的RAM模块来解决RAM问题。您会看到,当今的发达国家,硬件成本远不及开发时间。
我认为您应该认真考虑这个选项,并且如果可能的话,请选择该选项,并使用Java而不是C ++,因为用Java开发某些东西比使用C ++并在以后进行维护要容易得多。
问题不在于使用C ++,因为它是Java,而不是使用Java,因为它是C ++。就像Java免费存储一样,通常实现C ++容器来避免过多的碎片。
但是,如果您直接分配内存,那么您也可以执行Java不允许您执行的操作,这可能会导致碎片化。
正确的解决方案(在C ++中)是通过分配器类使用容器和智能指针,该分配器类通过固定的“ plex”来管理分配(此处的关键是编写一个好的分配器类)。这是一种与Java无关的编程风格,因此任何比较都是没有意义的。
[编辑]这可能是过时的示例: 固定分配
垃圾收集的优点是它模拟了具有无限内存量的计算机。这种抽象的机制或实现旨在使您作为程序员完全透明。我们都知道,该机制正在回收程序不再使用的内存,但是实际上并不能保证。如果您在具有比程序实际使用的内存更多的RAM的计算机上运行该程序,则可能永远不会进行垃圾回收。同样,这无关紧要,因为您可以只编写程序而不必考虑程序如何使用内存。每当程序请求内存管理器时,它只会分配更多的RAM,并且您可以假定此类分配将始终成功。Java是一种垃圾收集语言,而C ++不是。1个
垃圾收集的缺点是,像所有抽象一样,垃圾收集容易泄漏。它并非始终都能始终正常运行,特别是在某些情况下,并且您很可能会遇到错误。编写垃圾收集算法(对于程序员来说应该透明的一种)的人员针对最常见的情况进行了优化,而常见情况的麻烦在于它们从来都不是那么普遍。通常,在管理内存方面,您做得比垃圾收集器还好。但是在特定情况下(并且有足够的时间,精力和理解力),这是可能的。C ++给您这种灵活性。Java没有。
综上所述,我认为选择语言的标准建议适用于此,在这种情况下,考虑到限制因素,甚至可能更适用。选择该项目的主要开发人员最熟悉的语言。除了显而易见的原因(例如您将能够更快,更高效地开发应用程序)之外,这尤其重要在您描述的情况下非常重要,因为像在编程Java一样对C ++进行编程将导致极其无效的内存管理实践,从而导致泄漏和崩溃。类似地,用Java编程就像用C ++编程一样,并不能为您带来很多好处,并且可能会针对最常见的情况对垃圾收集算法进行调整和优化,从而最终生成的程序未达到优化要求。 。
习惯于使用垃圾收集语言的程序员会学会信任垃圾收集器,而不是与之抗争。如果您使用的是垃圾回收语言,则这些是您要在项目中使用的程序员。不是的程序员习惯于使用垃圾收集语言工作的人本质上对这种“无限内存”抽象表示怀疑,并且经常有很多充分的理由。尽管这些程序员可能很好,但是这些并不是您想要使用垃圾收集语言编写的,因为他们将在每一步与GC进行斗争,不断地猜测它,并且通常会产生速度较慢,内存效率较低的情况代码而不是其他类型的程序员。充其量,他们只会花大量时间重新设计轮子,从而花费大量金钱,甚至需要更多的长期维护成本。
然后,您还需要问自己是否真的很重要。薄熙来的冷嘲热讽评论不仅仅具有真实性:现在的记忆是如此廉价,几乎不值得费力。即使您需要大量资金,这些金额现在也不像10年前那样庞大。程序员和应用程序开发的成本远不止是购买RAM和处理能力。这并不意味着您应该尽可能避免经济,而是意味着您也不应浪费太多时间。
1当然,这种假设凸显了该问题中的更深层次的缺陷。事实证明,“ Java或C ++”有点让人讨厌。标准的Java实现提供了垃圾回收,而C ++并非按照语言标准进行,但是绝对没有理由不能将第三方垃圾回收器用于C ++。许多公司靠卖这些东西为生,有些可能靠免费赠送这些东西为生。