首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用java内存直方图"jmap“

如何使用java内存直方图"jmap“
EN

Stack Overflow用户
提问于 2014-06-04 09:33:56
回答 1查看 16.6K关注 0票数 6

我们的java流服务器在生产中运行,它需要10 We的RAM才能运行,所以我们安装了32 we。内存逐渐增加,直到达到极限和内存不足的异常弹出。

由于直方图和内存转储数字与系统报告的内存使用量不匹配,即java进程占用最多20 of (因此内存不足的异常是合理的),所以我很难确定随着时间的推移哪些对象正在累积,但是直方图和内存转储显示总共使用了6.4GB。

代码语言:javascript
运行
复制
process : 19.8G
Java
reported:  6.4G
---------------
unknown 
occupied
segment : 13.4G

如何获取未在直方图中显示的未知占用段的内存信息?

我使用jmap -J-d64 -histo <pid> > <file>命令生成直方图。

进程映射了以下内存段,并按大小排序。

代码语言:javascript
运行
复制
0x2DE000000: 13333.5MB
0x61F580000: 6666.5MB
0x7C0340000: 1020.8MB
0x7FBFF33C9000: 716.2MB
0x7FC086A75000: 196.9MB
0x7FB85C000000: 64.0MB
0x7FBAC0000000: 64.0MB
...

jmap报告的所有java对象的总大小适合于0x61F580000: 6666.5MB段。

我猜较大的0x2DE000000: 13333.5MB段保存泄漏的对象,因为直方图显示了这个应用程序的正常内存使用情况。

有没有办法找出什么在占用其他内存没有包括在直方图中?

如何检测服务器的封闭源部分是否使用本机扩展来分配系统内存而不是java内存?在这种情况下,我们不会看到内存不足的异常,对吗?

以下是htop输出:

代码语言:javascript
运行
复制
  Mem[|||||||||||||||||||||31670/31988MB]     Tasks: 87; 35 running
  Swp[||||||||||||||||||   16361/32579MB]     Load average: 39.33 36.00 34.72
                                              Uptime: 44 days, 15:08:19

  PID USER      PRI  NI  VIRT   RES   SHR S CPU% MEM%   TIME+  Command
 3498 root       20   0 51.5G 19.8G  4516 S 151. 63.4     176h java -server -Xmx20000M -

下面是部分直方图输出:

代码语言:javascript
运行
复制
 num     #instances         #bytes  class name
----------------------------------------------
   1:       1134597     5834904800  [B
   2:        407694      144032664  [Ljava.lang.Object;
   3:       2018132      111547480  [C
   4:        100217       71842520  [I
   5:        581934       55865664  com.wowza.wms.httpstreamer.cupertinostreaming.livestreampacketizer.CupertinoRepeaterHolder
   6:        568535       36386240  com.wowza.wms.httpstreamer.cupertinostreaming.livestreampacketizer.CupertinoTSHolder
   7:        975220       23405280  java.lang.String
   8:        967713       23225112  com.wowza.wms.amf.AMFObjChunk
   9:        621660       14919840  com.wowza.wms.httpstreamer.cupertinostreaming.livestreampacketizer.LiveStreamingCupertinoBlock
  10:        369892       11836544  java.util.ArrayList$Itr
  11:        184502       11808128  com.wowza.wms.amf.AMFPacket
  12:        329055        7897320  java.util.ArrayList
  13:         55882        6705840  com.wowza.wms.server.RtmpRequestMessage
  14:        200263        6408416  java.util.HashMap$Node
  15:         86784        6248448  com.wowza.wms.httpstreamer.cupertinostreaming.livestreampacketizer.CupertinoPacketHolder
  16:         24815        5360040  com.wowza.wms.media.h264.H264CodecConfigInfo
  17:        209398        5025552  java.lang.StringBuilder
  18:        168061        4033464  com.wowza.util.PacketFragment
  19:        119160        3813120  java.util.concurrent.locks.AbstractQueuedSynchronizer$Node
  20:         93849        3753960  java.util.TreeMap$Entry
  21:        155756        3738144  java.lang.Long
  22:         55881        3576384  com.wowza.wms.server.RtmpResponseMessage
  23:         55760        3568640  com.wowza.util.FasterByteArrayOutputStream
  24:        130452        3130848  java.util.concurrent.LinkedBlockingQueue$Node
  25:         63172        3032256  java.util.HashMap
  26:         58747        2819856  java.nio.HeapByteBuffer
  27:         34830        2800568  [J
  28:         49076        2355648  java.util.TreeMap$AscendingSubMap
  29:         70567        2258144  com.wowza.wms.stream.livepacketizer.LiveStreamPacketizerBase$PacketizerEventHolder
  30:         55721        2228840  org.apache.mina.util.Queue
  31:         54990        2199600  java.util.HashMap$KeyIterator
  32:         58583        1874656  org.apache.mina.common.SimpleByteBufferAllocator$SimpleByteBuffer
  33:        112743        1803888  java.lang.Integer
  34:         55509        1776288  com.wowza.wms.server.ServerHandlerEvent
...
2089:             1             16  sun.util.resources.LocaleData$LocaleDataResourceBundleControl
Total      11078054     6454934408

java版本是:

代码语言:javascript
运行
复制
# java -version
java version "1.8.0_05"
Java(TM) SE Runtime Environment (build 1.8.0_05-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.5-b02, mixed mode)
EN

回答 1

Stack Overflow用户

发布于 2014-06-05 13:46:19

内存被划分为

  1. 堆空间-堆上的什么,可以从根目录到达
  2. Perm gen -加载的类等静态变量也出现在这里。
  3. 堆栈空间-存储在堆栈上的临时方法级变量,线程局部变量

根据提取JMap的方式,可能不包括perm基因。堆栈空间从未包括在内。这些可能会导致堆转储中看不到的额外内存。

检查这些可能的原因-

  1. 您是否在使用动态生成的类,从而导致perm变得非常大?
  2. 您是否使用线程局部变量并在其上存储大量数据?
  3. 由于某种原因可能会不断增长的局部方法变量?

局部

如果它在本地复制,则可以使用JConsole检查所有内存空间大小,以确定何时使用这么多非堆空间。

尝试加载进入内存分析器的jmap以检查泄漏嫌疑人。它可能会显示出你可能丢失的任何信息。

有关进一步阅读,请参见这些 导轨

在生产设置上尝试以下设置

  1. 通过设置Xmx来增加堆大小
  2. 使用-XX:MaxPermSize=256m增加permgenspace
  3. 设置以下标志-XX:+PrintTenuringDistribution -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+HeapDumpOnOutOfMemoryError -Xloggc:/path/to/garbage.log
  4. 在烫发原上启用GC

为了更好地诊断问题,请提供

  1. OutOfMemory错误的堆栈跟踪应该提供导致问题的原因的信息。
  2. 您在进程开始时提供的JVM标志。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24033875

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档