当前位置: 首页 > 知识库问答 >
问题:

java进程随着时间的推移消耗更多的内存,但没有内存泄漏[重复]

郎琪
2023-03-14

我的java服务运行在一个16 GB的RAM主机上,-xms和-xmx设置为8GB。主机正在运行其他几个进程。

我注意到随着时间的推移,我的服务消耗了更多的内存。我在主机上运行以下命令ps aux awk'{print$6/1024“mb\t\t”$11}'sort-n,并记录java服务的内存使用情况。

当服务启动时,它使用了大约8GB内存(将-xms和-xmx设置为8GB),但一周后,它使用了大约9GB+内存。它每天消耗大约100MB的内存。

我去了一个垃圾堆。我重新启动了我的服务,并采取了另一个堆转储。我比较了这两个转储,但在堆使用方面没有太大差异。转储显示,该服务在重启前使用了约1.3GB,重启后使用了约1.1GB。

html" target="_blank">进程内存使用情况来看,随着时间的推移,我的服务正在消耗更多的内存,但堆转储中没有报告这一点。如何确定服务中内存使用量的增加?

我将-xms和-xmx设置为8GB。主机有16GB内存。是否将最小/最大堆设置得太高(占主机总内存的50%)?这会引起什么问题吗?

共有1个答案

边银龙
2023-03-14

好的,您已经告诉JVM它最多可以使用8GB的堆,并且您观察到总内存使用量从1.1GB增加到1.3GB。这本身并不是一个迹象或问题。当然,JVM使用的内存并不像您所说的那样多。

需要注意的第二件事是,不清楚如何测量内存使用情况。您应该知道JVM使用大量的内存,而不是Java堆内存。这包括:

  • Java可执行文件本身使用的内存。
  • 用于保存本机库的内存。
  • 用于保存字节码和JIT编译的本机代码的内存(在“metaspace”中)
  • 线程堆栈
  • (通常)本机代码请求的堆外内存分配。
  • 内存映射文件和共享内存段。

报告了其中的一些用法(如果您使用了正确的工具)。

第三件事是Java堆实际使用的内存可能会有很大变化。GC通常通过将活动对象从一个“空间”复制到另一个“空间”来工作,因此它需要相当多的空闲空间来完成这项工作。然后,一旦它完成了一个运行,GC查看有多少空间(现在)与使用的空间的比率。如果这个比例太小,它会向操作系统请求更多的内存。因此,尽管实际使用(在非垃圾对象中)只是逐渐增加,但总内存使用量可能会有显著的逐级增加。由于各种“预热”效应,对于最近才开始的JVM来说,这是很有可能的。

最后,你提出的证据没有告诉我(对我来说!)没有内存泄漏。我认为你需要把堆转储站分开一点。我建议在启动2小时后进行一次转储,第二次转储在2小时或更长时间后进行。这会给你足够的“泄漏”来显示在转储的比较中。

是否将最小/最大堆设置得太高(占主机总内存的50%)?这会引起什么问题吗?

当堆填满时,更大的堆将有更明显的性能下降。另一方面,更大的堆意味着将需要更长的时间来填充...假设您有内存泄漏...这意味着诊断问题或确保已修复问题可能需要更长的时间。

但另一方面,这可能根本不是内存泄漏。它也可能是您的应用程序或第三方库缓存的东西。正确实现的缓存可能会使用大量内存,但是如果堆太接近满,它应该通过断开链接1并驱逐缓存的数据来响应。因此,不是内存泄漏...假设。

 类似资料:
  • 问题描述:我们在一个web应用程序(在CQ5上)中面临以下问题: 系统配置详细信息:系统内存: 7GB Xmx: 3.5 GB Xms: 1 GB MaxPermGen: 300MB最大观察线程数: 620(包括300个超文本传输协议请求服务线程)Xss:默认值 问题是cq5 java进程(运行servlet引擎)消耗的内存随着时间的推移而不断增加。一旦达到6到6.5GB以上(系统内存达到7GB)

  • 我们有一个在Solaris 10上运行的java进程,为大约200-300个并发用户提供服务。管理员报告说,随着时间的推移,进程使用的内存显著增加。几天内它就达到2GB,并且从未停止增长。 我们已经转储了堆,并使用Eclipse内存探查器对其进行了分析,但没有看到任何异常。堆的大小非常小。 在添加内存统计日志记录后,我们在应用程序中发现管理员使用的“top”实用程序报告的内存使用量与MemoryM

  • 本文向大家介绍Java 内存泄漏,包括了Java 内存泄漏的使用技巧和注意事项,需要的朋友参考一下 在Java中,垃圾回收(析构函数的工作)是使用垃圾回收自动完成的。但是,如果代码中有引用它们的对象怎么办?它无法取消分配,即无法清除其内存。如果这种情况一再发生,并且创建或引用的对象根本没有被使用,它们就会变得无用。这就是所谓的内存泄漏。 如果超过了内存限制,则程序将通过抛出错误(即“ OutOfM

  • 问题内容: 我发现使用是众所周知的与相关的内存问题。 使用中是否存在内存泄漏? 如果是,解决方法是什么? 以下链接显示了Java中子字符串的正确用法。 http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4513622 另外一个博客谈论子字符串中可能的MLK。 http://nflath.com/2009/07/the-dangers-of- st

  • 我的Optaplanner似乎出现了内存泄漏。要复制,只需下载Quarkus示例: 然后通过增加终止时间(例如,将)和取消注释表示的行来更改以启用多线程。 然后,运行手册中的请求: 内存使用量开始稳步增加,同时生成了数百万个PhreakPropagationContext对象。我认为这不是预期的行为。我应该为此制造问题还是遗漏了什么?