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

[ZGC]为什么使用的内存比转储文件大得多?

洪宏硕
2023-03-14

以下是一些信息:

  1. Linux版本3.18.6-2.el7.centos.x86_64,OpenJDK-11.0.2
  2. 使用ZGC和-xms16384m-xmx16384m
  3. top命令显示:17.013t VIRT,0.016t RES,0.015t SHR,35.2%CPU,13.0%MEM
  4. 堆转储大小为83M(使用jcmd命令)
  5. VisualVM摘要显示堆大小为55M
  6. 在大多数GC情况下:垃圾收集(主动)1808m(11%)->166m(1%)

我已经搜索并阅读了以下答案,但仍然无法解决我的疑惑。

  1. Java ZGC垃圾回收器使用大量内存
  2. ZGC最大堆大小超过物理内存
  3. 为什么我的Java堆转储大小比使用的html" target="_blank">内存小得多?

共有1个答案

巴照
2023-03-14

我不确定第6点到底是什么,如果您显示垃圾收集器日志文件中的几行,那将会更有帮助。我也不使用VisualVM,所以不能对此发表评论。

所以这个答案多半是猜测。

JVM使用的内存被划分为不同的区域,最重要的是,您有一个堆和一个堆栈。但是,您仍然会看到,堆将比使用-xmx配置的大,因为有一个称为Metaspace(或旧的JVM中的永久生成)的区域,它保存静态信息,如类,或者例如来自源代码的字符串文本。元数据库位于“普通”堆的顶部。我的猜测是,一些工具将它计算到堆中,而一些不计算。这可能是你得到不同数字的地方。

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

  • 我们正试图找到web应用程序中大内存泄漏的罪魁祸首。我们在查找内存泄漏方面的经验相当有限,但我们了解了如何使用创建java堆转储,并在Eclipse mat中对其进行分析。 但是,由于我们的应用程序使用56/60GB内存,堆转储的大小只有16GB,在Eclipse mat中就更少了。 对于我们的java应用程序,我们的服务器使用Ubuntu14.04上的Wildfly8.2.0,其进程使用了95%

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

  • 我有大约500MB的H2数据库。 H2的版本是1.2.147。 数据库的存储引擎是PageStore。 JDBC URL如下所示。 jdbc:h2:file://C:/h2/client;如果存在=真;MVCC=真;数据库\u事件\u侦听器。H2DBMonitor';AUTO_SERVER=TRUE;对数=2 我做了一个版本的H2 1.4.192没有改变数据库的存储引擎。 当我的客户使用数据库时,

  • 问题内容: 我有一个带有1.6Gb日志文件的大约13Gb的SQL Server数据库。但是,当我备份它时,它将创建一个50Gb .bak文件!这是为什么? 我在这里阅读了一些有关事务日志的评论,但是我的数据库在笔记本电脑上运行,并且在备份期间没有数据库活动。(仅需5分钟)。 我的备份类型为“完全”,我的恢复类型为“完全”,并且正在执行“仅复制”备份。有任何想法吗?非常感激! 我正在使用SQL 20

  • 问题内容: 有时,当我运行代码时,用+ 终止程序会生成一个核心转储文件。文件名的格式为。该程序不会突然终止,并且没有分段错误。我认为这是不和。如果我尝试+ 或+ ,则不会生成。 谁能说出为什么仅在按+ 时才生成?如何避免生成此核心转储文件?核心转储文件有什么用? 问题答案: 当进程由于程序故障而被操作系统终止时,进程将转储核心。发生这种情况的最典型原因是因为程序访问了无效的指针值。鉴于您有一个零星