有一个内存分配的问题,我希望你的帮助。 我们已经分析了一些顶级的服务,我们注意到它们的RES值约为1.8GB,据我了解,这意味着他们当时只能保持1.8GB的内存。 如果我们刚刚开始它们(它们实质上是从caching中读取数据,处理数据并推送到另一个caching),但是看到我们在cpu密集型处理完成后仍然看到这一点,我们就会好奇它意味着有些事情没有像我们预料的那样开始。
我们使用以下参数运行程序: -xms256m -Xmx3096m据我所知,这意味着初始堆大小为256,最大堆大小为3096。
现在我期望看到的是,最初需要堆增长,然后随着内存被释放(尽pipe这可能是我的第一个错误)需要时缩小。 我们用jvisualvm实际看到的是以下内容:
3分钟:使用的堆是1GB,堆大小是2GB
5分钟:我们已经完成了处理,所以使用的堆急剧下降到接近足够的堆,然而堆大小却只下降到大约1.5GB
7分钟 – >:周期性实时处理的小比特,只用了100-200MB左右的堆,然而堆大小却保持在1.7GB左右。
我的问题是,为什么我的堆还没有缩小呢? 这不是盗取其他进程的有价值的内存linux的盒子,如果是的话,我怎么能解决它? 我们确实有时会看到内存不足的错误,而这些进程被分配了最“意想不到”的内存大小,我认为最好从它们开始。
分段错误:在buff> 4M时,在Ubuntu的C程序中堆栈分配
是否有与堆内存分配相关的内存开销(例如堆中的标记)?
Vista堆怎么回事?
WinDbg中的“Break指令exception”是什么?
一个空的堆竞技场的开销
干杯,戴夫。
(〜请原谅可能对JVM内存调整缺乏了解!)
如何在linux中find堆的大小?
windows汇编堆栈和堆栈?
什么是tomcat内存堆提交?
C中的堆大小限制
什么是在windows Server 2003上使用这么多未提交的“私人数据”?
您可能希望看到有关调整堆扩展和缩小的答案 。 默认情况下,JVM不太积极地缩小堆。 此外,如果堆有足够的可用空间很长一段时间,它不会触发GC,我相信是唯一的时间被认为是缩小它。
理想情况下,您可以将最大值配置为在满负载下为您的应用程序提供足够的空间的值,但是如果 *** 作系统始终处于使用状态,则可以接受 *** 作系统的性能。 把可预测性和可能更好的性能的最小值设置为最大值并不罕见(我没有任何可供参考的东西)。
我没有一个完整的答案,但之前也有过类似的问题 。 从前面的讨论中,您应该研究-XX:MaxHeapFreeRatio=作为您的调整参数,以强制堆释放回 *** 作系统。 这里有文档 ,我相信默认值允许大量的未使用的堆保持由JVM拥有。
那么,GC并不总是在你想的时候运行,它并不总是收集什么是合格的。 如果它几乎用完了堆空间,那么也许只能从旧的gen空间收集对象(因为从旧gen收集通常会涉及GC试图避免直到它真的需要做的停止世界的收集它)。
也许你可以尝试使用TPTP,visualvm或JProbe(商业版,但试用版)进行分析,以确定发生了什么。
另外要注意的是文件处理程序; 我没有具体的细节,但是我的一个同事在几年前遇到了一个打开许多文件的进程导致的堆饱和问题,发现每次打开一个4KB缓冲区被分配到本地堆,在处理结束时释放。 我希望这个相当模糊的迹象可以帮助…
总结
以上是内存溢出为你收集整理的与使用的%相比,堆大小意外地大全部内容,希望文章能够帮你解决与使用的%相比,堆大小意外地大所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
请登录后查看评论内容