JVM有什么可豪横的!这几段代码助你实战JVM优化

JVM知识专栏JVM-火种,持续更新,喜欢请关注 

jvm知识对于java开发人员的重要性不言而喻,我们看了各种jvm优化、垃圾回收算法、内存调优的知识点,早就摩拳擦掌想优化实战,奈何程序偏偏不溢出了,不溢出还怎么优化啊!下面几段代码能有针对虐爆JVM各个内存区。

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

public static void main(String[] args) {
    List list = new ArrayList();
    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


                                                                           觉得不错,请关注或赞    (-__-)谢谢
 

JVM有什么可豪横的!这几段代码助你实战JVM优化_第1张图片

 

你可能感兴趣的:(JVM-火种)