我正在尝试使用 jVisualVM 来监视我正在开发的一些应用程序的长期堆使用情况。目前,它仅在“监控”选项卡下显示过去一小时。有什么方法可以让我查看更长的时间范围,甚至更好,有什么方法可以从头到尾查看它?
如果这不能在 jVisualVM 中完成,是否有替代方案的建议?
我用来jvisualvm检查应用程序中的内存泄漏。当我进行堆转储时,有时会出现几个本应被垃圾收集的对象处于打开状态。
当我对它们执行“显示最近的 GC Root”命令时,它显示根是我定义的一个类,它实现了 Runnable 接口。参考文献被列为(java frame),我知道这与线程有关。当我展开该节点的树时,它会打开并显示<no references>。因此,很明显,这不是我公开的参考资料,而是 Java 内部的东西。
jvisualvm 中列出的 GC Root 对象的类型AnalyticNode extends Node为Node implements Runnable。尽管使用了“框架”一词,但该根对象与 AWT、Swing 或任何重量级用户界面组件没有任何关系。在这种情况下,“框架”一词指的是线程。
那么,Java 是否会在某个地方保留对最后一个 Runnable 的引用,以使其保持打开状态?有什么方法可以告诉 Java 释放此引用,以便可以为我的堆转储正确收集它的垃圾吗?
这里发生了什么?
是否有任何设置可以配置以使 jvisualvm 以人类可读的格式显示内存和其他数字,即以 MB 为单位而不是以字节为单位等。
我确实进行了调查,但没有找到任何结果。
我正在尝试将在本地计算机上运行的 JVisualVM 连接到运行 WildFly 服务器(具体来说,版本 8.1.0)的远程计算机。
我自己没有配置 WildFly 服务器,我也不知道是谁配置的,但我知道我可以通过将浏览器指向以下位置,以管理用户身份从本地计算机登录:
https://[ip address of the remote machine]:9443/console
Run Code Online (Sandbox Code Playgroud)
请注意,它是https,而不是普通的 http ,并且其端口已设置为9443(我认为默认值是 8080 或 9990 或其他... IDK,我在网上看到了很多端口号。有人明确告诉我该 WildFly 服务器禁用了 http)。
我可以通过 SSH 连接到远程计算机。我可以导航到binWildFly 的目录并运行jboss-client.sh. 我必须连接端口9999(我认为默认端口是 9990?)
我将jboss-client.jar(在 下bin/client)复制到本地计算机并从命令行运行 JVisualVM,如下所示:
.\jvisualvm.exe -cp:a C:\[path to]\jboss-client.jar
Run Code Online (Sandbox Code Playgroud)
它启动良好。File > Add Remote Host: 然后我输入IP。OK。我在树中的 Remote 下右键单击它并选择Add JMX Connection。我进入了
service:jmx:http-remoting-jmx://[ip]:9999
Run Code Online (Sandbox Code Playgroud)
我勾选了我想要使用安全凭证并输入了用户名和密码。勾选以保存安全凭证。未选中“不需要 SSL 连接”。打OK。它立即吐出了消息
无法连接到
admin@service:jmx:http-remoting-jmx://[ip]:9999使用service:jmx:http-remoting-jmx://[ip]:9999
我还尝试了端口 …
在 jvisual vm 中,我在 Monitor>Heap 下看到三个属性,我看到 3 个属性描述了内存详细信息,所有属性都具有不同的数字
我不确定实际描绘的尺寸是多少?
I've read that jvisualVm can do tracing profile.
So I ran jvisualVm on my local pc and I see following:

According the materials I read that jvisualVm allows to use tracing profiling on Profiler tab and it must look like:
But as you can see I don't have it. I tried to find button to show that tab but I was not successful.
How can I enable it?
P.S.
According the @Alexandar Petrov answer I tried to add plugun manually …
我从netbeans里面开始tomcat.我想监视tomcat实例上的堆使用情况,以便启动jVisualVM.但是,该过程未列出.有任何想法吗?
这些事情显然需要仔细检查和提供代码,以便彻底分析并提供好的建议.然而,这并不总是可行的,我希望根据我在下面提供的信息为我提供好的提示.
我有一个服务器应用程序,它使用侦听器线程来侦听传入的数据.传入的数据被解释为特定于应用程序的消息,然后这些消息会引发事件.
到目前为止,我对事情的完成方式并没有任何控制权.
因为这是遗留应用程序,所以这些事件之前由同一个侦听器线程(主要是单线程应用程序)处理.事件被发送到黑盒子,然后输出应该写入磁盘的结果.
为了提高吞吐量,我想使用线程池来处理事件.我们的想法是,每次创建事件时,侦听器线程都可以生成新任务,并且线程将负责黑盒调用.最后,我有一个后台线程执行写入磁盘.
只需使用以前的设置和后台编写器,一切正常,吞吐量比以前增加了1.6倍.
当我添加线程池但性能下降.一开始,一切似乎都运行顺利,但过了一段时间,一切都很慢,最后我得到OutOfMemoryExceptions.奇怪的是,当我每次将一个任务添加到池中时打印活动线程的数量(以及有关排队多少任务的信息等等),看起来好像线程池没有问题跟上producer(监听器线程).
使用top -H检查CPU使用情况,它在开始时非常均匀分布,但最后工作线程几乎没有活动,只有监听器线程处于活动状态.但它似乎没有提交更多任务......
任何人都可以假设这些症状的原因吗?您是否认为遗留代码(我无法控制)中的某些内容更可能在添加多个线程时变坏?内存不足问题应该是因为某个队列某处变得太大,但由于线程池几乎从不包含排队任务,所以不可能.
欢迎任何想法.特别是关于如何更有效地诊断这种情况的想法.如何更好地了解我的线程在做什么等等.
谢谢.
在我正在开发的游戏中,我遇到了一些最近的滞后峰值.它是一致的,大约在同一时间发生.使用java profiler jvisualvm我发现它发生在特定线程似乎重启或同时(AWT-EventQueue-0):

除此之外,没有明显的原因,不是堆使用,处理器使用,内存空间或方法使用.它有时会导致ConcurrentModificationException绘制我的对象数组时,但这应该只会发生很大的延迟,而且我的游戏几乎没有密集.
我不记得最近对该项目进行了任何更改,但是我最近进行了以下操作:
我在32位XP上运行Eclipse Indigo-service-1.我的处理器几乎没用过.
我想描述IntelliJ启动的测试应用程序.对于分析,我使用了VisualVm.
我用参数启动了java工具-J-Dorg.netbeans.profiler.separateConsole=true.
我使用VM参数启动了应用程序-Xverify:none,否则如果我开始分析,VisualVM会抛出错误(重新定义失败,错误62)
我想在执行任何重要代码之前分析我的应用程序,所以我尝试设置一个断点并在VisualVM中开始分析.问题是当我在断点处等待时,VisualVm不响应任何交互.我错过了什么吗?
在正常执行(没有调试)中,我的程序等待输入,所以我可以在不调试的情况下对其进行分析.但是如果一个程序没有这样的"等待点"呢?
我的测试应用程序看起来像:
package my.visualvm.example;
import java.util.Scanner;
public class MainClass {
public static void main(String[] args) {
System.out.println("Starting Application: " + MainClass.class.getSimpleName());
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
double value = scanner.nextDouble();
if (value == 0d) {
break;
}
System.out.println(Powa.powaPowa(value));
}
System.out.println("Stopping Application: " + MainClass.class.getSimpleName());
}
}
Run Code Online (Sandbox Code Playgroud)
其他课程:
package my.visualvm.example;
final class Powa {
private Powa() {
}
static double powaPowa(double powa) {
return Math.pow(powa, 2);
}
}
Run Code Online (Sandbox Code Playgroud) jvisualvm ×10
java ×9
visualvm ×4
debugging ×2
memory ×2
performance ×2
eclipse ×1
heap-memory ×1
memory-leaks ×1
monitoring ×1
netbeans ×1
profiling ×1
trace ×1
wildfly ×1