托管环境中使用的最大堆? (.NET / JAVA)

您在托管环境(如Java或.NET)中个人使用的最大堆是多少? 你遇到的一些性能问题是什么,你最终得到的回报越少,堆越大?

我使用的是64位.Net系统,通常使用9-12 GB,有时甚至高达20 GB。 即使在收集垃圾的时候我也没有看到任何性能问题,而且我一直在努力寻找,因为我没想到它能够如此好地工作。

早期的版本挂在某些对象上的时间太长,导致偶尔的GC释放出3GB +。 即便如此,对绩效没有明显影响。 该系统运行在具有32GB RAM的16核服务器上,这可能有助于……

在.Net中,在Windows 32位上,在开始变得非常棘手(内存exception)之前,你只能真正获得大约1.4 GB的内存使用量。 这是由于32位窗口的限制导致单个进程限制使用超过2 GB的RAM。 您可以在boot.ini中添加/ 3GB开关,但这只会让您更进一步。 如果你想使用大量内存,你应该认真考虑在64位版本的Windows上运行。

我目前有一个6 GB内存的生产应用程序。 您还需要一个64位的盒子,以便JVM能够解决这么多问题。 垃圾收集器实际上是唯一(我发现到目前为止)性能随着大小而降级的东西,然后只有当你手动启动System.GC时,它会强制JVM在遍历时将所有内容都戛然而止价值6 GB的物品。 也需要20秒。 默认的GC行为不会这样做,顺便说一下,你必须足够愚蠢才能做到这一点。 还值得研究这种大小的JVM调优。

你也可以找到像分布式和集群JVM这样的东西,对不起,没有任何好的参考,因为我没有仔细研究这个选项,尽管我确实找到了对更大的安装的引用。

我不确定你的意思是堆,但如果你的意思是使用内存,我已经使用了很多,2GB +。 我有一个Web应用程序进行图像处理,它需要将2个大型扫描文件加载到内存中进行分析。

存在性能问题。 Windows会换掉大量的ram,然后会产生很多页面错误。 由于所有请求都获得了这些图像(我一次只允许每个图像设置1个会话),因此一次不需要超过2个图像

例如,设置初始查看文件大约需要5秒钟。 在内存中进行简单的分析和缩放将相当快,大约为.1到.5秒。

我仍然需要优化,所以我最终预先准备好文件并切成较小的peices并且只使用当时用户所需的peices。

我在java中使用了2GB到5GB的内存,但是当我达到2GB以上时,我真的开始考虑内存优化。 收益递减可能有所不同,因为您需要大量内存,而不是没有可用于OS /磁盘缓存的内存(这可以帮助您整个应用程序)。

对于Java,我建议观察每代的内存使用情况。 您是否创建了大量临时对象或具有耗费大量内存的持久对象? 在了解这些事情后,可以进行大量的内存优化。