JVM有什麼可豪橫的!這幾段代碼助你實戰JVM優化

JVM知識專欄JVM-火種,持續更新,喜歡請關注😍 

jvm知識對於java開發人員的重要性不言而喻,我們看了各種jvm優化、垃圾回收算法、內存調優的知識點,早就摩拳擦掌想優化實戰,奈何程序偏偏不溢出了,不溢出還怎麼優化啊!下面幾段代碼能有針對虐爆JVM各個內存區。

java.lang.OutOfMemoryError: Java heap space 堆溢出 

public static void main(String[] args) {
    List<Byte[]> list = new ArrayList<Byte[]>();
    while (true) {
        list.add(new Byte[1024*1024]);
    }
}

 java.lang.OutOfMemoryError: Direct buffer memory 直接內存溢出

public static void main(String[] args) throws Exception {
    Field field = Unsafe.class.getDeclaredFields()[0];
    field.setAccessible(true);
    Unsafe unsafe = (Unsafe) field.get(null);
    while (true) {
        unsafe.allocateMemory(1024*1024);
    }
}

java.lang.StackOverflowError 棧溢出

public class TestClass {
    public static void main(String[] args) {
        new TestClass().test();
    }
    public void test() {
        test();
    }
}

java.lang.OutOfMemoryError-->Metaspace 永久區溢出 

public static void main(String[] args) {
    while(true){
        try {
            BeanGenerator generator = new BeanGenerator();
            generator.addProperty("PermGenOOM" + Math.random(), Class.forName("java.io.File"));
            generator.create();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

java.lang.OutOfMemoryError: unable to create new nativ thread 線程過多 

public static void main(String[] args) {
    while (true){
        new Thread() {
            @Override
            public void run() {
                try {
                    Thread.sleep(100000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }.start();
    }
}

 deadlock  線程死鎖

private static final Object A=new Object();
private static final Object B=new Object();
public static void main(String[] args) {
    new Thread() {
        @Override
        public void run() {
            synchronized (A) {
                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (B) {
                    System.out.println("拿到A的鎖並且拿到B的鎖");
                }
            }
        }
    }.start();
    new Thread() {
        @Override
        public void run() {
            synchronized (B) {
                synchronized (A) {
                    System.out.println("拿到B的鎖並且拿到A的鎖");
                }
            }
        }
    }.start();
}

說明: 詳細的知識點就不再談了,簡單的說JVM將內存劃分爲多個區域,每個區域管理的特點不同。執行上述代碼出錯的原因就是找到對應內存區一直懟,內存裝不下就報錯了。不過最後一個線程死鎖從控制檯是看不到報錯的,可以通過線程dump文件看到對應的錯誤內容。

JVM好文推薦:

JVM知識概括

JVM啓動流程

JAVA性能監控工具

OutOfMemoryError:PermGen space

一次線上系統OutOfMemoryError問題定位及原因分析

JVM參數解析 Xmx、Xms、Xmn、NewRatio、SurvivorRatio、PermSize、PrintGC

GC參數解析 UseSerialGC、UseParNewGC、UseParallelGC、UseConcMarkSweepGC


                                                                           覺得不錯,請關注或贊    (-__-)謝謝
 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章