使用 VisualMV 等工具进行分析时,程序应该按什么顺序运行?我想要分析的程序运行得相对较快,并且不等待用户关闭它。我似乎无法真正快速启动程序、切换到 VisualVM 并启动分析过程,而无需先终止程序。
我所做的就是在程序中添加一行额外的代码,提示用户按 Enter 开始。因此,我启动我的程序,当它显示“按 Enter”时,我进入 VisualVM,找到正确的进程,进入分析选项卡并单击 CPU。VisualVM 完成设置后,我将返回到我的程序并按 Enter 启动它。这是正确的吗?或者应该以不同的顺序完成?
显然,分析仅适用于当时运行的程序部分,对吧?
是否有任何设置可以配置以使 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
我还尝试了端口 …
我已将tomcat(分配了8GB 堆内存)连接到visualvm。在visualvm中,在选项卡sampler -> memory下,总分配内存显示为17GB(18470717672字节)。但是只分配了 8GB 给 tomcat 堆内存。在监视器选项卡中,它正确地将分配的堆大小显示为 8GB(8589934592 字节)。请澄清为什么总分配内存在采样器选项卡中显示为 17GB?
如果在启动JVM时设置"com.sun.management.jmxremote"系统属性,则可以运行jconsole或visualvm并连接到该本地mBeanServer.我想做他们正在做的同样的事情,但无法弄清楚如何做.
是否有可用于标识本地运行的JVM的服务URL?
我知道我可以通过在特定端口上设置jmxmp或rmi侦听器然后连接到该端口来实现这一点,但我不想这样做,因为这意味着我必须管理端口并知道哪个端口到哪个端口jvm(我们在同一台服务器上运行多个jvms).
这些事情显然需要仔细检查和提供代码,以便彻底分析并提供好的建议.然而,这并不总是可行的,我希望根据我在下面提供的信息为我提供好的提示.
我有一个服务器应用程序,它使用侦听器线程来侦听传入的数据.传入的数据被解释为特定于应用程序的消息,然后这些消息会引发事件.
到目前为止,我对事情的完成方式并没有任何控制权.
因为这是遗留应用程序,所以这些事件之前由同一个侦听器线程(主要是单线程应用程序)处理.事件被发送到黑盒子,然后输出应该写入磁盘的结果.
为了提高吞吐量,我想使用线程池来处理事件.我们的想法是,每次创建事件时,侦听器线程都可以生成新任务,并且线程将负责黑盒调用.最后,我有一个后台线程执行写入磁盘.
只需使用以前的设置和后台编写器,一切正常,吞吐量比以前增加了1.6倍.
当我添加线程池但性能下降.一开始,一切似乎都运行顺利,但过了一段时间,一切都很慢,最后我得到OutOfMemoryExceptions.奇怪的是,当我每次将一个任务添加到池中时打印活动线程的数量(以及有关排队多少任务的信息等等),看起来好像线程池没有问题跟上producer(监听器线程).
使用top -H检查CPU使用情况,它在开始时非常均匀分布,但最后工作线程几乎没有活动,只有监听器线程处于活动状态.但它似乎没有提交更多任务......
任何人都可以假设这些症状的原因吗?您是否认为遗留代码(我无法控制)中的某些内容更可能在添加多个线程时变坏?内存不足问题应该是因为某个队列某处变得太大,但由于线程池几乎从不包含排队任务,所以不可能.
欢迎任何想法.特别是关于如何更有效地诊断这种情况的想法.如何更好地了解我的线程在做什么等等.
谢谢.
如何在VisualVM中更改应用程序名称?我有多个应用程序,从我的IDE开始,但很难区分它们,名称是相同的,唯一的区别是PID.所以我想给他们有意义的名字,但菜单项"重命名.."被禁用.如何重命名应用程序?在我看来,重命名只能在快照上进行 - > 快照的描述

我在我的本地Windows机器上使用Java VisualVM来监视我的远程服务器(Linux).除了" Visual GC " 之外,我能够在Bisual VM中获取所有统计数据.它显示"此JVM不支持".我用谷歌搜索它,发现它可能是因为jstatd没有运行和连接.所以执行了" jstatd -J-Djava.security.policy =/tmp/tools.policy ".它显示了一个ip" 175.41.139.225 ".我无法理解为什么它试图连接到这个IP.它不是我的远程机器的ip,也不是我的本地机器的ip.
[root@shipping_pt mail]# jstatd -J-Djava.security.policy=/tmp/tools.policy
Could not contact registry
Connection refused to host: 175.41.139.225; nested exception is:
java.net.ConnectException: Connection refused
java.rmi.ConnectException: Connection refused to host: 175.41.139.225; nested exception is:
java.net.ConnectException: Connection refused
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)
at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:340)
at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
at java.rmi.Naming.rebind(Naming.java:177)
at sun.tools.jstatd.Jstatd.bind(Jstatd.java:57)
at sun.tools.jstatd.Jstatd.bind(Jstatd.java:66)
at sun.tools.jstatd.Jstatd.main(Jstatd.java:143)
Caused by: java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:327)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:193)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:180)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:384)
at …Run Code Online (Sandbox Code Playgroud) 当我在VisualVM 1.3.8中单击“堆转储”按钮时,出现以下错误:
无法为user @ localhost:9090进行堆转储
我在某处缺少设置吗?
编辑#1
环境是:
选项有:
export CATALINA_OPTS="-Dcom.sun.management.jmxremote=true\
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=true \
-Djava.rmi.server.hostname=x.x.x.x \
-Dcom.sun.management.jmxremote.password.file=/file_to_pwd \
-Dcom.sun.management.jmxremote.access.file=/file_to_access \
-Xms1256m \
-Xmx1256m \
-XX:PermSize=768m \
-XX:MaxPermSize=768m \
-XX:+CMSClassUnloadingEnabled \
-Dfile.encoding=UTF-8 \
-XX:+CMSClassUnloadingEnabled \
-XX:+UseConcMarkSweepGC \
-server"
Run Code Online (Sandbox Code Playgroud)
编辑#2
这是JMX的侦听器。
<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="9090" rmiServerPortPlatform="9091" />
Run Code Online (Sandbox Code Playgroud) 我想描述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)