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

Java 如何解决大堆问题和垃圾收集暂停,java,c++,performance,garbage-collection,heap,Java,C++,Performance,Garbage Collection,Heap,我在一家公司工作,他们非常关心性能,读/写都很关心。我们公司和Geronimo服务器大多使用Java作为语言 几天前,我们的团队和架构师讨论了如何改进性能。在那次会议上,我们的架构师提到我们需要做一些事情来解决“Java中的大堆问题”和Java垃圾收集暂停 他完全反对Java GC暂停和Java中的大堆问题。但坦率地说,我无法理解为什么Java/JVM中的这两件事或其他任何事情会导致如此糟糕的性能。我们的设计师主要支持C++服务器和C++语言。 现在我的问题是——我不理解他为什么说,由于Java

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

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

他完全反对Java GC暂停和Java中的大堆问题。但坦率地说,我无法理解为什么Java/JVM中的这两件事或其他任何事情会导致如此糟糕的性能。我们的设计师主要支持C++服务器和C++语言。 现在我的问题是——我不理解他为什么说,由于Java中的大堆问题和垃圾收集暂停,Java不适合我们需要确保读/写性能一流的用例

<> P> C++,在与C++相比,他在大堆问题和垃圾收集停顿时为什么会反对java,他为什么建议我们和C++服务器一起,也作为语言。我看了很多其他的stackoverflow帖子来理解他为什么反对,但不知何故,由于我缺乏深刻的理解,我无法理解这些解决方案。所以,任何一步一步的详细解释都会让我更清楚


在此方面如有任何帮助,将不胜感激。感谢

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

< > C语言和C++语言不附带垃圾回收。动态内存分配由平台(操作系统或编译器库)提供。垃圾收集由程序员决定。这为程序员提供了灵活性

Java提供了动态内存分配和垃圾回收。语言提供的垃圾收集带来的一个问题是“垃圾收集何时运行?”例如,当程序执行垃圾收集时,程序是否会在某一点挂起?还是将垃圾收集作为后台任务执行

您将需要研究动态内存分配和垃圾收集来获得背景。接下来,请架构师澄清或解释其推理


另一个问题是Java被编译成一种称为Java字节码的中间语言。Java字节码需要由Java虚拟机(而不是本机处理器)执行。用C和C++,代码编译成本地处理器指令;不需要口译。C或C++可执行文件与平台环境绑定,必须重新构建以便在另一平台上运行。Java更独立于平台,可以在任何具有Java虚拟机(JVM)的平台上运行

在Java中,有两种方法可以处理来自垃圾的暂停

  • 使用像Zing这样的并发收集器。它们可以得到1-4毫秒最坏情况抖动,这比其他C++程序更好,因为来自其他源的抖动(即GC不是抖动的唯一原因)
  • 创建更少的垃圾并使用堆外内存。在C++中,所有的东西都是有效的,而且,在C++中你可以做的任何事情都可以在java中完成,即使它不是自然的。
这是一个真实的高频交易系统的例子。在不交易的情况下,它每天早上5:00进行一次完整的GC,Eden大小为8GB,比一天产生的垃圾量还要大

从项目中你可以做到这一点

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.

final DirectStore store=DirectStore.allocate(128L)“他为什么反对大堆问题和垃圾收集暂停”-谁会支持这些东西?@Oli,这就是我想理解的。你可以在我的问题中看到我的意图,我在寻找什么。只要详细了解这一点,什么会导致性能差。这个链接可能会帮助你,Java现在有一个实时垃圾收集器,它可以减少暂停,而牺牲更多的CPU使用。@brianbeuning,Th感谢链接。一个简短的问题,如果听起来太糟糕,请道歉。为什么暂停会导致性能下降?任何想法都会有很大帮助。谢谢。@user21973:您是否在问“为什么暂停整个程序会导致我的程序运行变慢?”?请考虑一下……我认为最后一段需要澄清;Java是编译的,它恰好是针对JVM进行编译的。JIT通常也会将大块代码转换为本机指令。重写。问题不在于解释本身,而在于JVM位于本机处理器执行器之上我认为Java可以编译成机器码而不是字节码。它仍然有JVM,但更像是C运行时环境。@brianbeuning理论上是的,我认为有一些工作实现可以做到这一点,但主流实现会进行JIT编译,而且速度通常更快。JIT compiler也输出性能类似的机器代码(假设C编译器和JVM JIT编译器做得同样好,这不是给定的),并且还使用JVM服务,就像运行时库一样。它几乎肯定使用“堆”,就像“堆”C或C++运行库的,或者它从OS中获取一系列页面。它在内存中不受任何GC(java或其他)的支配。@德尔南公平点,我从一个真正的低延迟交易系统中添加了一个例子。