最佳总机会比率是多少?我应该考虑增加堆大小/减小堆大小?
答案 0 :(得分:2)
理想的瞬时比率为1.理想情况下,您的JVM将完全消耗所需的内存,不多也不少。这是一个非常难以达到的目标;)
问题(正如TNilsson指出的那样)是你的应用程序的内存需求随着时间的推移而变化,所以你希望它有足够的空间不会导致比你能容忍的更频繁的收集/压缩,而你想要的它消耗的空间足够小,你不必购买更多的RAM。
答案 1 :(得分:1)
这可能取决于您分配新对象的速率。垃圾收集涉及大量工作来跟踪活动对象的引用。我刚刚处理的是一个存在大量可用内存的情况(比如使用500 MB,500 MB可用),但是发生了如此多的阵列分配,JVM将花费95%的时间来完成GC。所以不要忘记运行时内存行为。
所有这些性能调优文章都说“对象分配在Java中非常快”而没有提到一些分配导致1秒的GC时间让我大笑。
答案 2 :(得分:1)
没有一个简单的答案,让我举两个例子:
示例1 - 您的程序在启动时分配了100M的内存,然后在其余的运行中没有分配任何内存。
在这种情况下,你显然希望堆大小为100M(好吧,也许是101或者其他什么,但你明白了......)以避免浪费空间。
示例2 - 您的程序每秒分配10M内存。没有数据持续时间超过1秒。 (例如,您正在进行需要大量临时数据的计算,并在完成后返回单个整数...)
知道确切的数字可能不太现实,但这只是一个例子,对我来说是如此...... 由于您有10M的“实时”数据,因此您必须拥有至少10M的堆。除此之外,您需要检查垃圾收集器的工作原理。简化后,GC完成的时间是O(实时设置),也就是说,“死”数据的数量并没有真正进入它。使用恒定的实时设置大小,无论堆大小如何,GC时间都是恒定的。这导致更大的堆 - >更好的吞吐量。
(现在,要真正搞砸了你添加像压缩堆这样的东西,图像变得更加清晰......)
<强>结论强> 这是问题的简化版本,但简短的回答是 - 这取决于。