我们的一个项目有时会得到一个 OutOfMemory在一个用户的计算机上出错,但当然不是在我测试它时.我只是用JProfiler运行它(在10天的评估许可证上,因为我之前从未使用它),并且对我们的代码前缀进行过滤,总大小和实例数量中最大的块是特定简单类的8000多个实例.
我点击了JProfiler上的"Garbage Collect"按钮,我们其他类的大部分实例都消失了,但不是这些特殊的.我再次运行测试,仍然在同一个实例中,它创建了4000多个类的实例,但是当我点击"垃圾收集"时,那些离开了8000多个原始实例.
这些实例在各个阶段都会遇到各种集合.我认为它们不是垃圾收集的事实必然意味着某些东西持有对其中一个集合的引用,以便保持对对象的引用.
有什么建议我如何弄清楚什么是持有参考?我正在寻找在代码中寻找什么的建议,以及如果有的话在JProfiler中找到它的方法.
我们最近遇到了一个JVM崩溃,留下了gcore命令生成的核心转储文件.我们想看一下文件的内容,找出导致崩溃的确切原因.
使用该jmap命令,您应该能够将核心转储文件转换为hprof文件格式的文件,然后可以使用VisualVM和许多其他工具进行分析.我试过这个并收到错误消息.这是我运行的命令(在发生崩溃的同一个框中,使用相同的JVM):
jmap -dump:format=b,file=dump.hprof /usr/java/jdk1.6.0_16/bin/java core.dump.2878
Run Code Online (Sandbox Code Playgroud)
整个回应是:
> Attaching to core core.dump.8483 from executable /usr/java/jdk1.6.0_16/bin/java, please wait...
> Error attaching to core file: Can't attach to the core file
Run Code Online (Sandbox Code Playgroud)
这不是一个非常有用的错误消息.我想知道它是否是一个权限问题,但是我得到了运行该命令的相同消息,就像运行导致核心转储的JVM一样.我也想知道核心文件是否已损坏,所以我决定用它gdb来查看我是否可以打开核心文件并查看其中的内容.这就是我得到的:
> gdb GNU gdb (GDB) Red Hat Enterprise Linux (7.0.1-37.el5_7.1) License GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for …
当我使用jmap获取有关进程的堆信息时,我得到了这样的错误:
$jmap -heap process_id
Attaching to process ID process_id, please wait...
Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: cannot open binary
file
sun.jvm.hotspot.debugger.DebuggerException: sun.jvm.hotspot.debugger.DebuggerException:
cannot open binary file
Run Code Online (Sandbox Code Playgroud)
操作系统:Ubuntu 14.04
我DebuggerException: Can't attach to the process通过更新解决了另一个错误()kernel.yama.ptrace_scope = 0.