【问题标题】:Memory dump much smaller than available memory内存转储比可用内存小得多
【发布时间】:2010-05-11 05:24:22
【问题描述】:

我有一个配置为在 OOM 上创建内存转储的 Tomcat 应用程序服务器,它以 -Xmx1024M 启动,因此他应该可以使用 Gigabyte。

现在我找到了一个这样的转储,它只包含 260MB 的未保留内存。转储怎么可能比他应该有的大小小得多?

【问题讨论】:

  • 是堆空间还是永久代空间的内存不足异常?
  • +1 @Affe:好问题。由于某种原因,异常没有进入日志文件,我也必须对此进行调查。 xprof 转储是否还包含有关已加载类的信息,还是仅包含有关堆上对象的信息?
  • @affe:你是对的,这是一个 PermGen 错误(今天早上又在我的日志中发现它)。请添加这个添加一个答案,所以我可以接受它。

标签: java memory-leaks dump memory-dump hprof


【解决方案1】:

Permgen 空间独立于堆进行管理,即使在总体上有大量可用内存时也会用完。一些 web 框架(尤其是 JSF)是真正的猪,虽然很容易导致默认配置用完。可以通过 -XX:MaxPermSize=###m

来增加

请记住,系统空间受 heap 和 permgen 之和的限制,因此,如果您不减少 heap 与 PermGen 增加的数量,您可以在开始收到无法创建本机线程 OOM 异常之前消耗更少的总资源。

【讨论】:

    【解决方案2】:

    只有有关分配内存使用情况的信息才会转储到文件中。 堆转储不是堆的二进制映像,它包含有关数据类型等的信息,并且可能超出您的可用内存。

    Text (classic) Heapdump file format

    【讨论】:

    • +1 正确,我知道,但它怎么可能是大约。只有可用内存大小的 25%?
    • @Daniel 对于更大的对象,与它们的实际内存分配相比,堆转储中的表示会很小。
    • 为什么会这样?我知道对象对齐到 8 个字节,但这并不能解释巨大的差异。
    猜你喜欢
    • 1970-01-01
    • 2015-11-23
    • 2017-01-28
    • 2016-08-17
    • 2021-05-13
    相关资源
    最近更新 更多