简单地阅读教程和使用JVisualVM,我可以手动将它附加到长时间运行的服务器或Swing应用程序,但我也想将它用于在一秒钟内运行的短程序.
我想我可以在控制台上安装我的程序块,连接JVisualVM,然后按一个键让程序完成它的实际工作.是否有较少的kludgy解决方法?
(这主要是出于我自己的好奇心,使用像JVisualVM而不是-Xprof或HPROF这样的抛光GUI会很不错.
根据我今天的经验,我发现Oracle的Java VisualVM显示cpu使用率占总机器核心的百分比,即使受监控的JVM在操作系统中设置的进程关联性有限.这是在"监视器"选项卡中.
限制受监控的jvm taskset(在linux,Ubuntu上),当处理器允许jvm接近100%利用率时htop,VisualVM中显示的cpu百分比显然等于cpus的总数除以允许的处理器数量.监控jvm.因此,对于这种情况,比例的分辨率是不够的.
您能否确认您在其他操作系统或一般情况下观察到相同的情况?
在显示cpu使用情况时,有没有办法让VisualVM帐户只用于亲和力分配的核心?
根据文档,当应用程序遇到OutOfMemoryException时,可以自动进行堆转储.
OutOfMemoryException过程刚刚从左侧菜单中消失.
这个功能在VisualVM中如何工作?
谢谢.
C:\ work\temp> java -XX:HeapDumpPath = c:/work/temp/file.hprof -XX:+ HeapDumpOnOutOfMemoryError -jar example.jar
我在MAC OSX山狮上遇到了TomEE 1.5.1和VisualVM 1.7.0_09的一个非常奇怪的问题.
TomEE加载一些webapp后.使用VisualVM连接本地TomEE进程需要很长时间,连接后gc按钮被禁用,我无法进行堆转储.VisualVM的日志显示一些错误.
com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file: target process not responding or HotSpot VM not loaded
at sun.tools.attach.BsdVirtualMachine.<init>(BsdVirtualMachine.java:90)
at sun.tools.attach.BsdAttachProvider.attachVirtualMachine(BsdAttachProvider.java:63)
at com.sun.tools.attach.VirtualMachine.attach(VirtualMachine.java:213)
at com.sun.tools.visualvm.attach.AttachModelImpl.getVirtualMachine(AttachModelImpl.java:104)
Caused: java.io.IOException: Unable to open socket file: target process not responding or HotSpot VM not loaded
Run Code Online (Sandbox Code Playgroud)
该.java_pid<pid>文件夹TMP不会创建.
但是如果我在启动它之后和加载任何webapps之前使用VisualVM连接TomEE,那么.java_pid<pid>文件将被创建,VisualVM将立即连接到它,并且堆转储工作.
另一个解决方法是修改catalina.sh以将tools.jar添加到ClassPath并删除openejb javaagent,然后在TomEE完全启动后连接正常工作.
无法在ubuntu机器上重现.
关于停止/重启web-app Tomcat 7.0.26,我有一个非常简单的'Hello world'类型的Web应用程序(Spring 3.2.1,Hibernate 4.1.9)
The following web applications were stopped (reloaded, undeployed), but their
classes from previous runs are still loaded in memory, thus causing a memory
leak (use a profiler to confirm):
/myapp
Run Code Online (Sandbox Code Playgroud)
我采取了以下步骤:启动JVisualVM右键单击Tomcat并选择"堆转储"单击[heapdump]上的"OQL控制台"然后执行此查询:
select x from org.apache.catalina.loader.WebappClassLoader x
Run Code Online (Sandbox Code Playgroud)
找到4个实例:
org.apache.catalina.loader.WebappClassLoader
Run Code Online (Sandbox Code Playgroud)
选中的"已启动"字段为"false"右键单击"this"引用并单击"Show Nearest GC Root"将显示"未找到GC根"的对话框.
我错过了什么?任何帮助将不胜感激.谢谢.
我正在尝试将visualvm连接到我的java应用程序,该应用程序是使用jetty和gradle构建的。该应用程序在本地主机上运行,因此不需要远程连接。但是,每当我尝试连接到应用程序时,我只是连接到 gradle 包装器,因此无法使用 visualvm 分析我的应用程序。在这里搜索和谷歌搜索不足。
到目前为止,我已经尝试将以下行添加到我的 gradle.build 文件中
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9010
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=localhost')
Run Code Online (Sandbox Code Playgroud)
我还尝试从 jetty-jmx.xml 中取消注释以下内容
<Call name="createRegistry" class="java.rmi.registry.LocateRegistry">
<Arg type="java.lang.Integer"><SystemProperty name="jetty.jmxrmiport" default="1099"/></Arg>
<Call name="sleep" class="java.lang.Thread">
<Arg type="java.lang.Integer">1000</Arg>
</Call>
Run Code Online (Sandbox Code Playgroud)
<New id="ConnectorServer" class="org.eclipse.jetty.jmx.ConnectorServer">
<Arg>
<New class="javax.management.remote.JMXServiceURL">
<Arg type="java.lang.String">rmi</Arg>
<Arg type="java.lang.String" />
<Arg type="java.lang.Integer"><SystemProperty name="jetty.jmxrmiport" default="1099"/></Arg>
<Arg type="java.lang.String">/jndi/rmi://<SystemProperty name="jetty.jmxrmihost" default="localhost"/>:<SystemProperty name="jetty.jmxrmiport"default="1099"/>/jmxrmi</Arg>
</New>
</Arg>
<Arg>org.eclipse.jetty.jmx:name=rmiconnectorserver</Arg>
<Call name="start" />
Run Code Online (Sandbox Code Playgroud)
我有一个非常奇怪的问题.我正在开发一个基于Eclipse Equinox的OSGi应用程序; 它是使用OSGi Log Service(Equinox实现)开发的,现在我正在使用Apache Felix OSGi Log Service实现进行测试.
在API /代码方面,一切正常:OSGi日志服务是标准的,所以我可以毫无问题地从Equinox交换到Felix.
但是,我观察到了这种奇怪的行为:我启动了应用程序作为控制台程序,在控制台上查看日志输出,并将其附加到JVisualVM以分析内存使用情况; JVisualVM图显示了一个80 MB的已用堆.
13个小时后,平均堆大小达到220 MB,所以我决定分析堆转储,并按下"堆转储"按钮:在此操作之后,JVisualVM图显示使用的堆为20(分钟)-35 (最大)MB(?!?!),这个值是常数.
"堆转储"操作可以释放近200 mbs吗?如果是,为什么?
我从未在Equinox OSGi Log Service实现中看到这种行为,所以我怀疑Felix Log涉及这个问题......
谢谢
我有一个作为win-service运行的应用程序(使用Apache-Procrun).我想用JVisualVM监视该应用程序.我--openpid <PID>没有成功使用命令行参数,具有讽刺意味的是,旧的JConsole设法连接到该应用程序.

我还检查%TMP%\hsperfdata_username了JVisualVM- 故障排除指南中描述的-Directory的所有问题.一切都很好.
如何让JVisualVM监控我的应用程序?
我首先要说的是,我几乎没有使用 Java VisualVM 的经验。但是,它包含一些开发人员希望看到的信息。当我为我的应用程序打开它时,它包含一个 CPU、内存、类和线程的图表。我想知道是否有办法从命令行获取该信息。因此,如果应用程序在调用时使用了 250 MB 的内存,是否可以编写一个返回 250 MB 的命令?同样与它使用的线程数有关?
我使用的版本是 1.7.0_51。
谢谢。
我正在尝试分析一个远程 tomcat appln,它是我的登台环境。但我无法获得探查器选项卡。尝试谷歌搜索,但我无法在这里找到确切的问题。我的远程和本地 jdk 版本都相同。两者都是 java 8。我使用的是visualvm 1.3.8