我试图分析一直让我疯狂数周的内存泄漏,我发现了eclipse MAT工具可以帮助你弄清楚什么是错的,问题是我发现的每一个教程都说我需要转换格式从dalvik到HPROF格式的文件 ,但是我找不到一个单独的教程解释了如何实际做到这一点,而是我得到了这样模糊的东西
现在您将获得的文件不符合"标准"Sun .hprof格式,但是以Dalvik自己的格式编写,您需要将其转换为:
hprof-conv heap-dump-tm-pid.hprof 4mat.hprof
这究竟意味着什么?我点击什么?我要去哪?我完全迷失和沮丧,任何帮助都会走很长的路,谢谢.
如果-XX:+HeapDumpOnOutOfMemoryError在指定路径下已存在转储文件,则使用JVM时不会覆盖堆转储.我希望能够在非默认位置具有多个堆转储,并且计划在堆转储路径中使用pid以允许它.
但是,当我试图像这样指定参数时:
-XX:HeapDumpPath=some/heapdump/path/heapdump-%p.hprof
Run Code Online (Sandbox Code Playgroud)
然后创建了一个堆转储,我得到了%p而不是文件名中的实际pid.但是,使用%p似乎与-XX:OnOutOfMemoryError选项一起使用.我应该使用其他一些语法-XX:HeapDumpPath=吗?
我正在经历内存泄漏,这里有一些细节.
__PRE__
我很惊讶顶部,堆转储大小和实际堆大小之间的差异.我猜测顶部和堆之间的区别是垃圾收集器堆和本机堆区域的可能性.但是,为什么堆转储文件大小和实际堆大小(来自eclipse MAT分析器)可能会有所不同?
对这个问题的任何见解?
更新/答案
一些建议是使用jcmd(https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr007.html),因为该网站告诉"本机内存跟踪".但是,如果你仔细阅读页面,你会看到
__PRE__
因此,如果本机库中存在泄漏,则jcmd不是一个选项.
在爬行互联网几天并尝试各种剖析器之后,对这个问题最有效的方法是使用jemalloc剖面仪.
这个页面对我帮助很大! https://gdstechnology.blog.gov.uk/2015/12/11/using-jemalloc-to-get-to-the-bottom-of-a-memory-leak/
只是想知道什么是各种工具和技术来调试Java应用程序的生产问题.喜欢,
(假设所有都在Linux/Unix环境中)
我想jmap -histo从受监控的应用程序内部以编程方式获得相当于的输出.我看到通过HotSpot诊断bean可以触发二进制堆转储,但我看不到如何获取直方图数据.可能吗 ?
在过去的几天里,我们看到我们的服务器上的JVM进入一个状态,他们在OldGen的GC中花费100%的CPU时间,时间:
A.他们不需要,因为堆上有足够的空间
B.他们不回收任何东西.
我知道他们在GC中是通过查看堆栈跟踪并将ProcessExplorer中的ThreadID与堆栈转储中的ThreadID相关联.每个GC线程占用大约4%的CPU.
服务器运行16 gig堆(32gig物理RAM)并具有8个核心.正常运行时间通常为30天左右,只需要根据MS补丁要求重新启动,但目前它们在20天内崩溃.
这是持续时间,时间尺度= 19天的图表. http://i45.tinypic.com/257qalu.png
这是该图表尾部的缩放 http://i48.tinypic.com/2duiccw.png
如您所见,持续时间急剧增加.
下面是GC后堆使用情况的图表. http://i48.tinypic.com/znna4h.png
如果这是一个典型的内存泄漏,我希望看到橙色峰值越来越高,直到它们不再达到峰值,但如图所示,剩下大量的堆空间.
我有每个服务器的堆转储,没有什么是有问题的突出.有几个ehCache商店,我可以看到我们的应用程序代码,即只是"正常的东西"
我们在20天前做出的最大改变是实现了一个供应商补丁,它将内部缓存从使用硬引用(以及明显的内存泄漏)的无界散列图更改为由软引用组成的一个,我想知道这是否是原因,即某种程度上在管理这些软引用之后会产生巨大的开销?
有没有人想知道接下来要去哪里,或者有人可以证实我的软参考理论?
这是我的jvm.args:
java.args = -server -Xms16000m -Xmx16000m -Dsun.io.useCanonCaches = false -XX:MaxPermSize = 350m -Xloggc:e:/gcLogs/eRGCLogs.txt -verbose:gc -XX:+ PrintGCDetails -XX:+ PrintGCTimeStamps - XX:+ PrintGCDateStamps -XX:+ UseParallelGC -XX:+ UseParallelOldGC -Dnet.sf.ehcache.sizeof.filter = D:/jo3/java_ehCacheOpenSource/sizeOfExclusions.config -Xbatch -Dcoldfusion.rootDir = {application.home}/../-Dcoldfusion.libPath = {application.home} /../ lib -Dcoldfusion.classPath = {application.home} /../ lib/updates,{application.home} /../ lib,{application.home} /../gateway/lib/,{application.home}/../wwwroot/WEB-INF/flex/jars,{application.home}/../wwwroot/WEB-INF/cfform/jars,d:/ jo3/JAVA,d:/ jO3/java_ehCacheOpenSource /,d:/ jo3/java_ehCacheMonitorProbe
我们在Coldfusion上,这有点像一个位于java之上的庞大框架.
JVM版本:1.6.0_29
根据要求,"正常"GC日志如下所示:
2013-03-19T22:11:36.670 + 1100:1288665.702:[GC [PSYoungGen:4695800K-> 471119K(4722112K)] 9301727K-> 5077046K(15644800K),0.3584434 secs] [次:用户= 5.01 sys …
我正在寻找内存泄漏,堆转储显示我有许多lambda实例正在保存有问题的对象.lambda的名称是最后的周围类名$$lambda$107.我还可以看到它有一个字段(它是正确的名称),调用arg$1它引用填充堆的对象.不幸的是,我在这堂课中有很多lambdas,我想知道我能做些什么来缩小范围.
我假设arg$1是一个隐式参数 - lambda表达式中的一个自由变量,当lambda成为一个闭包时被捕获.那是对的吗?
我也猜测107在孤立中没有真正的帮助,但是我可以设置一些标志来记录哪个lambda表达式得到什么数字?
还有其他有用的提示?
我有一个Hotspot JVM堆转储,我试图找出一个对象是否在权属空间,伊甸园空间或幸存者空间中存在,但我不能.
感谢有人可以帮助我.
如何在我的应用程序中创建堆转储,而不使用类HotSpotDiagnosticMXBean.由于访问限制java/rt.jar我无法编译它依赖于HotSpotDiagnosticMXBean.我知道如何解决eclipse.compiler错误,但是如何为我的构建修复它?有没有以编程方式创建堆转储的方法?
伙计们,我不认为这是重复的,也不是其中一个我如何避免OOM问题.这是对知识的真正追求,所以推迟那些投票请...
想象一下,我有一个JPEG的500x500像素.我把它加载ARGB_8888为" bad as it gets".
我希望Android可以分配,500x500x4 bytes = a little under 1MB但是看看堆转储,你会看到Android分配的5-10次数要多得多,通常是时间的因素.
您经常在这里看到有关OOMS的问题,其中堆栈跟踪显示a heap request of say 15MB并且它总是比仅仅保存图像的字节所需的大得多.OP通常会捕获一些downvotes然后被库存答案和关于使用更少内存(感谢Romain!)和缩放的评论轰炸.我认为这里有更多的东西.
谁知道为什么会这样?
如果没有明显的答案,如果有帮助,我会组建一个SSCCE.
PS.我认为JPEG与PNG等是无关紧要的,因为我们讨论的是后备位图的内存使用量,这只是x乘以BPP的x倍 - 或者我是否很慢?
heap-dump ×10
java ×8
android ×2
eclipse ×2
jvm-hotspot ×2
closures ×1
coldfusion ×1
coldfusion-9 ×1
heap ×1
heap-memory ×1
java-8 ×1
java-ee ×1
jmx ×1
jvm ×1
lambda ×1
mat ×1
memory ×1
memory-leaks ×1
pid ×1