【问题标题】:Understanding java memory usage了解java内存使用情况
【发布时间】:2019-04-18 22:16:19
【问题描述】:

我正在尝试解决我的 tomcat 服务器遇到的内存问题,并且我对内存使用有一些疑问。 当我使用 top 检查我的进程内存使用情况时,我看到它使用 1Gb 物理内存,在使用 gdb 创建核心转储后,核心文件大小为 2.5GB ,并且在分析 jmap 创建的 HPROF 文件时,它指出使用了 240MB。

那么,如果 top 显示 1GB,为什么 hprof 文件只显示 240MB 760MB 去了哪里?

【问题讨论】:

  • 240MB 是否显示为堆内存?如果不是,其中的 Used Heap 是什么?您能否提供一些有关 jmap 提供的数字的详细信息
  • 我想是的,这是 Eclipse Memory Analyzer 中显示的总大小
  • 如果你只转储活动对象,这可能是堆的一小部分,也就是进程使用的内存的一小部分。
  • jmap 中没有使用“live”选项

标签: java memory-leaks gdb jmap hprof


【解决方案1】:

您是否尝试过使用-heap:format 选项集运行Jmap? JVM 通常在进行转储之前运行一次 GC。

另外,JVM memory 不仅仅是堆内存。它包含代码、堆栈、本机方法、直接内存,甚至线程都不是free to use。你可以阅读更多关于它的信息here。只要确保看看所有这些是否也加起来。

我建议使用 VisualVMyourkit 并比较内存。另外,您使用的是哪种 GC?
一些 GC 通常不会在增加堆内存后缩小,但如果在堆转储期间触发 GC,它可能会释放一些内存(尝试 G1GC)。

【讨论】:

  • 堆转储是从核心转储文件(由 gdb 创建)创建的,这是否意味着在堆转储之前没有 GC?
猜你喜欢
  • 2011-03-09
  • 1970-01-01
  • 2018-10-11
  • 2012-09-04
  • 1970-01-01
  • 2015-01-13
  • 2020-12-10
  • 2016-07-25
  • 1970-01-01
相关资源
最近更新 更多