如何解决大堆问题和垃圾收集暂停

时间:2013-07-14 20:26:14

标签: java c++ performance garbage-collection heap

我在一家公司工作,他们非常关心性能读/写。我们主要使用Java作为我们公司和Geronimo服务器的语言。

几天前,我们的团队与建筑师之间就我们如何改善绩效进行了讨论。在那次会议中,我们的架构师提到我们需要做一些事情来解决“Java中的大堆问题”和Java垃圾收集暂停。

他完全反对Java GC暂停和Java中的大堆问题。但坦率地说,我无法理解为什么Java / JVM中的这两件事或其他任何东西会导致如此糟糕的性能。我们的架构师主要支持C ++服务器和C ++语言。

现在我的问题是 - 我无法理解为什么他说因为Java和垃圾收集暂停中的大堆问题,Java不适合我们需要确保读取/性能的用例写作是一流的。

任何人都可以让我详细了解为什么他在大堆问题和垃圾收集暂停时反对Java与C ++相比,以及为什么他建议让我们使用C ++服务器以及语言。我看到了其他各种stackoverflow帖子,以了解他为什么反对它但不知何故由于我缺乏深刻的理解,我无法理解这些解决方案。因此,任何一步一步的详细解释都会让我更加清楚。

任何帮助将不胜感激。感谢

2 个答案:

答案 0 :(得分:1)

动态内存分配和垃圾回收,无论语言如何,都会降低性能。使用静态或有限的分配,不需要动态内存分配或垃圾回收。

C和C ++语言没有垃圾收集。动态内存分配由平台(OS或编译器库)提供。垃圾收集由程序员决定。这为程序员提供了灵活性。

Java带有动态内存分配和垃圾收集。提出垃圾收集的语言提出的一个问题是“什么时候垃圾收集运行?”例如,当程序执行垃圾收集时,程序是否会暂停?或者垃圾收集是作为后台任务执行的?

您需要研究动态内存分配和垃圾收集才能获得背景信息。接下来,请建筑师澄清或解释他或她的推理。

另一个问题是Java被编译成中间语言调用Java字节代码。 Java字节代码需要由Java虚拟机(而不是本机处理器)执行。使用C和C ++,代码被编译为本机处理器指令;无需翻译。 C或C ++可执行文件与平台环境相关联,必须重建才能在另一个平台上运行。 Java更独立于平台,可在任何具有Java虚拟机(JVM)的平台上运行。

答案 1 :(得分:1)

有两种方法可以处理Java中的垃圾暂停。

  • 使用像Zing这样的并发收集器。它们可以获得1-4 ms的最坏情况抖动,这比一些C ++程序更好,因为来自其他来源的抖动(即GC不是抖动的唯一原因)
  • 创建更少的垃圾并使用堆内存。在C ++中,所有东西都有效地脱离堆,实际上,你可以用C ++做的任何东西都可以用Java做,即使它不那么自然。

以下是来自真实高频交易系统的示例。它在每天早上5点进行了一次完整的GC,当时没有交易,伊甸园的大小为8 GB,大于一天产生的垃圾量。

http://vanillajava.blogspot.co.uk/2011/06/how-to-avoid-garbage-collection.html

OpenHFT/Java-Lang项目中,您可以执行此操作。

final DirectStore store = DirectStore.allocate(128L << 32); // give me 128 GB
final DirectBytes slice = store.createSlice();

// every record has say 128 bytes and a lock at the start so they can be locked individually
for(long l = 0; l < store.size(); l += 128) {
    slice.positionAndSize(l, 128);
    slice.busyLock(0L);
    // change something
    slive.writeLong(4L, l);
    slice.unlock(0L);
}

// when finished with the store
store.free(); // still no GCs.

所以在这个例子中,我创建并初始化了10亿条记录。这几乎不使用JVM堆,也不会触发任何GC。

如果您担心在需要时可能无法编译代码,则可以通过执行代码来提前编译代码。进行一个或两个单元测试并运行关键代码,直到它编译完成。这通常可以在不到一秒的时间内完成。

简而言之,如果GC是一个问题,那么总会有解决方案。您可以使用Java开发解决方案,盒子外部的延迟为19微秒,不会触发任何GC(即使是次要的)

  

为什么他建议让我们使用C ++服务器,也作为语言。

大多数开发人员不知道如何编写低延迟Java。在C ++中,有更多的开发人员这样做,这可能是单独使用C ++的原因。但是,这种语言的特性并不能阻止低延迟,只是缺乏Java空间技能。