本文将带您了解关于jconsole工具监控java运行情况的新内容,同时我们还将为您解释java监控gc的相关知识,另外,我们还将为您提供关于009-JDK可视化监控工具-JConsole、java.
本文将带您了解关于jconsole工具监控java运行情况的新内容,同时我们还将为您解释java监控gc的相关知识,另外,我们还将为您提供关于009-JDK可视化监控工具-JConsole、java.exe重命名之后无法被 jvisualvm、jconsole监控的问题、Java垃圾回收jconsole分析、java堆栈信息查看,以及JVM性能查看工具-jconsole+jmap的实用信息。
本文目录一览:- jconsole工具监控java运行情况(java监控gc)
- 009-JDK可视化监控工具-JConsole
- java.exe重命名之后无法被 jvisualvm、jconsole监控的问题
- Java垃圾回收jconsole分析
- java堆栈信息查看,以及JVM性能查看工具-jconsole+jmap
jconsole工具监控java运行情况(java监控gc)
jconsole是jdk自带的工具。所以要先安装jdk


-Dcom.sun.management.jmxremote=true
2) 监控的IP地址
-Djava.rmi.server.hostname=192.168.91.166,远程进程所在主机的IP。
3) 监控的端口
-Dcom.sun.management.jmxremote.port=50013,这个端口值可以任意设置,但在之后用Jconsole连接这个远程进程的时候,远程进程中的port一定要和此处的设置一致,并且一定不要和远程进程的服务端口区分开。
4) 是否禁用ssl验证
-Dcom.sun.management.jmxremote.ssl,false为禁用,true为启用。
5) 是否需要用户密码验证
-Dcom.sun.management.jmxremote.authenticate,false为不需要验证,true为需要验证。但我在Win7(32位、64位)中tomcat5.5.23下试着将该选项设置为true,tomcat无法启动,命令行窗口一闪而过。








009-JDK可视化监控工具-JConsole
Console工具在JDK/bin目录下,启动JConsole后,将自动搜索本机运行的jvm进程,不需要jps命令来查询指定。双击其中一个jvm进程即可开始监控,也可使用“远程进程”来连接远程服务器。
进入JConsole主界面,有“概述”、“内存”、“线程”、“类”、“VM摘要”和"Mbean"六个页签:
内存页签相当于jstat命令,用于监视收集器管理的虚拟机内存(Java堆和永久代)变化趋势,还可在详细信息栏观察全部GC执行的时间及次数。
线程页签
最后一个常用页签,VM页签,可清楚的了解显示指定的JVM参数及堆信息。
java.exe重命名之后无法被 jvisualvm、jconsole监控的问题
在windows上面跑java进程,为了注册windows service服务,把java.exe 改成了自己的 haha.exe
突然有一天想用jvisualvm、jconsole查看线程、内存的情况,发现默认的process list里面没有我的haha.exe,而任务管理器里面是有的。
找到一篇 java进程运行时候添加 JMX连接参数
-Dcom.sun.management.jmxremote.port=3333 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false
再一看,已经有了
感谢
http://stackoverflow.com/questions/5031359/jvisualvm-doesnt-list-certain-java-processes
Java垃圾回收jconsole分析
环境:jdk1.8+Mac+Idea
为了便于观察我们设置了虚拟机的参数VM oprions
,-Xms10m -Xmx10m
代码案例1:
新建了一个数组,向里面添加100个OutOfMemory
package com.rumenz;
import java.util.ArrayList;
import java.util.List;
public class OutOfMemory {
public byte []one=new byte[128*1024];
public static void main(String[] args) throws InterruptedException {
Thread.sleep(5000); //延时5秒,方便我们打开`jconsole`
append(100);
}
private static void append(int n) throws InterruptedException {
List<OutOfMemory> list=new ArrayList<>();
for (int i = 0; i < n; i++) {
Thread.sleep(3000); //拖慢添加速度,方便我们观察
list.add(new OutOfMemory());
}
}
}
运行程序后迅速打开jconsole
,并找到自己编写的类,点击进入,选择不安全链接
> jconsole
由于我们使用的是成员变量,所以垃圾回收器一致不能回收内存,所以整个堆的内存趋势是一路上涨.
代码案例2:
package com.rumenz;
import java.util.ArrayList;
import java.util.List;
public class OutOfMemory {
public OutOfMemory() {
byte []one=new byte[128*1024];
}
public static void main(String[] args) throws InterruptedException {
Thread.sleep(5000);
append(100);
}
private static void append(int n) throws InterruptedException {
List<OutOfMemory> list=new ArrayList<>();
for (int i = 0; i < n; i++) {
Thread.sleep(3000);
list.add(new OutOfMemory());
}
}
}
与上面代码的区别我们one
变量有成员变量变成了局部变量. 局部变量在栈上分配内存,当方法结束,栈空间消失,栈上的变量或者引用地址将失效,本案例中one
对象是分配在堆内存上,栈空间的消失导致one
对象无法被使用到,随后就会被垃圾回收掉. 所以本案例的堆内存变量将呈现出折线的效果.
java堆栈信息查看,以及JVM性能查看工具-jconsole+jmap
java-core P487 P515
chapter11,主要讲java的异常,里面很多内容收获良多,之前一直没注意过的。
一,Throwable类获得StackTraceElement ,可进行堆栈跟踪,用法如下:
Throwable t = new Throwable();
StackTraceElement [] frames = t.getStackTrace();
for(StackTraceElement frame :frames)
analyze frame
Map<Thread,StackTraceElement[] map>=Thread.getAllStackTraces();
for(Thread t :map.keySet()){
StackTraceElement[] frames k= map.get(t);
analyze frames
}
示例:
public class TestHeap {
public static void main(String[]args){
Throwable t = new Throwable();
StringWriter out = new StringWriter();
t.printStackTrace(new PrintWriter(out));
String description = out.toString();
System.out.println(description);
System.out.println("——————分割线——————");
StackTraceElement[]frames = t.getStackTrace();
for(StackTraceElement frame:frames){
System.out.println(frame);
}
System.out.println("——————分割线——————");
Map<Thread,StackTraceElement[]> map = Thread.getAllStackTraces();
for(Thread t1:map.keySet()){
StackTraceElement []fram=map.get(t1);
for(StackTraceElement element :fram){
System.out.println("--- "+element.getClassName()+"--- "
+element.getClass().getName()+" ---"+element.getFileName()
+",--- "+element.getMethodName()+",--- "+element.getLineNumber());
}
}
}
}
输出结果:
java.lang.Throwable
at enums.TestHeap.main(TestHeap.java:9)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
——————分割线——————
enums.TestHeap.main(TestHeap.java:9)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:498)
com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
——————分割线——————
--- java.lang.ClassLoader$NativeLibrary--- java.lang.StackTraceElement ---ClassLoader.java,--- load,--- -2
--- java.lang.ClassLoader--- java.lang.StackTraceElement ---ClassLoader.java,--- loadLibrary0,--- 1941
--- java.lang.ClassLoader--- java.lang.StackTraceElement ---ClassLoader.java,--- loadLibrary,--- 1845
--- java.lang.Runtime--- java.lang.StackTraceElement ---Runtime.java,--- loadLibrary0,--- 870
--- java.lang.System--- java.lang.StackTraceElement ---System.java,--- loadLibrary,--- 1122
--- java.net.AbstractPlainSocketImpl$1--- java.lang.StackTraceElement ---AbstractPlainSocketImpl.java,--- run,--- 84
--- java.net.AbstractPlainSocketImpl$1--- java.lang.StackTraceElement ---AbstractPlainSocketImpl.java,--- run,--- 82
--- java.security.AccessController--- java.lang.StackTraceElement ---AccessController.java,--- doPrivileged,--- -2
--- java.net.AbstractPlainSocketImpl--- java.lang.StackTraceElement ---AbstractPlainSocketImpl.java,--- <clinit>,--- 81
--- java.net.ServerSocket--- java.lang.StackTraceElement ---ServerSocket.java,--- setImpl,--- 288
--- java.net.ServerSocket--- java.lang.StackTraceElement ---ServerSocket.java,--- <init>,--- 230
--- java.net.ServerSocket--- java.lang.StackTraceElement ---ServerSocket.java,--- <init>,--- 128
--- com.intellij.rt.execution.application.AppMain$1--- java.lang.StackTraceElement ---AppMain.java,--- run,--- 77
--- java.lang.Thread--- java.lang.StackTraceElement ---Thread.java,--- run,--- 748
--- java.lang.Thread--- java.lang.StackTraceElement ---Thread.java,--- dumpThreads,--- -2
--- java.lang.Thread--- java.lang.StackTraceElement ---Thread.java,--- getAllStackTraces,--- 1610
--- enums.TestHeap--- java.lang.StackTraceElement ---TestHeap.java,--- main,--- 20
--- sun.reflect.NativeMethodAccessorImpl--- java.lang.StackTraceElement ---NativeMethodAccessorImpl.java,--- invoke0,--- -2
--- sun.reflect.NativeMethodAccessorImpl--- java.lang.StackTraceElement ---NativeMethodAccessorImpl.java,--- invoke,--- 62
--- sun.reflect.DelegatingMethodAccessorImpl--- java.lang.StackTraceElement ---DelegatingMethodAccessorImpl.java,--- invoke,--- 43
--- java.lang.reflect.Method--- java.lang.StackTraceElement ---Method.java,--- invoke,--- 498
--- com.intellij.rt.execution.application.AppMain--- java.lang.StackTraceElement ---AppMain.java,--- main,--- 147
--- java.lang.Object--- java.lang.StackTraceElement ---Object.java,--- wait,--- -2
--- java.lang.ref.ReferenceQueue--- java.lang.StackTraceElement ---ReferenceQueue.java,--- remove,--- 143
--- java.lang.ref.ReferenceQueue--- java.lang.StackTraceElement ---ReferenceQueue.java,--- remove,--- 164
--- java.lang.ref.Finalizer$FinalizerThread--- java.lang.StackTraceElement ---Finalizer.java,--- run,--- 209
--- java.lang.Object--- java.lang.StackTraceElement ---Object.java,--- wait,--- -2
--- java.lang.Object--- java.lang.StackTraceElement ---Object.java,--- wait,--- 502
--- java.lang.ref.Reference--- java.lang.StackTraceElement ---Reference.java,--- tryHandlePending,--- 191
--- java.lang.ref.Reference$ReferenceHandler--- java.lang.StackTraceElement ---Reference.java,--- run,--- 153
Process finished with exit code 0
二,jconsole和jmap
之前有了解过java的JVM性能监控工具,但是没有具体执行过,只是有个很模糊的概念。
jconsole原理:
java允许虚拟机中的代理装置跟踪内存消耗,线程使用,类加载等情况。jconsole就是一个展示这种功能的例子:用于显示虚拟机性能的统计结果。
jconsole 用法
>cmd
>jconsole
>jconsole pid
jconsole页面
jmap
可以使用jmap获得一个堆的存储,其中显示了堆中的每个对象,使用如下:
jmap pid
结果如下
C:\Users\user>jmap 3128
Attaching to process ID 3128, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.144-b01
0x0000000053040000 36K C:\Program Files\Java\jdk1.8.0_144\jre\bin\attach.dll
0x0000000053050000 840K C:\Program Files\Java\jdk1.8.0_144\bin\MSVCR100.dll
0x0000000053130000 188K C:\Program Files\Java\jdk1.8.0_144\bin\jli.dll
0x0000000053160000 840K C:\Program Files\Java\jdk1.8.0_144\jre\bin\msvcr100.dll
0x0000000053240000 168K C:\Program Files\Java\jdk1.8.0_144\jre\bin\dcpr.dll
0x00000000532c0000 264K C:\Program Files\Java\jdk1.8.0_144\jre\bin\t2k.dll
0x0000000053390000 52K C:\Program Files\Java\jdk1.8.0_144\jre\bin\management.dll
0x00000000533a0000 68K C:\Program Files\Java\jdk1.8.0_144\jre\bin\nio.dll
0x00000000533c0000 104K C:\Program Files\Java\jdk1.8.0_144\jre\bin\net.dll
0x00000000533e0000 284K C:\Program Files\Java\jdk1.8.0_144\jre\bin\fontmanager.dll
0x0000000053430000 1632K C:\Program Files\Java\jdk1.8.0_144\jre\bin\awt.dll
0x00000000535d0000 88K C:\Program Files\Java\jdk1.8.0_144\jre\bin\zip.dll
0x0000000053620000 164K C:\Program Files\Java\jdk1.8.0_144\jre\bin\java.dll
0x0000000053650000 60K C:\Program Files\Java\jdk1.8.0_144\jre\bin\verify.dll
0x0000000053740000 8820K C:\Program Files\Java\jdk1.8.0_144\jre\bin\server\jvm.dll
0x0000000180000000 804K c:\program files (x86)\kingsoft\kingsoft antivirus\kwsui64.dll
0x00007ff6c24d0000 28K C:\Program Files\Java\jdk1.8.0_144\bin\jconsole.exe
另外,还有一个收费的工具,比较有名也直接,叫jprofiler。
可参考:
https://www.cnblogs.com/AmilyWilly/p/7272160.html?utm_source=itdadao&utm_medium=referral
关于jconsole工具监控java运行情况和java监控gc的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于009-JDK可视化监控工具-JConsole、java.exe重命名之后无法被 jvisualvm、jconsole监控的问题、Java垃圾回收jconsole分析、java堆栈信息查看,以及JVM性能查看工具-jconsole+jmap等相关知识的信息别忘了在本站进行查找喔。
本文标签: