文章目錄
基於JVisualVM的可視化監控
監控本地Tomcat
- 路徑:\Java\jdk1.8.0_171\bin\jvisualvm.exe
- 打開之後更新插件 地址
監控遠程Tomcat
-
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=port -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.net.preferIPv4Stack=true -Djava.rmi.server.hostname=ip地址"
-
jar包啓動添加參數
nohup java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=port -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.net.preferIPv4Stack=true -Djava.rmi.server.hostname=ip地址 -jar XXXX.jar &
基於Btrace的監控調試
Btrace安裝入門
-
Btrace可以動態地向目標應用程序地字節碼注入追蹤代碼
-
設置環境變量
-
- jps -l
- btrace pid 類名.java
-
package com.imooc.monitor_tuning.chapter4; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.imooc.monitor_tuning.chapter2.User; @RestController @RequestMapping("/ch4") public class Ch4Controller { @RequestMapping("/arg1") public String arg1(@RequestParam("name")String name) { return "hello,"+name; } @RequestMapping("/arg2") public User arg2(User user) { return user; } @RequestMapping("/constructor") public User constructor(User user) { return user; } @RequestMapping("/same1") public String same(@RequestParam("name")String name) { return "hello,"+name; } @RequestMapping("/same2") public String same(@RequestParam("name")String name,@RequestParam("id")int id) { return "hello,"+name+","+id; } @RequestMapping("/exception") public String exception() { try { System.out.println("start..."); System.out.println(1/0); System.out.println("end..."); }catch(Exception e) { // } return "success"; } }
Btrace使用詳解
攔截方法
-
普通方法:@OnMethod(clazz="",method="")
package com.imooc.monitor_tuning.chapter4; import com.sun.btrace.AnyType; import com.sun.btrace.BTraceUtils; import com.sun.btrace.annotations.BTrace; import com.sun.btrace.annotations.Kind; import com.sun.btrace.annotations.Location; import com.sun.btrace.annotations.OnMethod; import com.sun.btrace.annotations.ProbeClassName; import com.sun.btrace.annotations.ProbeMethodName; @BTrace public class PrintArgSimple { @OnMethod( clazz="com.imooc.monitor_tuning.chapter4.Ch4Controller", method="arg1", location=@Location(Kind.ENTRY) ) public static void anyRead(@ProbeClassName String pcn, @ProbeMethodName String pmn, AnyType[] args) { BTraceUtils.printArray(args); BTraceUtils.println(pcn+","+pmn); BTraceUtils.println(); } }
-
構造方法:@OnMethod(clazz="",method="")
package com.imooc.monitor_tuning.chapter4; import com.sun.btrace.AnyType; import com.sun.btrace.BTraceUtils; import com.sun.btrace.annotations.BTrace; import com.sun.btrace.annotations.OnMethod; import com.sun.btrace.annotations.ProbeClassName; import com.sun.btrace.annotations.ProbeMethodName; @BTrace public class PrintConstructor { @OnMethod( clazz="com.imooc.monitor_tuning.chapter2.User", method="<init>" ) public static void anyRead(@ProbeClassName String pcn, @ProbeMethodName String pmn, AnyType[] args) { BTraceUtils.println(pcn+","+pmn); BTraceUtils.printArray(args); BTraceUtils.println(); } }
-
同名方法:用參數類型來區分
package com.imooc.monitor_tuning.chapter4; import com.sun.btrace.BTraceUtils; import com.sun.btrace.annotations.BTrace; import com.sun.btrace.annotations.OnMethod; import com.sun.btrace.annotations.ProbeClassName; import com.sun.btrace.annotations.ProbeMethodName; @BTrace public class PrintSame { @OnMethod( clazz="com.imooc.monitor_tuning.chapter4.Ch4Controller", //具體到類 method="same"//具體到類中的方法 ) public static void anyRead(@ProbeClassName String pcn, @ProbeMethodName String pmn, String name) { BTraceUtils.println(pcn+","+pmn + "," + name); BTraceUtils.println(); } //或者 public static void anyRead(@ProbeClassName String pcn, @ProbeMethodName String pmn, String name,int id) {//攔截有String,int參數類型的same方法 BTraceUtils.println(pcn+","+pmn + "," + name); BTraceUtils.println(); } }
攔截時機
-
入口,默認值:Kind.ENTRY
-
返回:Kind.RETURN
package com.imooc.monitor_tuning.chapter4; import com.sun.btrace.AnyType; import com.sun.btrace.BTraceUtils; import com.sun.btrace.annotations.BTrace; import com.sun.btrace.annotations.Kind; import com.sun.btrace.annotations.Location; import com.sun.btrace.annotations.OnMethod; import com.sun.btrace.annotations.ProbeClassName; import com.sun.btrace.annotations.ProbeMethodName; import com.sun.btrace.annotations.Return; @BTrace public class PrintReturn { @OnMethod( clazz="com.imooc.monitor_tuning.chapter4.Ch4Controller", method="arg1", location=@Location(Kind.RETURN) ) public static void anyRead(@ProbeClassName String pcn, @ProbeMethodName String pmn, @Return AnyType result) { BTraceUtils.println(pcn+","+pmn + "," + result); BTraceUtils.println(); } }
-
異常:Kind.THROW
/* * Copyright (c) 2008, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the Classpath exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package com.imooc.monitor_tuning.chapter4; import com.sun.btrace.BTraceUtils; import com.sun.btrace.annotations.BTrace; import com.sun.btrace.annotations.Kind; import com.sun.btrace.annotations.Location; import com.sun.btrace.annotations.OnMethod; import com.sun.btrace.annotations.Self; import com.sun.btrace.annotations.TLS; @BTrace public class PrintOnThrow { // store current exception in a thread local // variable (@TLS annotation). Note that we can't // store it in a global variable! @TLS static Throwable currentException; // introduce probe into every constructor of java.lang.Throwable // class and store "this" in the thread local variable. @OnMethod( clazz="java.lang.Throwable", method="<init>" ) public static void onthrow(@Self Throwable self) {//攔截new Throwable() currentException = self; } @OnMethod( clazz="java.lang.Throwable", method="<init>" ) public static void onthrow1(@Self Throwable self, String s) {//攔截new Throwable(String msg) currentException = self; } @OnMethod( clazz="java.lang.Throwable", method="<init>" ) public static void onthrow1(@Self Throwable self, String s, Throwable cause) {//攔截new Throwable(String msg, Throwable cause) currentException = self; } @OnMethod( clazz="java.lang.Throwable", method="<init>" ) public static void onthrow2(@Self Throwable self, Throwable cause) {//攔截new Throwable(Throwable cause) currentException = self; } // when any constructor of java.lang.Throwable returns // print the currentException's stack trace. @OnMethod( clazz="java.lang.Throwable", method="<init>", location=@Location(Kind.RETURN) ) public static void onthrowreturn() { if (currentException != null) { BTraceUtils.Threads.jstack(currentException); BTraceUtils.println("====================="); currentException = null; } } }
-
行:Kind.LINE 可以定位問題
package com.imooc.monitor_tuning.chapter4; import com.sun.btrace.BTraceUtils; import com.sun.btrace.annotations.BTrace; import com.sun.btrace.annotations.Kind; import com.sun.btrace.annotations.Location; import com.sun.btrace.annotations.OnMethod; import com.sun.btrace.annotations.ProbeClassName; import com.sun.btrace.annotations.ProbeMethodName; @BTrace public class PrintLine { @OnMethod( clazz="com.imooc.monitor_tuning.chapter4.Ch4Controller", method="exception", location=@Location(value=Kind.LINE, line=XX) ) public static void anyRead(@ProbeClassName String pcn, @ProbeMethodName String pmn, int line) { BTraceUtils.println(pcn+","+pmn + "," +line); BTraceUtils.println(); } }
攔截this,參數,返回值
- this:@Self 異常中有舉例
- 入參:可以用AnyType,也可以用真實類型,同名的用真實類型
- 返回:@Return
獲取對象的值
-
簡單類型:直接獲取
-
複雜類型:反射,類名+屬性名
package com.imooc.monitor_tuning.chapter4; import java.lang.reflect.Field; import com.imooc.monitor_tuning.chapter2.User; import com.sun.btrace.BTraceUtils; import com.sun.btrace.annotations.BTrace; import com.sun.btrace.annotations.Kind; import com.sun.btrace.annotations.Location; import com.sun.btrace.annotations.OnMethod; import com.sun.btrace.annotations.ProbeClassName; import com.sun.btrace.annotations.ProbeMethodName; @BTrace public class PrintArgComplex { //btrace -cp "target/classes路徑" pid 類名.java @OnMethod( clazz="com.imooc.monitor_tuning.chapter4.Ch4Controller", method="arg2", location=@Location(Kind.ENTRY) ) public static void anyRead(@ProbeClassName String pcn, @ProbeMethodName String pmn, User user) { //print all fields BTraceUtils.printFields(user); //print one field Field filed2 = BTraceUtils.field("com.imooc.monitor_tuning.chapter2.User", "name"); BTraceUtils.println(BTraceUtils.get(filed2, user)); BTraceUtils.println(pcn+","+pmn); BTraceUtils.println(); } }
攔截其他
-
正則表達式
package com.imooc.monitor_tuning.chapter4; import com.sun.btrace.BTraceUtils; import com.sun.btrace.annotations.BTrace; import com.sun.btrace.annotations.OnMethod; import com.sun.btrace.annotations.ProbeClassName; import com.sun.btrace.annotations.ProbeMethodName; @BTrace public class PrintRegex { @OnMethod( clazz="com.imooc.monitor_tuning.chapter4.Ch4Controller", method="/.*/" ) public static void anyRead(@ProbeClassName String pcn, @ProbeMethodName String pmn) { BTraceUtils.println(pcn+","+pmn); BTraceUtils.println(); } }
-
輸出jinfo的參數
package com.imooc.monitor_tuning.chapter4; import com.sun.btrace.BTraceUtils; import com.sun.btrace.annotations.BTrace; @BTrace public class PrintJinfo { static { BTraceUtils.println("System Properties:"); BTraceUtils.printProperties(); BTraceUtils.println("VM Flags:"); BTraceUtils.printVmArguments(); BTraceUtils.println("OS Enviroment:"); BTraceUtils.printEnv(); BTraceUtils.exit(0); } }
注意事項
- 默認只能本地運行
- 生產環境下可以使用,但是被修改的字節碼不會被還原