diff --git a/src/main/java/jvm/oom/HeapOOM.java b/src/main/java/jvm/oom/HeapOOM.java new file mode 100644 index 0000000..116d15e --- /dev/null +++ b/src/main/java/jvm/oom/HeapOOM.java @@ -0,0 +1,21 @@ +package jvm.oom; + +import java.util.ArrayList; +import java.util.List; + +/** + * VM args: -Xmx20m -Xms20M -XX:+HeapDumpOnOutOfMemoryError + */ +public class HeapOOM { + + static class OOMObject { + } + + public static void main(String[] args) throws InterruptedException { + List list = new ArrayList<>(); + + while (true) { + list.add(new OOMObject()); + } + } +} diff --git a/src/main/java/jvm/oom/JavaVMStackSOF.java b/src/main/java/jvm/oom/JavaVMStackSOF.java new file mode 100644 index 0000000..84230ce --- /dev/null +++ b/src/main/java/jvm/oom/JavaVMStackSOF.java @@ -0,0 +1,24 @@ +package jvm.oom; + +/** + * VM Args: -Xss228k + */ +public class JavaVMStackSOF { + + private int stackLength = 1; + + public void stackLeak() { + stackLength++; + stackLeak(); + } + + public static void main(String[] args) { + JavaVMStackSOF sof = new JavaVMStackSOF(); + try { + sof.stackLeak(); + } catch (Throwable e) { + System.out.println("stack length: " + sof.stackLength); + throw e; + } + } +} diff --git a/src/main/java/threaddemo/DeadlockDemo.java b/src/main/java/threaddemo/DeadlockDemo.java new file mode 100644 index 0000000..0adeacc --- /dev/null +++ b/src/main/java/threaddemo/DeadlockDemo.java @@ -0,0 +1,39 @@ +package threaddemo; + +public class DeadlockDemo { + private static final Object resource1 = new Object(); + private static final Object resource2 = new Object(); + + public static void main(String[] args) { + new Thread(() -> { + synchronized (resource1) { + System.out.println(STR."\{Thread.currentThread()}get resource1"); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println(STR."\{Thread.currentThread()} waiting get resource2"); + synchronized (resource2) { + System.out.println(STR."\{Thread.currentThread()} get resource2"); + } + } + },"t1").start(); + + new Thread(() -> { + synchronized (resource2) { + System.out.println(Thread.currentThread() + "get resource2"); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + System.out.println(Thread.currentThread() + "waiting get resource1"); + synchronized (resource1) { + System.out.println(Thread.currentThread() + "get resource1"); + } + } + },"t2").start(); + } +}