有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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

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

现在我的问题是——我不明白他为什么说,由于Java中的大堆问题和垃圾收集暂停,Java不适合我们需要确保读/写性能一流的用例

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

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


共 (1) 个答案

  1. # 1 楼答案

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

    • 使用像Zing这样的并发收集器。它们可以得到1-4毫秒最坏情况抖动,这比其他C++程序更好,因为来自其他源的抖动(即GC不是抖动的唯一原因)
    • 创建更少的垃圾并使用堆外内存。在C++中,所有的东西都是有效的,而且,在C++中你可以做的任何事情都可以在java中完成,即使它不是很自然。李>

    下面是一个真实的高频交易系统的例子。在不交易的情况下,它每天早上5:00进行一次完整的GC,Eden的大小为8GB,比一天产生的垃圾量还要大

    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堆,也不会触发任何GCs

    如果您担心在需要的时候可能无法编译代码,您可以通过练习提前触发代码进行编译。进行一两次单元测试,练习关键代码,直到编译完成。这通常可以在不到一秒钟内完成

    简而言之,如果地面军事系统是一个问题,总会有解决方案。您可以使用Java开发解决方案,在机箱外部延迟19微秒,不会触发任何GCs(即使是较小的GCs)

    why he was suggesting let's go with C++ servers and as the language as well.

    大多数开发人员不知道如何编写低延迟Java。在C++中,有更多的开发人员这样做,这可以是单独使用C++的理由。然而,这并不是语言的一个特性,它阻止了低延迟,只是缺乏Java领域的技能