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

本文关键字:net java 环境 | 更新日期: 2023-09-27 17:47:49

您个人在Java或.NET等托管环境中使用过的最大堆是什么?您遇到的一些性能问题是什么?堆越大,您最终获得的回报是否会递减?

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

我在一个64位.Net系统上工作,该系统通常使用9-12GB,有时甚至高达20GB。即使在垃圾收集过程中,我也没有看到任何性能问题,我一直在努力寻找,因为我没想到它会这么好地工作。

早期版本挂在某些对象上的时间太长,导致偶尔出现GC,从而释放3GB+。即使在那时,也没有对性能产生明显的影响。该系统运行在具有32GB RAM的16核服务器上,这可能有助于。。。

在.Net中,在Windows 32位上,在事情开始变得非常糟糕(内存不足的例外情况)之前,您只能真正使用大约1.4GB的内存。这是由于32位窗口中的限制,该限制将单个进程限制为使用超过2GB的RAM。你可以在boot.ini中放入/3GB开关,但这只会让你走得更远。如果你想使用大量内存,你应该认真考虑在64位版本的windows上运行。

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

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

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

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

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

我仍然需要优化,所以我最终准备了文件并切成更小的peice,只处理用户当时需要的peice。

我在java中使用了2GB到5GB的内存,但通常当我使用超过2GB时,我真的开始考虑内存优化。不断减少的回报可能会有所不同,从因为您有大量内存而在必要时不进行优化,到没有可用于OS/Disk缓存的内存(这可以帮助您的应用程序整体)。

对于Java,我建议您关注一段时间内每一代的内存使用情况。你是创建了很多临时对象,还是有消耗大量内存的持久对象?当知道这些事情时,可以对内存进行大量优化。