jvm 空闲堆与总堆的最佳比率是多少?

7rtdyuoh  于 2022-11-23  发布在  其他
关注(0)|答案(3)|浏览(111)

最佳的freeheap与totalheap的比率是多少?在这个比率的多少值时,我应该考虑增加堆大小/减少堆大小?

pvcm50d1

pvcm50d11#

理想的瞬时比率是1。理想情况下,JVM将消耗它所需要的内存,不多也不少。这是一个很难达到的目标;)
问题(正如TNilsson指出的)在于,应用程序的内存需求会随着时间的推移而变化,因此您希望它有足够的空间,不会导致超出您所能容忍的频率的持续收集/压缩,并且您希望它消耗足够少的空间,而不必购买更多的RAM。

6qfn3psc

6qfn3psc2#

没有简单的答案,让我给予两个例子:

示例1-您的程序在启动时分配了100 M的内存,然后在其运行的其余时间不分配任何内存。

在本例中,您显然希望堆大小为100 M(好吧,也许是101或更大,但您明白了...)以避免浪费空间。

示例2-您的程序每秒分配10 M的内存。所有数据的保留时间都不超过1秒。(例如,您正在进行需要大量临时数据的计算,并且在完成时将返回一个整数...)

知道确切的数字也许不太现实,但这是一个例子。
因为你有10 M的“活”数据,你至少要有10 M的堆。除此之外,你需要检查你的垃圾收集器是如何工作的。简化后,GC完成所需的时间是O(活集),即,“死”数据的量并不真正进入其中。对于恒定的活集大小,无论堆大小如何,GC时间都是恒定的。2这会导致更大的堆-〉更好的吞吐量。
(Now,要真正把事情搞砸,你可以添加像堆压缩这样的东西,图像就变得更不清晰了...)

结论这是问题的简化版本,但简短的回答是--视情况而定。

kqhtkvqz

kqhtkvqz3#

这可能取决于分配新对象的速率。垃圾收集涉及大量跟踪活动对象的引用的工作。我刚刚处理了一个情况,其中有大量的空闲内存(比如500 MB已用,500 MB空闲),但发生了如此多的数组分配,JVM将花费95%的时间来执行GC。因此,不要忘记运行时内存行为。
所有那些性能调优文章都说“Java中的对象分配真的很快”,但却没有提到某些分配会导致1秒的GC时间,这让我发笑。

相关问题