java如何解决大堆问题和垃圾收集暂停
我在一家公司工作,他们非常关心性能读写。我们公司和Geronimo服务器大多使用Java作为语言
几天前,我们的团队和我们的架构师就如何提高性能进行了讨论。在那次会议上,我们的架构师提到,我们需要做一些事情来解决“Java中的大堆问题”和Java垃圾收集暂停
他完全反对Java GC暂停和Java中的大堆问题。但坦率地说,我无法理解为什么Java/JVM中的这两件事或其他任何事情会导致如此糟糕的性能。我们的设计师主要支持C++服务器和C++语言。p>
现在我的问题是——我不明白他为什么说,由于Java中的大堆问题和垃圾收集暂停,Java不适合我们需要确保读/写性能一流的用例
<> P> C++,在与C++相比,他在大堆问题和垃圾收集停顿时为什么会反对java,他为什么建议我们和C++服务器一起,也作为语言。我看到了其他各种各样的stackoverflow帖子,以理解他为什么反对它,但不知何故,由于我缺乏深刻的理解,我无法理解这些解决方案。所以,任何一步一步的详细解释都会让我更清楚任何帮助都将不胜感激。谢谢
# 1 楼答案
在Java中,有两种方法可以处理来自垃圾的暂停
下面是一个真实的高频交易系统的例子。在不交易的情况下,它每天早上5:00进行一次完整的GC,Eden的大小为8GB,比一天产生的垃圾量还要大
http://vanillajava.blogspot.co.uk/2011/06/how-to-avoid-garbage-collection.html
从OpenHFT/Java-Lang项目中,你可以这样做
在这个例子中,我创建并初始化了10亿条记录。这几乎不使用JVM堆,也不会触发任何GCs
如果您担心在需要的时候可能无法编译代码,您可以通过练习提前触发代码进行编译。进行一两次单元测试,练习关键代码,直到编译完成。这通常可以在不到一秒钟内完成
简而言之,如果地面军事系统是一个问题,总会有解决方案。您可以使用Java开发解决方案,在机箱外部延迟19微秒,不会触发任何GCs(即使是较小的GCs)
大多数开发人员不知道如何编写低延迟Java。在C++中,有更多的开发人员这样做,这可以是单独使用C++的理由。然而,这并不是语言的一个特性,它阻止了低延迟,只是缺乏Java领域的技能