我正在探索在具有大量RAM(300GB到15TB,可能在SGI Altix 4700机器上)的机器上运行Java应用程序的可能性,我很好奇Java的GC是如何可能会在这种情况下执行。
我听说IBM或JRockit的JVM可能比Sun更适合这种情况。有没有人知道在这种情况下有关JVM性能的任何研究或数据?
答案 0 :(得分:7)
在Sun JVM上,您可以使用选项-XX:UseConcMarkSweepGC打开并发标记和扫描收集器,这将几乎完全避免默认GC算法的“停止世界”阶段,代价是多一点开销。
建议在这样的机器上使用超过VM的是IMHO过时。 在实际应用程序中,您通常拥有足够的共享数据,因此CMS和一个JVM的性能更好。
答案 1 :(得分:4)
问题是:您是否希望在单个进程(JVM)中运行?如果你这样做,那么你就会遇到问题。请参阅Tuning Java Virtual Machines,Oracle Coherence User Guide和类似文档。我经营的经验法则是尽量避免大于1GB的堆积。而512MB-1GB的完整GC可能需要不到一秒的时间。 2-4GB的完整GC可能需要5秒或更长时间。 Obvioiusly这取决于许多因素,但故事的道德是GC开销不能线性扩展,一旦你进入一秒范围的性能,然后迅速降级。
答案 2 :(得分:3)
Sun的JVM允许您配置和优化垃圾收集,但它本身就是一门科学: http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html
您可能需要进行一些阅读和研究,但对于那种机器,针对机器和应用程序优化的GC设置可能会产生很大的不同。
答案 3 :(得分:3)
自5.0以来,Hotspot JVM使用一种称为人机工程学的概念来尝试优化内存使用。这不仅仅基于可用的内存量和影响堆大小,生成大小和垃圾收集算法。
首先阅读本文,其中解释了人机工程学等等:
http://java.sun.com/j2se/reference/whitepapers/memorymanagement_whitepaper.pdf
还有一个名叫Brian Goetz的人写了很多关于Java如何分配和使用内存的文章,所有这些都可以在这里找到:
答案 4 :(得分:2)
这根本不能回答你的问题,但如果你计划部署一个巨大的Java应用程序,你可能会有兴趣研究Azul Systems appliances。他们说能够进行垃圾收集而不会在应用程序中创建一个670 GB堆的暂停。
答案 5 :(得分:1)
您可能需要考虑在此计算机上运行虚拟Terracotta群集。
答案 6 :(得分:0)
答案 7 :(得分:0)
唯一可以真正告诉你的人是SGI。超级计算机的行为不像常规服务器那么大。
但是,我发现当内存是访问它的处理器本地时,Java表现最佳。注意:GC需要能够端到端地遍历整个内存。这意味着如果你的设计就像许多计算机粘在一起,它可能就是这种情况,它就不能很好地扩展。内存模块大小为32 GB,因此如果将JVM限制为适合此大小,则可能会获得更好的性能。
答案 8 :(得分:0)
此帖的接受答案相当陈旧,现已过时。截至2014年9月,如果您使用的是Java 7,则应该切换到GC1收集器。从Java 7 update 4发行说明:
http://www.oracle.com/technetwork/java/javase/7u4-relnotes-1575007.html
" G1收集器的目标应用是充分利用当今多处理器服务器中可用的大量内存,同时仍然可以控制垃圾收集延迟。需要大堆,具有大的活动数据集,具有突发或非均匀工作负载或遭受长垃圾收集引起的延迟的应用程序应该从切换到G1中受益。"
答案 9 :(得分:-8)
关于GC如何表现的答案肯定是“谁在乎?” ; - )