当我从Eclipse Helios启动我的Java应用程序时,我在visualVM上的本地应用程序列表中看到它.但是,我转到Profiler选项卡,我无法通过CPU或内存条件进行配置.
我收到以下消息:"警告!为此JVM启用了类共享.这可能会在分析应用程序时导致问题并最终导致崩溃.请参阅VisualVM故障排除指南以获取更多信息和解决问题的步骤:https:/ /visualvm.dev.java.net/troubleshooting.html#xshare."
在我的应用程序的eclipse启动器中,我将-Xshare:off添加到VM_Arguments但没有成功.使用的JDK:jdk 1.6.0_20 Enviornment:Windows 7,64bit
有什么建议吗?谢谢
我可以附加到万无一失的过程中,但是试图对其进行分析以示抽样:
CPU sampling:
Not available. Failed to create JMX connection to target application. Use 'Add JMX Connection' action to attach to the application.
Memory sampling:
Not available. Failed to read objects in target application. Check the logfile for details (use Help | About | Logfile).
Run Code Online (Sandbox Code Playgroud)
并尝试开始分析显示一个空的错误消息框
是否有任何工具可以查看JVM堆的不同代的对象统计信息?我正在研究潜在的内存泄漏,需要不同代的一些数据.我的用例是在旧代中拍摄对象的快照,等待,然后拍摄另一个快照进行比较.
JVisualVM提供了有关已创建对象的统计信息,但这对我没有多大帮助,因为我没有看到特定对象是否正在被提升或终身比它应该更快.
Jmap提供不同代的统计信息,但不提供基于对象的统计信息.在那个工具中,我只能看到老一代正在成长......
我们开始检查我的应用程序的性能,因为它在一段时间后变慢.我正在使用jvisualvm来观察原因.任何人都可以告诉我如何在Unix中使用jvisualvm,就像在Windows中我们可以通过UI检查它.我们也可以在Unix中拥有相同的视图.
让我的jvisualvm路径是/ Prj/tools/java/bin/jvisualvm
当我使用帮助时,
Usage: /Prj/tools/java/bin/../lib/visualvm//platform7/lib/nbexec {options} arguments
General options:
--help show this help
--jdkhome <path> path to Java(TM) 2 SDK, Standard Edition
-J<jvm_option> pass <jvm_option> to JVM
--cp:p <classpath> prepend <classpath> to classpath
--cp:a <classpath> append <classpath> to classpath
Core options:
--laf <LaF classname> use given LookAndFeel class instead of the default
--fontsize <size> set the base font size of the user interface, in points
--locale <language[:country[:variant]]> use specified locale
--userdir <path> use specified directory to store user settings …Run Code Online (Sandbox Code Playgroud) 当我使用时jVisualVM,我看到两个本地进程:VisualVM本身和我感兴趣的进程让我们调用它ProcessX.当我双击这个VisualVM过程时,一切正常.当我双击时ProcessX,应用程序卡住了,不再对应了.我用eclipse运行我的Java应用程序,和我有一个单机版jVisualVM上的Windows x64盒子.我从"C:\ Program Files\Java\jdk1.7.0_51\bin"运行jVisualVM.在VisualVM菜单中将代理设置为"无代理"对我也没有帮助
我使用的是 jdk64,我的 java 版本是“1.6.0_24”。我的 tomcat 使用 -Xmx7196m 运行,而 jvisualvm 使用 -J-Xms2048m -J-Xmx3072m 运行。我对我的 tomcat java 进程进行了堆转储,我的.hprof文件大小约为 5.5 GB。当我尝试打开这个堆转储时,它只是停留在Loading Heap Dump...屏幕上。
我还查看了 VisualVM 在尝试打开堆转储时的堆消耗情况,但只有 500MB 左右。
注意:我确实看过jvisualvm: Stuck on “Loading Heap Dump” screen question 但它是不同的并且没有解决我的问题。
我可以将VisualVM附加到正在运行的应用程序,然后开始分析。
在我执行手动操作的所有时间中,目标应用程序正在运行,统计信息正在丢失。
如何在应用程序启动的同时完全开始收集统计信息?
更新
用Profile Startup什么方法设置要运行的类?

用于应用程序设置的非常小的单元格说
-agentpath:D:/Apps/visualvm_138/profiler/lib/deployed/jdk16/windows-amd64/profilerinterface.dll=D:\Apps\visualvm_138\profiler\lib,5140
Run Code Online (Sandbox Code Playgroud)
即不包含有关应用程序位置的线索。
我hibernate-jconsole-1.0.7.jar用来监控hibernate.但是每当我运行jar Jconsole时,都会以exception.这是Jconsole输出,
javax.management.InstanceNotFoundException: Hibernate:application=Statistics is not registered.
at org.jboss.mx.server.registry.BasicMBeanRegistry.get(BasicMBeanRegistry.java:523)
at org.jboss.mx.server.MBeanServerImpl.getAttributes(MBeanServerImpl.java:562)
at javax.management.remote.rmi.RMIConnectionImpl.doOperation(Unknown Source)
at javax.management.remote.rmi.RMIConnectionImpl.access$300(Unknown Source)
at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(Unknown Source)
at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(Unknown Source)
at javax.management.remote.rmi.RMIConnectionImpl.getAttributes(Unknown Source)
at sun.reflect.GeneratedMethodAccessor279.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)
at sun.rmi.transport.Transport$2.run(Unknown Source)
at sun.rmi.transport.Transport$2.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.access$400(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler$1.run(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source) …Run Code Online (Sandbox Code Playgroud) 我试图在用户名tomcat6下运行visualvm,因为显然visualvm只能找到以其用户名运行的应用程序。因此,默认情况下,它仅查找以我的用户名运行的应用程序。我已经能够通过jmx将visualvm与tomcat6连接起来,但是缺少检测配置文件的精细粒度。
我尝试以下操作在用户名tomcat6下运行visualvm,但遇到了以下我不理解的错误。
$ sudo -u tomcat6 jvisualvm
No protocol specified
Exception in thread "main" java.awt.AWTError: Can't connect to X11 window server using ':0' as the value of the DISPLAY variable.
at sun.awt.X11GraphicsEnvironment.initDisplay(Native Method)
at sun.awt.X11GraphicsEnvironment.access$200(X11GraphicsEnvironment.java:65)
at sun.awt.X11GraphicsEnvironment$1.run(X11GraphicsEnvironment.java:115)
...
Run Code Online (Sandbox Code Playgroud) 我检查了 Java 应用程序的当前内存行为,我注意到垃圾收集器最初很少运行,但在很长一段时间内它会继续更频繁地运行,即使我没有设置最大内存使用量限制(服务器有 8Gb 的空闲内存)。
最初 GC 每 20 分钟运行一次,15 小时后每分钟运行一次,但应用程序做同样的事情并且 RAM 使用量没有峰值。
继续运行GC,消耗越来越多的CPU,24小时后,CPU使用率为85%,GC每10秒运行一次。
以下是演出截图:
Jprofiler 运行 14 小时

JvisualVM 运行了最后一个小时

JvisualVM - 高 CPU 使用率

为什么即使内存非常低,GC 也会启动?它不应该在这些情况下开始。
可能是什么原因或我应该怎么做来调查这种行为?