我发现JvisualVM中有两个插件,一个是采样器,另一个是探测器.
我还发现他们有类似的用户界面,但结果有很大差异,那么对他们来说有什么不同呢?
为什么他们有很大的不同?
JDK 1.6捆绑了一个名为VisualVM的便捷工具,可以让您检查并运行正在运行的Java进程.一个功能是它可以自动检测本地计算机上正在运行的JVM.大多数都列为"(pid xxxx)",但有些名称和图标,如VisualVM本身和其他类似NetBeans(例如,请参阅此dzone文章中的屏幕截图).
如何将我的应用程序名称和图标注入JVM,以便它在VisualVM的应用程序列表中正确显示?我的应用程序是否需要运行JRE 1.6或者我是否可以在1.5下运行?
我编写了这个小型(并且效率低下)的类,并希望使用Java VisualVM对其进行概要分析.
public class Test {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
br.readLine();
int n = Integer.parseInt(args[0]);
int fib = fib(n);
System.out.println(fib);
}
private static int fib(int n) {
if (n < 2) {
return n;
}
return fib(n-1)+fib(n-2);
}
}
Run Code Online (Sandbox Code Playgroud)
结果很奇怪.调用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并做其事情的探查器.
我究竟做错了什么?
为清晰起见进行了编辑:如果你传入了45个n,那么这个应用程序将运行20个简单的秒.我最初分析的程序(不是斐波纳契计算器)将我的cpu上的所有四个核心固定为100%,并且我正在进行持续长达5分钟的分析运行.这些具有相同的结果,并且我的应用程序中的方法在热点方法列表中没有出现.
它随着运行而变化,但ConnectionHandler.run()始终位于顶部,通常占配置文件时间的~99%.
第二次编辑:我尝试过使用采样器,现在我得到的结果与JProfiler正在生成的结果一致.这样做的缺点是我没有得到分析带来的堆栈跟踪信息.但对于我的迫切需求,这是非常好的.
我在玩游戏时发现的东西是VisualVM在分析它们时计算方法调用的挂钟时间.
在我的特定情况下,我的应用程序有一个主线程,它启动工作线程并立即阻止等待队列上的消息.
这意味着阻塞方法似乎几乎占据了探查器的所有时间,尽管这种方法不是占用了我的CPU.
我希望sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run()方法能够很好地完成它的工作 - 但是当它终止时它会成为我应用程序中运行时间最长的方法之一 - 反复出现.
我是Java的新手,我遇到了将远程主机连接到的问题JVisualVM.
我搜索了互联网,并按照那里提到的所有步骤,但仍然无法解决问题.我遵循的步骤是:
我首先在远程服务器上创建一个jstatd.all.policy文件,然后在远程服务器上启动了jstatd $JAVA_HOME/bin.该文件包含:grant codebase "file:${java.home}/../lib/tools.jar" { permission java.security.AllPermission;};
我开始Jstatd为jstatd -J-Djava.security.policy=jstatd.all.policy
我在远程主机上启动了Java应用程序:
java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9000 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false application_name
Run Code Online (Sandbox Code Playgroud)然后我开始作为JVisualVM我的本地机器的实例,当我添加远程主机时,它已连接但我无法看到任何Java进程.
任何人都可以帮我这个.
谢谢.
我如何配置JUnit测试,优先使用Eclipse集成支持?我正在尝试使用VisualVM,但显然无法完成.
我使用的是Windows 7 x64,Eclipse Indigo,jdk 1.6,jre-j9和JUnit 3(我可以使用v.4)
在"启动ModificationToolkit"期间发生内部错误.
java.lang.NullPointerException
at org.eclipse.jdt.launching.JavaLaunchDelegate.launch(JavaLaunchDelegate.java:101)
at org.eclipse.visualvm.launcher.java.VisualVMJavaDelegate.launch(VisualVMJavaDelegate.java:44)
at org.eclipse.debug.internal.core.LaunchConfiguration.launch(LaunchConfiguration.java:858)
at org.eclipse.debug.internal.core.LaunchConfiguration.launch(LaunchConfiguration.java:707)
at org.eclipse.debug.internal.ui.DebugUIPlugin.buildAndLaunch(DebugUIPlugin.java:1018)
at org.eclipse.debug.internal.ui.DebugUIPlugin$8.run(DebugUIPlugin.java:1222)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:53)
Run Code Online (Sandbox Code Playgroud)
我在互联网上看到了这一点,但似乎没有解决方案.我的项目在不使用此插件的情况下启动正常,此问题也会影响我的其他项目(如果我尝试使用VisualVM启动).
使用此版本的VisualVM - http://visualvm.java.net/eclipse-launcher.html
我正在运行VisualVM来分析一个简单的Java应用程序.当我双击分析窗格中的方法(希望获得更多详细信息)时,它会显示"没有为类找到源......".我知道消息来源在哪里.我如何告诉VisualVM在哪里看?
我有两个远程服务器,都运行最近的CentOS,运行最近的Tomcat6,最近的JDK6和VisualVM 1.3.2.
ssh -X转发在一台服务器上运行 - 我可以从该机器启动VisualVM,它可以转发并运行正常 - 我看到在远程机器上运行的所有JVM进程都是VVM中的"本地".
在第二台机器上进行ssh -X转发 - 然后运行VisualVM - 在其中显示一个带有VVM的X窗口,但它只显示一个"本地"进程 - VisualVM本身 - 而右下角有一个弹跳进度条,显示"计算描述",它永远不会结束.
我在任何地方都找不到任何相关的东西 - 有人曾经打过这个吗?我如何通过这个?
在Ubuntu和Debian中,工具visualvm都不是OpenJDK 7软件包的一部分.它是Oracle JDK 7的一部分,似乎是GPL许可的.虽然在Ubuntu中它可以安装一个单独的包,但Debian中不存在这样的包.
为什么它不是OpenJDK包的一部分?
我从webupd8team/javaPPA 安装了Oracle JDK ,然后安装了该visualvm软件包.启动时visualvm,我收到以下错误消息:
[beni:~]$ visualvm
No jdkhome found
Run Code Online (Sandbox Code Playgroud)
我$JAVA_HOME的设置正确/usr/lib/jvm/java-7-oracle.
此外,当从属性集开始visualvm时jdkhome,我得到相同的错误:
[beni:~]$ visualvm --jdkhome $JAVA_HOME
No jdkhome found
Run Code Online (Sandbox Code Playgroud)