- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我们在生产环境中运行了 Java 流媒体服务器,它需要大约 10GB 的 RAM 才能运行,因此我们安装了 32GB。逐渐增加内存,直到达到限制并弹出内存不足的异常。
我很难确定随着时间的推移积累了哪些对象,因为直方图和内存转储数字与系统报告的内存使用情况不匹配,即 java 进程占用的最大内存略多于 20GB(因此内存不足异常是合理的)但是直方图和内存转储显示总共使用了 6.4GB。
process : 19.8G
Java
reported: 6.4G
---------------
unknown
occupied
segment : 13.4G
如何获取直方图中未显示的未知占用段的内存信息?
我用了jmap -J-d64 -histo <pid> > <file>
命令生成直方图。
进程映射了以下内存段,按大小排序显示
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
更大的部分保留泄漏的对象,因为直方图显示此应用程序的正常内存使用情况。
有没有办法找出是什么占用了直方图中未包含的其他内存?
如何检测服务器的闭源部分是否使用 native 扩展来分配系统内存而不是 java 内存?在那种情况下,我们不会看到内存不足的异常,对吧?
这是 htop 输出:
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 -
这是部分直方图输出:
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版本是:
# 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)
最佳答案
内存分为
根据 JMap 的提取方式,perm gen 可能不包含在内。堆栈空间从不包括在内。这些可能会增加您在堆转储中看不到的额外内存。
检查这些可能的原因 -
本地
如果它在本地重现,您可以使用 JConsole 检查所有内存空间大小,以确定何时使用了如此多的非堆空间。
尝试加载 jmap into Memory Analyzer检查泄漏嫌疑人。它可能会向您显示您可能遗漏的任何信息。
在生产设置中尝试以下设置
为了更好地诊断问题,请提供
关于java - 如何使用java内存直方图 "jmap",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24033875/
我使用 为 .dat 文件中的一些数据创建了直方图 binwidth=... bin(x,width)=width*floor(x/width) plot 'file' using (bin($1,b
我需要能够在单个直方图上显示多条线,其中每条线都应该由一个参数表示。我有多个服务器,我想监控它们的 CPU 使用率。我的 Kibana 输入数据如下所示: 时间戳 |机器 |姓名 |值(value)
我在 Elasticsearch 中有一个索引,它包含一个简单对象数组(键值,请参见下面的示例)。 文档有时间戳。 我可以在 Kibana 中为每个键值创建单独的直方图(即一个用于 bytes_sen
所以我想出了如何将我的数据下钻到频率表 - Overall.Cond Freq 235 1 0 236 2 0 237
我的目标是使用 gnuplot 5.4 框创建直方图,并用特定的 RGB 值对每个框进行着色(出于测试目的,它是“绿色”,但在最终数据集中将是 #RRGGBB) 我的数据如下所示: 5.800507
我有 chr totgenes FST>0.4 %FST>0.4 exFST>0.4 %exFST>0.4 inFST>0.4 %inFST>0.4 chrtotlen 1 14
我用 matplotlib 创建了一个直方图使用 pyplot.hist()功能。我想在条形图中添加 bin 高度 ( sqrt(binheight) ) 的毒物误差平方根。我怎样才能做到这一点? .
我有兴趣在 R 中创建一个包含两个(或更多)人口的直方图,这意味着 - 我不希望两个直方图共享同一个图形,而是一个包含两种或更多颜色的条形图。 找到下面的图片 - 这就是我想要完成的。 有什么想法吗?
所以,我需要按日期制作数据直方图,但我有 xticlabel 重叠的问题,所以,我试图找到一个解决方案,如何跳过 xtics 以避免重叠。考虑到日期不是整数抽动,我试图以这种方式解决它: .dat 文
给定每小时都有数据点的(电力)市场数据的时间序列,我想显示一个包含每小时数据的所有时间/时间范围平均值的条形图,以便分析师可以轻松地将实际价格与所有时间平均值进行比较(一天中哪个小时最贵/最便宜)。
+----+----+--------+ | Id | M1 | trx | +----+----+--------+ | 1 | M1 | 11.35 | | 2 | M1 | 3.4
所以,我需要按日期制作数据直方图,但我有 xticlabel 重叠的问题,所以,我试图找到一个解决方案,如何跳过 xtics 以避免重叠。考虑到日期不是整数抽动,我试图以这种方式解决它: .dat 文
我有以下示例数据文件,我想在 gnuplot 中将其绘制为直方图 1 1 2 2 4 3 我正在使用以下命令绘制数据:用方框绘制“sample.data”,生成以下图表: ##
我是 Java 编码新手,我正在尝试使用提供给我的以下方法创建直方图。这些注释是对每个方法的说明,稍后我们将使用它们来创建主方法并打印直方图。我已经达到了方法 3,并且能够很好地编译所有内容,但我不确
我有一个由服务器上的程序生成的连续生成的数据(文本文件)。我想将数据绘制为实时图表,就像 powergrid做。这是我的方法: 由于数据是在服务器上以文本文件的形式连续生成的,因此我编写了一个 PHP
我正在尝试通过一个函数使用 D3 创建一个简单的直方图。图表的 y 值作为数组传递给函数,然后函数创建 svg 和条形图。我得到了正确的轴,但条被切断了。 似乎我的矩形 x 值太大而无法放入 svg
有没有办法用 linq 做一个分段直方图?我见过几个示例,您可以在其中计算特定对象的出现次数。是否可以创建一个基于 linq 的直方图来计算两个值之间的一系列对象的出现次数? 我不知道您将如何按一系列
我正在参加初级 Java 类(class),任务是创建一个具有以下输出的直方图程序:(100 和 10 是用户输入)。 有多少个数字? 100 间隔多少? 10 Histogram ---------
如何使用 corePlot 实现直方图。实际上,我正在尝试使用条形图。 在条形图中是否有任何选项可以对我的值进行分组。例如:所以我只能打印 3 条。这样值应该像这样分组: X 0...5: B
我有一个简单的数据集,其中脚本需要时间来完成各个步骤。时间是不可预测的,但主要分组在特定的时间范围内,但我想以十分之一秒的分组来绘制图表。 (我知道这很奇怪,这是一些报告可视化内容的要求)。我可以将我
我是一名优秀的程序员,十分优秀!