我试图解决一直困扰我一段时间的问题。简而言之:应该在哪个基础上为资源占用应用程序分配最大堆空间,并且是否存在针对资源过大的缺点?
我有一个应用程序用于可视化巨大的医疗数据,如果几个成像体积并排打开,可能会占用几千兆字节的内存。缓存要查看的数据对于流畅的工作流程至关重要。该软件由Windows工作站支持,并以引导加载程序启动,引导加载程序分配堆大小并启动主应用程序。主应用程序所需的实际内存与正在查看的数据成正比,并且无法由引导加载程序确定,因为它需要读取数据,这最终会消耗太多时间。
因此,为确保JVM在启动期间有足够的内存,我们根据当前设计,在工作站的最大物理内存上设置xmx。但是,这有什么缺点吗?我已经读过(从2008年的帖子中)本机进程可能占用多余的堆空间,这可能导致运行时的内存错误。在分配堆空间之前,我是否还应该嗅探免费的虚拟内存或页面文件大小?你会如何处理这种情况?
哦,这是我在这些论坛上的第一篇文章。很高兴认识你们,温柔! :)
更新
感谢所有答案。我不确定我的说法是否正确,但我的问题来自这样一个事实,即我对该软件将运行的硬件一无所知,但是,尽管如此,却希望为软件分配尽可能多的堆空间
如果有足够数量的可用虚拟内存,我就会找到一个分配70%物理内存堆的解决方案 - 否则会更少。
答案 0 :(得分:0)
如果您有大型对象,则堆大小约为28 GB,对性能esp的影响很小。 (许多小对象会影响GC暂停时间)
堆大小为100 GB是可能的,但是有缺点,主要是因为它们可以具有高暂停时间。如果你使用Azul Zing,它可以更加优雅地处理更大的堆大小。
主要限制是你的记忆大小。如果你的堆超过了那个,你的应用程序和你的计算机将运行得非常慢/无法使用。
映射软件(例如必须能够映射整个世界)的这些问题的标准方法是将图像分解为图块。这样,您只显示屏幕上的图像(或屏幕上的部分)如果您需要能够放大和缩小,则可能需要以2到4级的比例存储数据。使用此方法,您可以在手机上查看整个世界的地图。
答案 1 :(得分:0)
最好不将JVM最大内存设置为大于工作站内存的60-70%,在某些情况下甚至更低,主要原因有两个。首先,由于GC机制,JVM在物理机上消耗的内容比堆大20%或更多。其次,JVM堆中特定数据实体的表示可能不是该机器RAM中该实体的唯一物理副本,因为操作系统具有高速缓存和缓冲区等,它们围绕各种IO设备从中获取这些对象。