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

为什么我的Java堆转储大小比使用的内存小得多?

梁烨
2023-03-14

我们正试图找到web应用程序中大内存泄漏的罪魁祸首。我们在查找内存泄漏方面的经验相当有限,但我们了解了如何使用jmap创建java堆转储,并在Eclipse mat中对其进行分析。

但是,由于我们的应用程序使用56/60GB内存,堆转储的大小只有16GB,在Eclipse mat中就更少了。

对于我们的java应用程序,我们的服务器使用Ubuntu14.04上的Wildfly8.2.0,其进程使用了95%的可用内存。在进行转储时,我们的缓冲区/缓存使用的空间为56GB。

我们使用以下命令创建转储:sudo-u{application user}jmap-dump:file=/mnt/heapdump/dump_prd.bin{pid}

堆转储文件的大小是164GB,当使用Eclipse MAT分析它时,它说有大约1GB的活动对象和大约148GB的不可达/浅堆。

编辑:这里有一些关于我们看到的问题的更多信息。我们监控我们的内存使用,我们看到它不断增长,直到有大约300MB的空闲内存。然后它保持在该内存量附近,直到进程崩溃,不幸的是,应用程序日志中没有错误。

这使得我们认为这是一个硬OOM错误,因为只有当内存接近耗尽时才会发生这种情况。我们对JVM使用设置-xms25000m-xmx40000m

基本上,我们想知道为什么我们的大部分内存没有被捕获在这个转储中。顶部保留的大小类看起来不太可疑,所以我们想知道是否有与堆转储相关的东西我们做错了。

共有1个答案

上官景铄
2023-03-14

在转储堆时,JVM将首先运行垃圾收集循环以释放任何无法访问的对象。

如何在Java5上进行堆转储而不先收集垃圾?

根据我的经验,在一个真正的OutOfMemoryError中,您的应用程序仅仅需要比可用的堆空间更多的堆空间,这个GC是一个愚蠢的差事,最终的堆转储将是最大的大小。堆大小。

当堆转储小得多时,这意味着系统并不是真正的内存不足,而是可能有内存压力。例如,存在java.lang.outofMemoryError:GC开销限制超出错误,这意味着JVM可能已经能够释放足够的内存来服务一些新的分配请求,但它必须花费太多的时间来收集垃圾。

也有可能你没有记忆问题。你凭什么认为你会这么做?您没有提到任何关于堆使用或OutofMemoryError的内容。您只提到了JVM对操作系统的内存占用。

 类似资料:
  • 问题内容: 我们正试图在我们的Web应用程序中找到导致大量内存泄漏的元凶。我们在发现内存泄漏方面经验有限,但是我们发现了如何使用Eclipse MAT进行Java堆转储并对其进行分析。 但是,对于我们使用56 / 60GB内存的应用程序,堆转储的大小仅为16GB,而在Eclipse MAT中则更少。 语境 我们的服务器将Ubuntu 14.04上的Wildfly 8.2.0用于我们的Java应用程

  • 我一直在分析我们服务的Java.lang.OutofMemoryError:Java堆空间,并试图通过Eclipse MAT工具挖掘堆转储。 我们的服务使用8G堆运行,生成的堆转储的大小只有500 MB。

  • 我为我的Java web应用程序分配了一个最大值。由于一些内存泄漏,应用程序已经消耗了将近2 GB的分配内存。此时,我已经使用进行了内存转储。在一个实例中,堆转储大小接近>1.5GB,而在另一个实例中,堆转储大小<100 MB。这背后的原因是什么?

  • 以下是一些信息: Linux版本3.18.6-2.el7.centos.x86_64,OpenJDK-11.0.2 使用ZGC和-xms16384m-xmx16384m top命令显示:17.013t VIRT,0.016t RES,0.015t SHR,35.2%CPU,13.0%MEM 堆转储大小为83M(使用jcmd命令) VisualVM摘要显示堆大小为55M 在大多数GC情况下:垃圾收集

  • 在使用Java的生产中,我经常遇到一些完全的GC问题,我怀疑内存是由网络库分配来缓冲TCP请求结果的。 我已经在内存使用率很高(大约8GB)时转储了Java堆。我尝试用eclipse MAT分析。hprof文件,该文件大约有8GB。 由于eclipse MAT没有显示完整的堆转储内容,我不知道如何找到应用程序占用这么多内存的原因。

  • 我们将和设置为1536m。现在,如果我理解正确的话,j-xmx表示堆的最大大小。 本系统采用4核15GB ram进程。 但是,当我检查正在运行的Java进程的RSS(使用top)时,我看到它使用的值比大,大约。 对于来说,有4个内核和15GB RAM的理想设置是什么(假设除了Java应用程序之外,系统中没有其他进程在运行)