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)