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

老世代内存使用量的增长总是意味着Java内存泄漏?

党航
2023-03-14

我们有几个虚拟机在生产中运行数据服务,客户机向数据服务发送Restful HTTP请求,负载很重(通常每个主机每秒500个请求),每个虚拟机上的负载总是平衡的。我们在所有主机上都有相同的配置(2个CPU,-Xms2048m-Xmx4096m-XX:MaxPermSize=192m-XX:NewSize=512m-XX:MaxNewSize=512m-XX:UseConMarkSweepGC-XX:CMSClassUnloadingEnabled-XX:heapdumponAutofmemoryError

两天前,我们看到其中5个虚拟机上的旧gen堆使用量开始增长(每天300 MB),其他虚拟机上的旧gen堆使用量保持不变(大约80 MB),我们正在努力找出根本原因,请问这是内存泄漏问题还是正常情况?旧一代内存使用量的增长是否总是意味着Java内存泄漏?

谢谢

更新:我们昨天刚刚重启了这5台主机,所有主机上的旧gen堆使用率都恢复了正常,但是,在今天早上的峰值负载之后,其中一台主机上的旧gen堆使用率又开始增长了...

共有2个答案

鲁丰
2023-03-14

听起来你描述的是内存泄漏。因为对我来说,内存泄漏是指你的内存在没有任何好的理由或开发人员不了解原因的情况下不断增加。这可能意味着,一些您实际上不需要的数据仍保留在内存中,这可能是由于一个错误。

我会考虑使用一个好的剖析器来找到根本原因。这可能是最简单的。我不知道这里是否允许我命名产品,但JProfiler在我参与的多个项目中拯救了我的团队。

公西嘉玉
2023-03-14

旧一代内存使用量的增长是否总是意味着java内存泄漏?

不一定。

并发标记扫描垃圾收集器在收集过程中不会压缩旧的gen。因此,在足够的内存负载下,可能会获得大量碎片,从而无法回收足够的内存来将终身对象提升到旧的gen空间。

试着打开这些参数,看看发生了什么:

-XX:PrintGCDetails-XX:PrintPromotionFailure-XX:PrintFLSSStatistics=1

查找升级失败和频繁的完全GC扫描,它们无法释放大量内存。

如果您使用的是Java 7或更高版本,可以尝试切换到G1收集器(-XX:UseG1GC而不是-XX:useConMarkSweepGC)。这是一个压缩收集器,可以避免上述一些问题。

如果在那之后仍然遇到问题,那么我会查看您的代码,看看是否有东西挂在了对象引用上,而它本不应该挂在对象引用上。

编辑:由于这发生在一些主机上,而不是其他主机上,我倾向于代码问题,可能与意外的用户输入有关,因为它只是偶尔发生。

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

  • 我使用5.6.21-70.0进行性能测试。 当我跑步时 mysqlslp-a--并发=40--查询次数1000次--迭代=500次--引擎=innodb--debug-info-utest-p 做一些性能测试,ram增长超过最大内存使用量,永不释放 当完成mysqlslap时,内存显示使用78% 我有1G物理内存,不使用交换 KiB Mem:总共1016656个,使用953808个,免费62848

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

  • 问题内容: 我们最近对生产系统的观察告诉我们Java容器的常驻内存使用量正在增长。关于此问题,我们已经进行了一些调查,以了解为什么Java进程使用pmap之类的本地工具会比堆+线程堆栈+共享对象+代码缓存+等消耗更多的内存。结果,我们发现本机进程(可能是malloc / mmap)分配了一些64M内存块(成对): 我将0000000720000000 3670016K的行解释为我们使用JVM参数“

  • 问题内容: 我们最近对生产系统的观察告诉我们Java容器的常驻内存使用量正在增长。关于此问题,我们已经进行了一些调查,以了解为什么Java进程使用诸如pmap之类的本地工具比堆+线程堆栈+共享对象+代码缓存+等消耗更多的内存。结果,我们发现本机进程(可能是malloc / mmap)分配了一些64M内存块(成对): 我将0000000720000000 3670016K的行解释为我们使用JVM参数