【发布时间】:2011-07-22 18:49:04
【问题描述】:
有一个内存分配问题需要您的帮助。我们在顶部分析了我们的一些服务,我们注意到它们的 RES 值约为 1.8GB,据我了解,这意味着它们当时保留了 1.8GB 的内存。如果我们刚刚启动它们会很好(它们基本上是从缓存中读取,进行处理,然后推送到另一个缓存)但是在 CPU 密集型处理完成后我们仍然看到这个,我们想知道它是否意味着某些东西没有像我们预期的那样被 GC 处理。
我们使用以下参数运行程序:-Xms256m -Xmx3096m,据我了解,这意味着初始堆大小为 256,最大堆大小为 3096。
现在我期望看到的是堆最初会根据需要增长,然后在内存被释放时根据需要缩小(尽管这可能是我的第一个错误)。我们实际看到的 jvisualvm 如下:
- 3 分钟内:已用堆为 1GB,堆 大小为 2GB
- 5 分钟后:我们已经完成了处理,所以 使用的堆急剧下降到接近 足够的 zilch,但只有堆大小 降至约 1.5GB
- 7 分钟 ->:实时时间 定期处理,使用的堆 只有100-200MB左右, 堆大小但保持不变 大约 1.7GB。
我的问题是,为什么我的堆没有像我预期的那样缩小?这不是在抢夺 linux 盒子上其他进程的宝贵内存吗?如果是这样,我该如何解决?我们有时确实会看到内存不足错误,并且这些进程被分配了最“意外”的内存大小,我认为最好从它们开始。
干杯, 戴夫。
(~请原谅可能对JVM内存调整缺乏了解!)
【问题讨论】:
-
也许给盒子分配更多的交换。由于这些页面中有许多未被使用,因此内核可以将它们分页而不会造成垃圾。其他进程应该适合常驻内存。
标签: java linux jvm heap-memory