一位同事告诉我,可以在生产中随时使用JConsole查看EhCache缓存的内容.我想知道:这是真的,如果是这样的话/为什么?更重要的是,只是窥视缓存的内容导致应用程序的性能问题(比如启动分析器)?
我正在尝试运行java进程并使用jconsole启用远程连接.我将以下参数添加到命令行(在主类之前):
-Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote. authenticate=false
Run Code Online (Sandbox Code Playgroud)
使用netstat,我看到jvm正在侦听端口9999:
tcp6 0 0 :::9999 :::* LISTEN 16971/java
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试连接jconsole localhost:9999时,我收到一条错误消息,指出连接失败.
任何的想法?
那真是令人尴尬......
我开始使用Eclipse Memory Analyzer来查找Windows机器上的Java内存泄漏.第1步是获取堆转储文件.为此,我从Eclipse中启动Java(javaw.exe)进程并使用jconsole连接到它.然后在jconsole MBeans选项卡上单击dumpHeap按钮.我第一次这样做时,我看到一个弹出窗口说它创建了堆转储文件,但没有给出它的名称或位置.现在每当我连接到不同的javaw.exe进程时再次执行dumpHeap时,jconsole说:
Problem invoking dumpHeap : java.io.IOException: File exists
Run Code Online (Sandbox Code Playgroud)
当然不会给出它的名字或路径.它可能在哪里?
我搜索了我的C:驱动器(使用cygwin命令行工具)来查找包含"hprof"或"java_pid"或"heapdump"的文件,但没有找到任何合理的信息.我甚至使用Windows搜索来查找我的Eclipse工作区中在最后一天发生了变化的所有文件.
我正在使用Sun Java 1.6 JVM,并且没有设置-XX:HeapDumpPath.
更新(2010年4月28日):我的原始堆文件位置必须由jconsole确定,我从该工具触发了堆转储.JVM的堆转储位置必须仅应用于它触发的堆转储(例如,在OutOfMemoryException上).
Matt B建议使用jvisualvm很好地解决了我的问题,指向一个更有用的旧jconsole替代品.它有一个很好的内存分析器,可以显示哪些类型的对象数量最多并且占用的内存最多.它有一个监视器,显示实际内存使用情况.当你要求它进行堆转储时,它甚至会告诉你文件名!Eclipse Memory Analyzer为您提供完整的详细信息.
如果在启动JVM时设置"com.sun.management.jmxremote"系统属性,则可以运行jconsole或visualvm并连接到该本地mBeanServer.我想做他们正在做的同样的事情,但无法弄清楚如何做.
是否有可用于标识本地运行的JVM的服务URL?
我知道我可以通过在特定端口上设置jmxmp或rmi侦听器然后连接到该端口来实现这一点,但我不想这样做,因为这意味着我必须管理端口并知道哪个端口到哪个端口jvm(我们在同一台服务器上运行多个jvms).
尝试将jconsole连接到远程服务器.
我把它添加到我的catalina.sh:
export JAVA_OPTS="-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=9005 \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=false \
-Djava.rmi.server.hostname=xx.xx.xx.xx"
Run Code Online (Sandbox Code Playgroud)
catalina.out显示:
Error: Exception thrown by the agent : java.net.MalformedURLException: Local host name unknown: java.net.UnknownHostException: myhostname: myhostname
Run Code Online (Sandbox Code Playgroud)
不确定为什么它会在错误消息中重复我的主机名?
顺便说一句,因为我将身份验证设置为false,在jconsole应用程序中,我是否将用户名/密码留空或是用于登录服务器?
我正在努力配置 hibernate jmx,以便通过 hibernate jconsole 插件获得一些指标。
其实我是按照hibernate jconsole插件官网的配置来的:http : //hibernate-jcons.sourceforge.net/usage.html#pre-requisites
但它不起作用所以我在互联网上搜索了几个小时,测试了一些东西。我发现的唯一与我的问题相关的事情是:如何在 Spring 3.0 应用程序中配置 Hibernate 统计信息?
但它仍然不起作用。我需要你的帮助。
这是配置:
@PersistenceContext(unitName = DomainConstants.JPA_PU_BACKEND)
private EntityManager em;
@Bean(name="jmxExporter")
public MBeanExporter jmxExporter() throws MalformedObjectNameException, InstanceAlreadyExistsException, MBeanRegistrationException, NotCompliantMBeanException {
MBeanExporter exporter = new MBeanExporter();
Map<String, Object> beans = new HashMap<String, Object>();
beans.put("Hibernate:application=Statistics", "hibernateStatisticsBean");
MBeanServerFactoryBean serverFactory = new MBeanServerFactoryBean();
serverFactory.setLocateExistingServerIfPossible(true);
// --- new1
MBeanServer MBeanServer = serverFactory.getObject();
exporter.setServer(MBeanServer);
exporter.setRegistrationPolicy(RegistrationPolicy.REPLACE_EXISTING);
// end -- new1
exporter.setBeans(beans);
return exporter;
}
@Bean(name="hibernateStatisticsBean")
public StatisticsService hibernateStatisticsBean() {
StatisticsService service …Run Code Online (Sandbox Code Playgroud) 我试图从我的机器运行jconsole但我找不到.sh的位置.我试过在不同的目录中找到它并将JAVA_HOME设置为jdk.
$which java
/usr/bin/java
$java -version
java version "1.7.0_51"
OpenJDK Runtime Environment (rhel-2.4.4.1.el6_5-x86_64 u51-b02)
OpenJDK 64-Bit Server VM (build 24.45-b08, mixed mode)
$whereis java
java: /usr/bin/java /etc/java /usr/lib/java /usr/share/java /usr/share/man/man1/java.1.gz
Run Code Online (Sandbox Code Playgroud)
我查了/ usr/lib/jvm,我找到了
drwxr-xr-x. 3 root root 4096 Apr 23 2013 java-1.5.0-gcj-1.5.0.0
drwxr-xr-x. 3 root root 4096 Jan 27 2014 java-1.6.0-openjdk-1.6.0.0.x86_64
drwxr-xr-x. 3 root root 4096 Feb 5 2014 java-1.7.0-openjdk-1.7.0.51.x86_64
lrwxrwxrwx. 1 root root 21 Feb 5 2014 jre -> /etc/alternatives/jre
lrwxrwxrwx. 1 root root 27 Apr 23 2013 jre-1.5.0 -> …Run Code Online (Sandbox Code Playgroud) 我有一个Wildfly ASJMS 设置,我正在使用 Jconsole 监视它,并注意到在我什至在我的会话上创建会话之前Consumer或Producer线程数稳步增加之前,我以前Wildfly 9 final出于相同目的使用它,它的线程使用率即使在使用,但它有一个内存泄漏促使我升级。
在Jconsole我可以看到:
Thread-2(ActiveMQ-client-global-threads-3258368)
Thread-4(ActiveMQ-client-global-threads-3258368)
Thread-5(ActiveMQ-client-global-threads-3258368)
Thread-6(ActiveMQ-client-global-threads-3258368)
.
.
.
Thread-16(ActiveMQ-client-global-threads-3258368)
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?是否有我可以更改的设置导致这些线程产生,是否有更多信息可以Jconsole帮助我解决这个问题?
我正在尝试使用 java 8 jre (服务器地址:192.168.10.3)对我的 tomcat 9 进行 jconsole 远程监控。在 tomcat9w 中我有这个 java 选项:
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=5000
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.local.only=false
-Djava.rmi.server.hostname=192.168.10.3
Run Code Online (Sandbox Code Playgroud)
防火墙已关闭。
带 -debug 的 Jconsole 向我展示了这一点:
java.lang.SecurityException: Expecting a sun.rmi.server.UnicastRef2 remote reference in stub!
at java.management.rmi/javax.management.remote.rmi.RMIConnector.checkStub(RMIConnector.java:1787)
at java.management.rmi/javax.management.remote.rmi.RMIConnector.connect(RMIConnector.java:310)
at jdk.jconsole/sun.tools.jconsole.ProxyClient.tryConnect(ProxyClient.java:355)
at jdk.jconsole/sun.tools.jconsole.ProxyClient.connect(ProxyClient.java:313)
at jdk.jconsole/sun.tools.jconsole.VMPanel$2.run(VMPanel.java:296)
java.lang.reflect.UndeclaredThrowableException
at com.sun.proxy.$Proxy8.getTotalMemorySize(Unknown Source)
at jdk.jconsole/sun.tools.jconsole.SummaryTab.formatSummary(SummaryTab.java:261)
at jdk.jconsole/sun.tools.jconsole.SummaryTab$1.doInBackground(SummaryTab.java:87)
at jdk.jconsole/sun.tools.jconsole.SummaryTab$1.doInBackground(SummaryTab.java:85)
at java.desktop/javax.swing.SwingWorker$1.call(SwingWorker.java:304)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.desktop/javax.swing.SwingWorker.run(SwingWorker.java:343)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
at java.base/java.lang.Thread.run(Thread.java:832)
Caused by: javax.management.AttributeNotFoundException: No such attribute: TotalMemorySize
at com.sun.jmx.mbeanserver.PerInterface.getAttribute(Unknown Source)
at com.sun.jmx.mbeanserver.MBeanSupport.getAttribute(Unknown Source)
at …Run Code Online (Sandbox Code Playgroud) 我正在使用JConsole访问我的应用程序MBean,并使用password.properties文件.但根据Sun的规范,此文件仅包含明文格式的密码.
com.sun.management.jmxremote.password.file=<someLocation>/password.properties
现在我想加密密码并将其用于JConsole的JMX用户身份验证(Remote部分中的用户名和密码字段).我可以使用任何预定义的加密逻辑或我自己的加密算法.
有没有人知道任何这样的拦截将明文密码更改为加密密码,以便JMX Framework也知道加密密码?
我当前的密码文件:
guest guest
admin admin
Run Code Online (Sandbox Code Playgroud)
使用加密它应该看起来像:
guest ENC(RjqpRYbAOwbAfAEDBdHJ7Q4l/GO5IoJidZctNT5oG64=)
admin ENC(psg3EnDei6fVRuqHeLwOqNTgIWkwQTjI2+u2O7MXXWc=)
Run Code Online (Sandbox Code Playgroud)