我们需要为普通服务器应用程序分配的堆大小是多少?对于Facebook,Twitter等大型应用程序应该是什么?
或者有没有办法可以动态增加应用程序的堆大小,以便我们不必担心堆分配?
答案 0 :(得分:3)
Java堆大小是一个安全功能:它就在那里,所以Java程序不能通过分配无穷无尽的内存来简单地接管机器。
这就是为什么几乎没有Java VM根据需要增加堆"选项。
因此,几乎不可能事先告诉Java应用程序或服务器需要多少内存。您必须使用真实的生产数据运行它才能找到答案。有一些工具可以帮助你,但通常,你只是等待OutOfMemoryError
,确保它不是由于一个错误,然后增加堆(专业人士认为它不是一个但是并简单地增加堆,然后修复错误,然后保持堆大小原样:-))。
PS:在这个网站上有一个问题" How can I give Java code more than 144 GB of RAM?"
答案 1 :(得分:2)
这是一个太普遍的问题,它取决于创建的对象数量,它们的寿命和它们的大小。
例如:
如果您正在处理大数据结构,请说您将图像加载到内存中 - 您需要更大的堆。但是你需要考虑 - 这些图像是长寿的,还是它们被加载,操纵和死亡。如果他们快速死亡,你可能不得不改变老一代与年轻一代之间的比例(假设老一代只包含"常规"对象)
你需要确保年轻一代的大小足够大,一方面不让任何一个对象变成老一代,但不要太大,这将导致计算活动对象的计算时间更长< / p>
您可以调整幸存者空间的比例。如果几乎没有任何东西进入幸存者空间那么它应该相对较小。
有各种各样的事情要考虑,并且没有任何一种尺寸适合所有解决方案。
在这里,我喜欢的讲座可以让您了解GC调整的全部概念:Tuning the JVM
在您看到视频并获得一般性想法之后,我会推荐一篇我最近阅读的好文章,以深入了解GC和JVM调优:Java SE 6 HotSpot[tm] Virtual Machine Garbage Collection Tuning