Tag: heap dump

为什么我的Java堆转储大小比使用的内存小得多?

问题 我们试图在我们的Web应用程序中找到大内存泄漏的罪魁祸首。 我们在查找内存泄漏方面经验非常有限,但我们发现了如何使用jmap创建Java堆转储并在Eclipse MAT中对其进行分析。 但是,在我们的应用程序使用56 / 60GB内存时,堆转储的大小只有16GB,在Eclipse MAT中甚至更少。 上下文 我们的服务器在Ubuntu 14.04上使用Wildfly 8.2.0作为我们的Java应用程序,其进程使用95%的可用内存。 进行转储时,我们的缓冲区/缓存已用空间为56GB。 我们使用以下命令创建转储: sudo -u {application user} jmap -dump:file=/mnt/heapdump/dump_prd.bin {pid} 堆转储文件大小为16,4GB,当使用Eclipse MAT进行分析时,它表示有大约1GB的活动对象和大约14,8GB的无法访问/浅堆。 编辑:这里有一些关于我们看到的问题的更多信息。 我们监视我们的内存使用情况,我们看到它的增长和增长,直到剩下约300mb的可用内存。 然后它保持在那个内存量附近,直到进程崩溃,遗憾的是应用程序日志中没有错误。 这使我们假设它是一个硬OOM错误,因为这只发生在内存接近耗尽时。 我们为JVM使用-Xms25000m -Xmx40000m设置。 题 基本上,我们想知道为什么我们的大部分内存都没有在这个转储中被捕获。 顶部保留的大小类看起来并不太可疑,所以我们想知道是否存在与堆转储有关的问题我们做错了什么。

使用Hibernate时内存使用率很高

我在linux服务器上用java运行代码服务器端应用程序。 我使用hibernate打开数据库会话,使用本机sql查询它,并始终通过try,catch,finally关闭此会话。 我的服务器查询DB使用非常高频率的hibernate。 我已经定义了MaxHeapSize因为它是3000M但它通常在RAM上使用2.7GB,它可以减少但比增加慢。 有时它的内存使用量会增长到3.6GB,比我的MaxHeapSize在启动时定义的要多。 当使用的内存为3.6GB时,我尝试使用-jmap命令转储它并获得一个大小仅为1.3GB的heapdump。 我使用eclipse MAT来分析它,这里是来自MAT的统治者树 我认为hibernate是问题,我有这么多的org.apache.commons.collections.map.AbstractReferenceMap $ ReferenceEntry。 它可能无法通过垃圾收集处理或者可能会变慢。 我该如何解决?

使用jmap命令的Java堆转储错误:过早的EOF

我在执行下面的命令时遇到了以下exception jmap -dump:format=b,file=heap_dump.bin 输出: Dumping heap to Exception in thread “main” java.io.IOException: Premature EOF at sun.tools.attach.HotSpotVirtualMachine.readInt(HotSpotVirtualMachine.java:248) at sun.tools.attach.LinuxVirtualMachine.execute(LinuxVirtualMachine.java:199) at sun.tools.attach.HotSpotVirtualMachine.executeCommand(HotSpotVirtualMachine.java:217) at sun.tools.attach.HotSpotVirtualMachine.dumpHeap(HotSpotVirtualMachine.java:180) at sun.tools.jmap.JMap.dump(JMap.java:242) at sun.tools.jmap.JMap.main(JMap.java:140) JDK版本: 1.7.0_45 VM_OPT: -Xms2g -Xmx4g -XX:+UseG1GC -XX:MaxGCPauseMillis=1500 -XX:G1HeapRegionSize=2 -XX:+PrintFlagsFinal -XX:ParallelGCThreads=4 -XX:ConcGCThreads=2 硬件:RHEL 5.x,4核CPU Linux机器6 GB RAM 根据oracle bug报告数据库( http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6882554 ),这个问题已经修复但我仍然得到jdk 1.7版本,内置版本号:45 除了升级到Jdk 1.8之外,您能否提出任何解决方案,由于其他依赖性,这在我的情况下是不可能的? 编辑: 我已尝试使用以下命令,此命令也不起作用( 生成部分转储文件 )并显示相同的早期EOF。 jmap -J-d64 […]

在未捕获的exception上生成Java堆转储

当未捕获的exception被触发时,我尝试生成堆转储。 我尝试使用jmap,但因为当exception发生时进程已完成,这是不可能的。 使用UncaughtExceptionHandler也不是选项,因为我只有执行程序的二进制文件。 谁能帮我? 编辑:通过命令行或类似方法提供该技术非常重要,因为我需要自动执行此操作。 使用GUI是没有选择的

eclipse内存分析器看到整个堆转储的小部分(363,2MB)(8GB)

我试图调查java.lang.OutOfMemoryError: GC limit exceeded ,这是在我们在tomcat中部署的Web应用程序的高负载时发生的。 堆大小设置为8GB( -Xms2048m -Xmx8192m ) 在某些时候,由于GC活动开销,我们的应用程序变得无法响应。 我可以在日志中看到Full GC连续多次出现。 所以我用以下命令进行了堆转储( jmap -F -dump:format=b,file=/root/dump2.hprof 4963 )。 包含dump的文件大小为9GB。 在转储(app被冻结约45分钟)后,发生了多个完整的GC,直到OutOfMemoryError 。 这是GC活动的对数样本 [Full GC [PSYoungGen: 932096K->875513K(1864128K)] [ParOldGen: 5592447K->5592447K(5592448K)] 6524543K->6467961K(7456576K) [PSPermGen: 112285K->112285K(262144K)], 12.3954040 secs] [Times: user=47.60 sys=0.43, real=12.39 secs] [Full GC [PSYoungGen: 932096K->890562K(1864128K)] [ParOldGen: 5592447K->5592447K(5592448K)] 6524543K->6483009K(7456576K) [PSPermGen: 112285K->112285K(262144K)], 12.6131900 secs] [Times: user=48.45 sys=0.49, real=12.61 secs] [Full […]

如何永久增加java堆内存?

我有一个Java堆内存的问题。 我在java中开发了一个客户端服务器应用程序,它作为Windows服务运行,需要超过512MB的内存。 我有2GB的RAM,但是当我运行我的应用程序时它会引发exception 内存不足错误:java堆空间 但我已经在java控制面板中设置了堆大小(最大512MB),我仍然得到相同的错误。 我无法通过命令行设置堆大小,因为我的应用程序作为Windows服务运行,所以如何增加默认堆大小?