问题标签 [jvisualvm]
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 - Java 线程监控\分析\测量
我熟悉
http://download.oracle.com/javase/6/docs/api/java/lang/management/ThreadMXBean.html
我想测试\配置文件\测量线程获得了多少 CPU 时间。我将以下内容添加到我的线程构造函数中:
然后当线程完成它的执行时,我执行:
但是对于我的大多数线程,我绝对确定它们确实占用了 CPU,我得到的执行时间为零(execTime == 0)。
我如何测量我的线程?上述过程中可能存在什么问题?
先谢谢了。
java - Java 内存使用/线程池性能问题
这些事情显然需要仔细检查和代码可用性来彻底分析并给出好的建议。然而,这并不总是可行的,我希望可以根据我在下面提供的信息为我提供好的提示。
我有一个使用侦听器线程来侦听传入数据的服务器应用程序。传入的数据被解释为特定于应用程序的消息,然后这些消息会引发事件。
到目前为止,我对事情的完成方式并没有任何控制权。
因为这是一个遗留应用程序,所以这些事件以前由同一个侦听器线程(主要是单线程应用程序)处理。这些事件被发送到一个黑盒,并产生一个应该写入磁盘的结果。
为了提高吞吐量,我想使用一个线程池来处理这些事件。这个想法是侦听器线程可以在每次创建事件时生成新任务,并且线程将负责黑盒调用。最后,我有一个后台线程执行写入磁盘。
仅使用以前的设置和后台编写器,一切正常,吞吐量是以前的约 1.6 倍。
当我添加线程池时,性能会下降。一开始,一切似乎都运行顺利,但过了一会儿,一切都变得非常缓慢,最后我得到了 OutOfMemoryExceptions。奇怪的是,当我每次将任务添加到池中时打印活动线程的数量(以及有关排队的任务数量等信息)时,看起来线程池跟上没有问题生产者(监听线程)。
使用 top -H 检查 CPU 使用情况,一开始它分布得很均匀,但最后工作线程几乎没有活动,只有侦听器线程处于活动状态。然而它似乎并没有提交更多的任务......
任何人都可以假设这些症状的原因吗?您是否认为遗留代码中的某些内容(我无法控制)更有可能在添加多个线程时变坏?内存不足的问题应该是因为某处的某些队列变得太大,但是由于线程池几乎从不包含排队的任务,所以不可能是这样。
欢迎任何想法。特别是关于如何更有效地诊断这种情况的想法。我怎样才能更好地了解我的线程正在做什么等。
谢谢。
java - jvisualvm 不会从 CPU 分析中排除某些方法
我正在尝试使用 jvisualvm 分析应用程序。该应用程序包含一个循环,其中从数据库加载数据,然后对数据执行一些复杂的计算。处理完一组数据后,加载并计算下一组数据。
当我启动我的应用程序并附加 jvisualvm 时,我在 CPU 分析页面上设置了一个过滤器(“Sart profiling from classes”和“Do not profile classes”),因为我对与数据库访问相关的任何内容都不感兴趣,并且其他输入/输出相关的东西。
过滤器工作 - 几乎。我的问题是,分析器报告大部分时间都花在了sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run()
,即使 sun.* 被输入到“不分析类”过滤器中。这是 sun.* 中唯一出现在我的分析结果中的方法。
有没有人见过这个并且知道如何摆脱它?问题是,所有其他方法在“自我时间”列中仅显示少量(<1%),大多数显示为 0%。
使用的 jvisualvm 版本是 1.3.2。
在此先感谢,阿克塞尔
java - 用于 cpu 分析的过滤类在 Java VisualVM 中是否有效?
我想过滤在 Java VisualVm(版本 1.7.0 b110325)中哪些类被 cpu-profiled。为此,我尝试在 Profiler -> Settings -> CPU-Settings 下为我的测试包设置“ Profile only classes ”,但没有效果。然后我尝试通过将所有 java.* 和 sun.* 类设置在“不要配置类”中来摆脱它们,这也没有效果。
这只是一个错误吗?还是我错过了什么?有解决方法吗?我的意思是:
- 为更好的分析器付费
- 手动采样(请参阅可以使用分析器,但为什么不直接停止程序?)
- 切换到调用树视图,这并不好,因为只有 Profiler 视图给了我每个方法消耗的 CPU 百分比。
我想这样做主要是为了获得每个方法消耗的 CPU 的一半正确百分比。为此,我需要摆脱烦人的测量,例如sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run()
(大约 70%)。许多用户似乎有这个问题,见例如
java - 为什么是锯齿形图形?
当我使用 NetBeans 运行下面提到的代码时,分配的堆大小图类似于锯齿形状。我附上了 JVisualVM 的屏幕截图,它以锯齿形显示了堆分配图。该程序是一个打印“Hello, World!”的简单无限循环。进入控制台。
谁能解释已用堆图形形状背后的原因?
PS:即使我在不使用 NetBeans 的情况下运行它也会发生这种情况,所以它很可能与 NetBeans 无关......
java - 在 VMWare 下在 Windows 上运行 visualvm 需要帮助
我正在 VMWare Fusion 3.x (OSX) 内运行的 Windows 7 x64 上进行一些 Java 开发。我已经安装了 JDK6(更新 26),将 JAVA_HOME 设置为路径(没有尾部斜杠),然后重新启动了我的命令提示符。
我可以成功启动程序。在启动期间,它会运行校准,然后失败并出现以下错误:
“无法创建目录\VMWare-host\Shared Folders\.nbprofiler”(斜线后没有空格,但标记隐藏了句点)
我可以单击继续,但是当我在程序中时,我无法进行 CPU 或内存分析。我抛出了一个类似的错误框:
“检索目标 JVM 保存的校准数据时出错:无法创建...(与之前相同)”
曾几何时,我通过在启动期间传递 --userdir 标志和 -J-Dnbprofiler.home 来完成这项工作,但是这个技巧不再起作用了。
(完整的命令是: jvisualvm --userdir c:\Users\myname -J-Dnbprofiler.home=c:\Users\myname )
如何强制 jvisualvm 将其校准数据保存在“真实”驱动器而不是 vmware 网络驱动器上并使其正常工作?
java - JVisualVM 内存采样:不支持远程应用程序
我正在尝试在 Red Hat Linux 中使用 JVisualVM 监控远程 tomcat 进程。CPU 采样工作正常,但内存采样选项卡被禁用。它说“内存采样:不可用。不支持远程应用程序”。
进程的命令行参数:
JVisualVm 详细信息:
有什么我想念的吗。我对这一切都很陌生。
java - Tomcat org.apache.catalina.connector.requestfacade.getsession() 占用超过 44.7% CPU 资源
我已经构建了一个无状态的 java servlet Web 应用程序,要求每秒至少接受 5000 个事务(具有 150 个并发线程)。我将 ehcache 与 SQL Server 2005 一起使用,以避免写入慢速硬盘。
在性能测试中(使用 Jmeter 150 线程),我每秒只能获得大约 2800 个事务(不到预期的一半)。当我在 JVisualVM 中使用采样器时,我注意到:
知道 requestfacade.getsession() 在做什么,有没有办法加快速度?虽然我必须优化我的代码,但我仍然需要弄清楚上面的行做了什么,否则每秒 5000 次几乎是不可能的。
Tomcat 配置:
- 单个 Tomcat 实例 (6.0.23) - 使用 Connectir 执行器,最大线程数为 150
服务器配置:
-Windows 2008
-至强四核
-8GB 内存
-1TB 突袭 5 硬盘
任何帮助都必须感谢!
java - 当我在 jvisualvm 中转储堆时,如何删除对 Runnable 的“Java 框架”GC 根引用?
我jvisualvm
用来检查我的应用程序中的内存泄漏。当我进行堆转储时,有时会有几个对象保持打开状态,这些对象应该被垃圾收集。
当我对它们执行“显示最近的 GC 根”命令时,它显示根是我定义的实现接口 Runnable 的类。引用列为(java frame)
,我知道这与线程有关。当我展开该节点的树时,它会打开并显示<no references>
. 所以很明显这不是我保持开放的参考,而是Java内部的东西。
jvisualvm 中列出的 GC Root 对象的类型AnalyticNode extends Node
为Node implements Runnable
. 这个根对象与 AWT、Swing 或任何重量级用户界面组件没有任何关系,尽管使用了“框架”这个词。在这种情况下,“框架”一词指的是线程。
那么 Java 是否保留了对最后一个 Runnable 的引用,该引用会保持这个打开状态?有什么方法可以告诉 Java 释放这个引用,以便可以为我的堆转储正确收集垃圾?
这里发生了什么?