查看JVisualVM查看信息

本文介绍了如何使用JVisualVM连接本地和远程Java进程,通过安装BTrace插件来添加日志并打印远程服务器参数。详细步骤包括配置JVM参数、远程调试、监控CPU、内存、线程、死锁以及使用BTrace进行动态跟踪等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 我用的 jdk 是1.8,打开 jdk 的安装目录(D:\Program Files\Java\jdk1.8.0_05\bin),双击 jvisualvm.exe ,打开之后自动连接上本地的 java 进程,如需远程连接需要配置 tomcat 或者 weblogic 的 jvm 参数 (参考文章:https://blog.youkuaiyun.com/fengchao2016/article/details/77237057),配置好后也可以用本地 idea 调试远程服务器上的代码(参考文章:https://www.cnblogs.com/qnight/p/8983145.html)。

2. 安装插件,可以使用 btrace,在里面添加log日志,打印远程服务器上的参数信息,参考文章(https://blog.youkuaiyun.com/keketrtr/article/details/74448127

3. 打开后如下图:

4. 运行 TestDeadLock.java,可以看到本地里面多了一个进程

public class TestDeadLock {

	public void run() {
		MyThread mt = new MyThread();
		new Thread(mt, "张三").start();
		new Thread(mt, "李四").start();
	}

	class MyThread implements Runnable {
		private Object o1 = new Object();
		private Object o2 = new Object();
		private boolean flag = true;


		@Override
		public void run() {
			if (flag) {
				flag = false;
				synchronized (o1) {
					System.out.println(Thread.currentThread().getName() + " have o1");
					try {
						Thread.sleep(100);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					synchronized (o2) {
						System.out.println(Thread.currentThread().getName() + " have o2");
					}
				}
			} else {
				flag = true;
				synchronized (o2) {
					System.out.println(Thread.currentThread().getName() + " have o2");
					try {
						Thread.sleep(100);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					synchronized (o1) {
						System.out.println(Thread.currentThread().getName() + " have o1");
					}
				}
			}
		}
	}

	public static void main(String[] args) {
		new TestDeadLock().run();
	}

}

5. 可以看到 cpu, 堆,Metaspace,加载的类,线程信息,

6. 打开线程标签页,可以看到有检测到死锁

7. 抽样器的cpu可以看到具体的线程,按照线程占用cpu的时间排序,可以看出哪个线程占用cpu最高

8. Visual GC 可以看到目前 GC 的情况:

9. 点击jian监视页面的堆dump按钮可以看到dump信息:

10. 点击线程标签页的线程 dump 按钮,

11. 使用 Btrace 插件输出远程服务器上的参数:

①在 idea 运行 BTraceTest

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class BTraceTest {
    public int add(int a, int b){
        return a + b;
    }

    public static void main(String args[]) throws Exception{
        BTraceTest test = new BTraceTest();
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        for(int i = 0; i < 1000; i++){
            reader.readLine();
    		int a = (int)Math.round(Math.random() * 1000);
    		int b = (int)Math.round(Math.random() * 1000);
    		System.out.println(test.add(a, b));
            System.out.println(test.init());
        }
    }

    public String init(){
        return "init";
    }
}

②在JvisiualVM选中BtraceTest,右键打开 Trace Application,

③在打开的地方输入如下代码:

import com.sun.btrace.annotations.*;
import static com.sun.btrace.BTraceUtils.*;
 
@BTrace
public class TracingScript {
 /* put your code here */
    @OnMethod(
         clazz = "BTraceTest", 
         method = "add", 
         location = @Location(Kind.RETURN))
    public static void func(@Self BTraceTest instance, int a, int b, @Return int result){
        println(" Call Stack ");
       // jstack();
    println(strcat(" Parameter A ", str(a)));
    println(strcat(" Parameter B ", str(b)));
        println(strcat(" Parameter Result ", str(result)));
    }     
    
    @OnMethod(
         clazz = "BTraceTest", 
         method = "init", 
         location = @Location(Kind.RETURN))
    public static void func(@Self BTraceTest instance, @Return String result){
        println(" Call Stack ");
       // jstack();
//     println(strcat(" Parameter A ", str(a)));
//     println(strcat(" Parameter B ", str(b)));
        println(strcat(" Parameter Result ", str(result)));
    }
}

④点击 Btrace 标签页的 Start 按钮,并在 idea 控制台输入字符,比如1,会看到Btrace页面会打印出 a, b 的值,及返回值,iead控制台也会输出 Btrace 的信息

⑤. 如果报如下错误:'com.sun.btrace.compiler.Verifier' 的受支持 source 版本 'RELEASE_6' 低于 -source '1.8',则说

明我运行的jdk版本是1.6,jvisualvm 用的 是1.8目录下的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值