这适用于所有Java堆/ GC专家。 简单而直接的问题:是否可以将Java堆大小设置为最大数字?
我正在研究的一个服务器是托管内存实时通信系统,使用服务器的客户端要求我将内存量增加到192Gb(这不是一个错字:192 GigaBytes! )。从技术上讲,这是可能的,因为机器是虚拟的。
除了上面的一个,我的其他问题是:
提前感谢愿意提供帮助的任何人。
问候。
答案 0 :(得分:1)
1)让他们考虑让虚拟机将代码内容与内存交换到磁盘的含义。有时它让VM做到这一点同样好,没有额外的工作。有时,当他们对数据特征有所了解并且他们的优化是以这种方式为目标时,它会快得多。
2)考虑可能使用多个JVM,这些JVM要么以某种方式与操作范围并行地协作或运行。有时甚至在同一个VM上运行4个运行相同应用程序的JVM,每个JVM使用1/4内存可能会更好。 (取决于您的应用程序的特征。)
3)考虑像TerraCotta的Big Memory这样的内存管理框架。这个领域有竞争对手。例如,VMWare具有弹性内存。他们使用JVM堆外部的内存来存储内容并避免GC问题。或者他们分配非常大的堆对象并独立于Java进行管理。
4)如果内存被活动对象占用并且它们最终移动到旧代以进行垃圾收集,则JVM可以正常运行(TM)。 GC可能是个问题。这是一种黑色艺术。在尝试优化GC之前,务必杀死鸡并将羽毛散布在虚拟机上。 :)哦......这里有一些非常有趣的评论:Java very large heap sizes5)有时你设置JVM大小和其他超出你控制范围的因素将使它不会那么大。一定要做一些测试,以确保它真的能够增长到你设定的大小。
数字5是真正的关键项目。测试。测试。并测试一些。你处于探索领域的边缘。
答案 1 :(得分:1)
JVM spec for java 7并不表示存在硬限制。
我建议你的操作系统和可用的内存数量很高。 但是,您必须知道JVM需要足够的内存用于其他内部结构(如规范所述),例如PermGen,常量池等。我还建议您在任意增加堆大小之前考虑分析。你的老一代空间可能会占用记忆力。我使用VisualGC(现在在VisualVM中)来观察内存使用情况,使用YourKit来查找泄漏(它的代际功能是真正的帮助)。
我没有回答你的其他问题,但可能不会比你的其他受访者说得多。