JVM学习笔记20 jvisualvm

bilibili-JVM学习笔记20 jvisualvm
The Java Virtual Machine Specification - Java SE 8 Edition

JVM学习笔记18 字节码知识总结
JVM学习笔记19 JVM内存空间

基于 java 1.8.0

实战 jvisualvm

package new_package.jvm.p62;

import java.util.ArrayList;
import java.util.List;

public class MyTest {

    public static void main(String[] args) {
        List<byte[]> list = new ArrayList<>();
        for (; ; ) {
            list.add(new byte[1024]);
        }
    }
}

VM options :

-Xms5m -Xmx5m -XX:+HeapDumpOnOutOfMemoryError

java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid18644.hprof ...
Exception in thread "main" Heap dump file created [6006484 bytes in 0.014 secs]
java.lang.OutOfMemoryError: Java heap space
	at new_package.jvm.p62.MyTest.main(MyTest.java:14)

运行完成后会在工程目录下生成一个 *.hprof

在这里插入图片描述

打开 jvisualvm 工具

jvisualvm

文件 -> 装入 -> 选择文件格式为:堆 Dump(*.hprof)

在这里插入图片描述


调整虚拟机运行参数

-Xms2m -Xmx2m -XX:+HeapDumpOnOutOfMemoryError

线程栈溢出监控与分析详解 64

package new_package.jvm.p62;

/**
 * 虚拟机栈溢出
 * -Xss160k -XX:+HeapDumpOnOutOfMemoryError
 */
public class MyTest2 {

    private int value;

    public int getValue() {
        return value;
    }

    public void test() {
        this.value++;
        test();
    }

    public static void main(String[] args) {
        MyTest2 myTest2 = new MyTest2();

        try {
            myTest2.test();
        } catch (Throwable t) {
            System.out.println(myTest2.getValue());
            t.printStackTrace();
        }

    }
}

虚拟机运行参数 : -Xss160k -XX:+HeapDumpOnOutOfMemoryError

773
java.lang.StackOverflowError
	at new_package.jvm.p62.MyTest2.test(MyTest2.java:16)

线程 -> 线程 Dump -->

线程死锁检测与分析工具深度解析 65

package new_package.jvm.p62;

/**
 * 死锁示例
 */
public class DeadLock {

    public static String obj1 = "obj1";
    public static String obj2 = "obj2";

    public static void main(String[] args) {
        Thread a = new Thread(new Lock1());
        Thread b = new Thread(new Lock2());
        a.start();
        b.start();
    }
}

class Lock1 implements Runnable {
    @Override
    public void run() {
        try {
            System.out.println("Lock1 running");
            while (true) {
                synchronized (DeadLock.obj1) {
                    System.out.println("Lock1 lock obj1");
                    Thread.sleep(3000);
                    synchronized (DeadLock.obj2) {
                        System.out.println("Lock1 lock obj2");
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class Lock2 implements Runnable {
    @Override
    public void run() {
        try {
            System.out.println("Lock2 running");
            while (true) {
                synchronized (DeadLock.obj2) {
                    System.out.println("Lock2 lock obj2");
                    Thread.sleep(3000);
                    synchronized (DeadLock.obj1) {
                        System.out.println("Lock2 lock obj1");
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

jconsole

Java 监视和管理控制台

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


jvissualvm

在这里插入图片描述


package new_package.jvm.p62;

public class DeadLock2 {

    public static void main(String[] args) {
        new Thread(()->A.method()).start();
        new Thread(()->B.method()).start();
    }
}

class A {
    public static synchronized void method()  {
        System.out.println("Class A");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        B.method();
    }
}

class B {
    public static synchronized void method() {
        System.out.println("Class B");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        A.method();
    }
}

JVM元空间深度解析 66

package new_package.jvm.p62;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;

/**
 * 方法区内存溢出示例
 * 元空间使用系统的直接内存,会自动扩充,直到系统内存
 * 指定大小: -XX:MaxMetaspaceSize=10m
 */
public class MetaSpaceTest {

    public static void main(String[] args) {
        int flag = 0;
        while (true) {
            flag++;
            Enhancer enhancer = new Enhancer();
            enhancer.setSuperclass(MetaSpaceTest.class);
            enhancer.setUseCache(false);
            enhancer.setCallback((MethodInterceptor) (obj, method, args0, proxy) -> proxy.invokeSuper(obj, args0));
            System.out.println("create a class " + flag);
            enhancer.create();
        }
    }
}
create a class 519
create a class 520
create a class 521
Exception in thread "main" java.lang.OutOfMemoryError: Metaspace
	at net.sf.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:348)
	at net.sf.cglib.proxy.Enhancer.generate(Enhancer.java:492)
	at net.sf.cglib.core.AbstractClassGenerator$ClassLoaderData.get(AbstractClassGenerator.java:117)
	at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:294)
	at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:480)
	at net.sf.cglib.proxy.Enhancer.create(Enhancer.java:305)
	at new_package.jvm.p62.MetaSpaceTest.main(MetaSpaceTest.java:22)

Java永久代去哪儿了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值