OOM的探索

StackOverflowError

代码:

public class Demo01 {
    public static void main(String[] args) {
        a();
    }
    public static void a(){
        a();
    }
}

通过不断的递归调用,最后撑爆了栈 。

OutOfMemoryError: Java heap space

代码:

public class Demo02 {
    public static void main(String[] args) {

        String str = " hello  world ";
        while(true){
            str += str + new Random().nextInt(Integer.parseInt("1999999999"));
        }
    }

堆空间满了(这个就是测试垃圾回收机制的时候 养老带满了 FullGC清理不出空间报的错误)

OutOfMemoryError: GC overhead limit exceeded

// -Xms10m -Xmx10m -XX:MaxDirectMemorySize=5m -XX:+PrintGCDetails
public static void main(String[] args) throws Throwable {
        int i = 0;
        List<String> list = new ArrayList<String>();

        try {
            while (true){
//                list.add(String.valueOf(1).intern());
//                i++;
                list.add(String.valueOf(++i).intern());
            }
        } catch (Throwable e) {
            System.out.println("i=>"+i);
            e.printStackTrace();
            throw e;
        }
    }

如果用斜线的方法报OutOfMemoryError: Java heap space

这里我们需要每次都出发fullGC,但又不能清理太多的东西,经过一定次数以后GC会报关于次数的错误。关于这部分的原因笔者还在探索。

java.lang.OutOfMemoryError: Direct buffer memory 基础缓冲区的错误!
利用buffer写入本地内存的特性
// -Xms10m -Xmx10m -XX:MaxDirectMemorySize=5m -XX:+PrintGCDetails
public class OomDemo {
    public static void main(String[] args) throws Throwable {
        System.out.println("配置的MaxDirectMemorySize"
        +VM.maxDirectMemory()/(double)1024/1024+"MB");

        TimeUnit.SECONDS.sleep(2);
        
        // 故意破坏!
        // ByteBuffer.allocate(); 分配JVM的堆内存,属于GC管辖
        // ByteBuffer.allocateDirect() ; // 分配本地OS内存,不属于GC管辖
        ByteBuffer byteBuffer = ByteBuffer.allocateDirect(6 * 1024 * 1024);
        // java.lang.OutOfMemoryError: Direct buffer memory
    }
}

我们本地内存只设置了5MB写入的数据超过这个值了也会报OOM

结果:

[GC (Allocation Failure) [PSYoungGen: 2048K->504K(2560K)] 2048K->970K(9728K), 0.0014675 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[GC (System.gc()) [PSYoungGen: 1117K->504K(2560K)] 1583K->1030K(9728K), 0.0009614 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[Full GC (System.gc()) [PSYoungGen: 504K->0K(2560K)] [ParOldGen: 526K->939K(7168K)] 1030K->939K(9728K), [Metaspace: 3117K->3117K(1056768K)], 0.0065318 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 

Exception in thread "main" java.lang.OutOfMemoryError: Direct buffer memory

java.lang.OutOfMemoryError: unable to create native Thread

高并发 , unable to create native Thread这个错误更多的时候和平台有关!(最好不在本地测试)

应用创建的线程太多!

public class TDemo {
    public static void main(String[] args) {
        for (int i = 1; ; i++) {
            System.out.println("i=>"+i);
            new Thread(()->{
                try {
                    Thread.sleep(Integer.MAX_VALUE);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            },""+i).start();
        }
    }
}
Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread

1、服务器线程不够了,超过了限制,也会爆出OOM异常!

你可能感兴趣的:(OOM的探索)