Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有大量RAM的Java性能_Java_Garbage Collection - Fatal编程技术网

具有大量RAM的Java性能

具有大量RAM的Java性能,java,garbage-collection,Java,Garbage Collection,我正在探索在具有大量RAM的机器上运行Java应用程序的可能性(从300GB到15TB,可能在SGI Altix 4700机器上),我很好奇Java的GC在这种情况下可能会如何执行 我听说IBM或JRockit的JVM可能比Sun更适合这种情况。在这种情况下,有人知道关于JVM性能的任何研究或数据吗?关于GC将如何执行的答案肯定是“谁在乎?”;-) 问题是:是否希望在单个进程(JVM)中运行?如果你这样做了,那你就有麻烦了。请参阅和类似的文档。我使用的经验法则是尽量避免大于1GB的堆。而512M

我正在探索在具有大量RAM的机器上运行Java应用程序的可能性(从300GB到15TB,可能在SGI Altix 4700机器上),我很好奇Java的GC在这种情况下可能会如何执行


我听说IBM或JRockit的JVM可能比Sun更适合这种情况。在这种情况下,有人知道关于JVM性能的任何研究或数据吗?

关于GC将如何执行的答案肯定是“谁在乎?”;-)

问题是:是否希望在单个进程(JVM)中运行?如果你这样做了,那你就有麻烦了。请参阅和类似的文档。我使用的经验法则是尽量避免大于1GB的堆。而512MB-1GB的完整GC可能需要不到一秒钟的时间。2-4GB的完整GC可能需要5秒或更长时间。显然,这取决于许多因素,但故事的寓意是GC开销不会线性扩展,一旦进入1秒范围,性能就会迅速下降。

这根本不能回答您的问题,但如果您计划部署一个大型Java应用程序,您可能会感兴趣。他们说,可以在应用程序中进行垃圾收集,而不需要在单个670 GB堆中创建暂停

Sun的JVM允许您配置和优化垃圾收集,但它本身就是一门科学:


您可能需要进行一些阅读和研究,但对于这种机器,针对机器和应用程序优化的GC设置可能会产生很大的不同。

自5.0以来,Hotspot JVM使用了一种称为人体工程学的概念来尝试优化内存使用。这不仅仅是基于可用内存的数量,还影响堆大小、生成大小和垃圾收集算法

首先阅读本手册,其中解释了人体工程学等内容:

还有一个叫Brian Goetz的人,他写了很多关于Java如何分配和使用内存的文章,所有这些以及更多内容都可以在这里找到:


在Sun JVM上,您可以使用选项-XX:useConMarkSweepGC来打开并发标记和扫描收集器,这将几乎完全避免默认GC算法的“停止世界”阶段,代价是增加一点开销

在这样的机器上,建议在VM上使用多个已过时。
在现实世界的应用程序中,您通常有足够的共享数据,因此CMS和一个JVM的性能更好。

唯一能真正告诉您的人是SGI。超级计算机不像普通的服务器,只是更大


然而,我发现,当内存位于访问它的处理器的本地时,Java的性能最好。注意:GC需要能够端到端地遍历整个内存。这意味着,如果你有一个像许多计算机粘在一起的设计,它的伸缩性就不好,这里可能就是这种情况。内存模块的大小是32 GB,所以如果你限制JVM能适应这个大小,你可能会得到更好的性能。

< P>你可能想考虑在这个机器上运行一个虚拟集群。

< P>这个帖子的可接受答案是相当旧的,现在已经过时了。截至2014年9月,如果您使用的是Java 7,您可能应该切换到GC1收集器。来自Java 7 update 4发行说明:


“G1收集器适用于充分利用当今多处理器服务器中大量可用内存,同时仍能控制垃圾收集延迟的应用程序。如果应用程序需要一个大的堆,有一个大的活动数据集,有突发的或不均匀的工作负载,或者有很长的垃圾收集引起的延迟,那么切换到G1应该会从中受益。“

Heh,例如,如果在执行完整GC时,导致机器在没有警告的情况下冻结数小时,这将是一个问题。显然,问题的作者关心这个问题。嗯。我想威尔只是幽默地说“GC甚至不太可能发生。”我运行的东西可能就是这样;没有关于提问者的线索。:)在家里我有15TB的内存(我玩游戏),简单的Hallo World工作正常。@Geeeek:你用15TB的内存玩什么样的游戏?可能是SimUniverse?Paul,我相信大多数GC都是在一个单独的线程中完成的,但是偶尔需要一个完整的GC,它会阻塞应用程序。Paul:对于Java5,GC在一个单独的线程中运行,但有时它必须移动“特殊”数据(比如堆栈)。在这种情况下,它将阻止VM。Java 6更好,但有时仍然会阻塞。使用多个JVM有很多合理的理由,而且只使用一个JVM将真正限制您保持正常运行时间的能力,但会循环更改和处理故障。一个区别是Azul是为Java设计的,它甚至没有C编译器!