问题标签 [visualvm]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - OutOfMemory 异常 - VisualVM 如何通过 heapdump 文件帮助定位内存泄漏?
我一直在我的电脑上本地测试我的 webapp 并使用 VisualVM 监控它。我最近也开始使用 JMeter,因为有人建议我应该做一些负载测试,因为我怀疑我在某处有缓慢的内存泄漏。
今天我的 webapp 终于抛出了OutOfMemory
异常。我设置了HeapDumpOnOutOfMemoryError
andHeapDumpPath
参数以防万一发生这种情况。生成了一个堆转储文件。
我在 VisualVM 中打开了这个文件(java_pid2760.hprof),老实说,我不明白我应该如何查明这个内存泄漏的罪魁祸首......
如何使用 VisualVM 分析堆转储并找到产生内存泄漏的类/实例?
java - 为什么 VisualVM 浮点实例似乎不包含其他类中的浮点数?
我正在查看一个运行应用程序的 java 虚拟机。VisualVM 说 java.lang.Float 只有 102 个实例。
然而,还有一个名为 Vector3 的类,它有 80.000 个实例。所有这些实例似乎都有 3 个浮点字段。
那么,至少应该有80.000 * 3 个浮动实例,对吧?为什么不?
更新: 这导致我提出一个后续问题,发布在此处:VisualVM OQL:如何搜索原始浮点值而不是实际的浮点实例?
java - VisualVM OQL:如何搜索原始浮点值而不是实际的浮点实例?
我想知道如何搜索与某个数字匹配的所有原始浮点值。
当做类似的事情时:
仅找到 Float 类实例。我正在探索的应用程序使用不同的包装器,而不仅仅是使用原始浮点值作为我需要搜索的字段的浮点数(例如向量)。
我将如何做到这一点?
以下返回“未找到浮点错误”:
java - VisualVM OQL 过滤器未按预期工作
我想知道为什么以下 OQL 查询不只是返回最大数量的返回:
事实上,我只返回 1 个随机对象。
这有道理吗?我的堆有 31.000 个对象。
据我所知,上面应该返回所有对象(或返回的限制)。
我的最终目标是能够循环每个对象的字段以检查它是否是浮点数并具有一定的值。
java - VisualVM OQL:找到具有(间接)可达性/引用两个对象 ID 的对象?
我的问题相当简短:
如果我使用 VisualVM 找到两个对象,我可以执行哪种 OQL 查询来查找具有(间接)可达性或对这两个对象的引用的所有对象?
JB更新:
编辑您的代码后,我想出了以下内容:
这会在一段时间后返回一个 pop is not defined 错误,我正在尝试解决这个错误。如果我设法解决这个问题,我可以看看它是否提供了预期的结果。
java - VisualVM 通过防火墙 - RMI 故障排除
很抱歉这个问题必须被问过很多次,但我无法成功解决我的问题。我已经阅读了很多博客、网站、论坛……但在我的情况下没有找到任何解决方案。
案例: 我需要将我盒子上的 VisualVM 连接到远程服务器(tomcats、weblogics)以进行性能/线程/内存监控。这些服务器安装在受防火墙保护的(物理或虚拟)机器上。防火墙中开放了大间隔的端口并且可以使用,但不是所有端口。
测试
- 我已经尝试通过 VisualVM 中的 JMX 直接连接,在服务器启动时在服务器端使用以下 JVM 选项:
/code>
我已经确定了主机名,因为在我的网络中,服务器的主机名和 IP 地址与远程服务器网络中的主机名和 IP 地址不同。
没有成功,VisualVM 似乎总是在寻找未知的服务器。
尝试在服务器端从我的盒子可访问的端口(-p 选项)上启动 jstatd(此端口上的 telnet 有效),但是当使用 jstatd 端口在此主机上启动 visualVM 时,它似乎仍在等待无法访问的东西...... . 与 jps 连接到此远程主机的行为相同。
尝试在网络保护较少的服务器上使用相同的工具,它可以工作。所以我已经看到了我的盒子和服务器之间的连接,它们是在与我指定给 jstatd 的端口不同的端口上完成的。我知道第一次通信(握手)需要这个端口,真正的通信是在其他端口上完成的,但不可预测(例如:60305、55197,...)。不确定我是否非常了解 RMI 的工作原理。
请帮帮我,我快疯了!
java - 使用 OQL/VisualVM 进行 Java 堆分析:找到从间接引用者到被引用者的路径?
我试图找到从一个对象到某个间接推荐人的第一条路径。
以下代码是我想出的:
我在 VisualVM 的 OQL 查询窗口中运行这段 Javascript。
它应该一个一个地遍历referrerObj的所有裁判,直到最大深度,如果还没有找到目标,它应该寻找下一个裁判级别。
然而,由于某种原因,代码似乎在遵循初始推荐人的第一个直接推荐人的可能路径后停止执行。
看起来第二个 while 循环永远不会完成。我没有收到任何错误代码,只是没有返回任何内容。
有谁知道为什么会发生这种情况?如果其他人可以在 VisualVM 中运行它并报告他/她的发现,那就太好了。
谢谢。
java - 分析内存时使用哪个 GC?
我使用 NetBeans 分析器(实际上是一个嵌入式 VisualVM)来监视我的 Java 应用程序的内存消耗。我使用堆视图、幸存生成视图和内存转储来跟踪内存泄漏。
堆视图显示了已用内存的总量,但由于垃圾收集器管理内存的方式,它有点混乱。该图基本上是锯齿形的,因此不是特别可读。有时,我会强制 GC 发生,以便获得更精确的实际内存消耗值。
我想知道:是否有更适合内存分析的垃圾收集器,并且会产生更接近实际内存使用情况的堆图?或者更一般地说,我可以使用哪些 JVM 设置(-XX
选项或其他)来有效地跟踪内存泄漏?
hibernate - web应用程序挂在tomcat 6.0.21/7.0.11中没有线索
我只有一个几分钟后挂起的 Web 应用程序。基本上,这是一个用于构建和预览表单的应用程序,非常定制,经过几分钟的密集用户交互后,该应用程序就停止工作了。这意味着,请求已完成并且永远不会返回回复。
我“有点”迷失了,因为我也没有找到任何关于 tomcat 日志和应用程序日志中挂起的线索。应用程序服务器正在运行,因为我正在使用 lambda/psi-probe 并且可以毫无问题地检查任何其他甚至是麻烦的应用程序(探针本身是另一个 Web 应用程序)。
该应用程序使用了 hibernate,它可以正常工作很长时间,最近,为了提高性能(如果你只使用它,hibernate 会注入很多查询)我已经通过 java.sql 标准 api 引入了本机 sql。我小心不要将两者混合使用,它们仅在 jsp 中使用,首先使用 hibernate 检索一些(少数)对象,然后使用 jdbc 使用一些逻辑。在使用 jdbc 之前关闭 Hibernate 会话。
我已经阅读了一些关于数据库连接问题(我已经检查过几次并且数据库服务器运行正常)、死锁或失控线程的内容,在 VisualVM 中使用 VisualVM 进行了检查。
那么,任何人都可以提供有关发现或捕获挂起的线索吗?可以提供一些线索来使用 VisualVM 捕获或捕获假设的失控线程或死锁吗?后者会启发我,因为我只看到等待和运行的线程。
我在 mac osx 和 linux(开发和预生产机器)上使用 tomcat 6.0.21(我总是尝试 7.0.11 并获得相同的结果)java 1.6
任何想法都会受到欢迎,谢谢
威利
java - Java VisualVM 为 CPU 分析提供了奇怪的结果 - 还有其他人遇到过这个吗?
我编写了这个小(而且效率极低)的类,并想使用 Java VisualVM 对其进行分析。
结果很奇怪。结果完全由对 ConnectionHandler.run() 的调用支配。
(98.2%) sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run()
(1.7%) java.lang.Thread.join(long)
(0%) java.lang.String.equals(Object)
等等。 .
大概有大约一百种方法被分析,其中没有一个是 fib(int)!
令人难以置信的是,我的程序实际上将所有时间都花在了这些方法上。他们似乎是连接到我的 jvm 并做它的事情的分析器。
我究竟做错了什么?
为清楚起见进行了编辑:如果您为 n 传入 45,则此应用程序将运行 20 秒。我最初分析的程序(不是斐波那契计算器)将我的 cpu 上的所有四个内核都固定在 100% 上,而我的分析运行持续时间长达 5 分钟。这些具有相同的结果,并且我的应用程序中的方法在热点方法列表中没有出现高位。
它因运行而异,但 ConnectionHandler.run() 始终位于顶部,通常占分析时间的约 99%。
第二次编辑:我尝试使用采样器,现在得到的结果与 JProfiler 产生的结果一致。这样做的缺点是我没有得到分析附带的堆栈跟踪信息。但对于我的迫切需要,这是极好的。
我在玩游戏时发现的一点是,VisualVM 在分析方法调用时会计算挂钟时间。
在我的具体情况下,我的应用程序有一个主线程,它启动工作线程并立即阻止等待队列上的消息。
这意味着阻塞方法似乎几乎占用了分析器的所有时间,尽管事实上并不是这种方法占用了我的 CPU。
我希望 sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run() 方法也是如此,它很好地完成了它的工作 - 但是当它终止时,它会成为我的应用程序中运行时间最长的方法之一 -重复。