欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

请谈谈你对OOM的认识

程序员文章站 2022-06-21 15:07:44
...

java.lang.*Error

public class *ErrorDemo
{

    public static void main(String[] args)
    {
        *Error();

    }

    private static void *Error()
    {
        *Error();
    }

}



Exception in thread "main" java.lang.*Error
	at com.veritas.test.*ErrorDemo.*Error(*ErrorDemo.java:14)
	at com.veritas.test.*ErrorDemo.*Error(*ErrorDemo.java:14)
	at com.veritas.test.*ErrorDemo.*Error(*ErrorDemo.java:14)
	at com.veritas.test.*ErrorDemo.*Error(*ErrorDemo.java:14)
	at com.veritas.test.*ErrorDemo.*Error(*ErrorDemo.java:14)
	at com.veritas.test.*ErrorDemo.*Error(*ErrorDemo.java:14)

java.lang.OutOfMemoryError: Java heap space

public class JavaHeapSpaceDemo
{

    public static void main(String[] args)
    {
        byte[] bytes = new byte[7 * 1024 * 1024];
        System.out.println(bytes);
    }

}



Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at com.veritas.test.JavaHeapSpaceDemo.main(JavaHeapSpaceDemo.java:8)

java.lang.OutOfMemoryError: GC overhead limit exceeded

import java.util.ArrayList;
import java.util.List;

/**
 * 
 * @author root
 *
 *         JVM配置参数演示
 *         -Xms7m -Xmx7m -XX:MaxDirectMemorySize=3m
 *
 *         GC回收时间过长时会抛出OutOFMemoryError。
 *         过长的定义是,超过98%的时间用来做GC并且回收了不到2%的堆内存。
 *         连续多次GC都回收了不到2%的极端情况下才会抛出。
 *         假如不抛出GC overhead limit错误会发生什么情况呢?
 *         那就是GC清理的那么点内存很快会再次填满,迫使GC再次执行,这样就形成恶性循环,CPU使用率一直是100%,而GC却没有任何成果。
 * 
 */
public class GCOverheadDemo
{

    public static void main(String[] args)
    {
        int i = 0;
        List<String> list = new ArrayList<String>();
        try
        {
            while (true)
            {
                list.add(String.valueOf(i++));
            }
        }
        catch (Exception e)
        {
            System.out.println("*******i:" + i);
            e.printStackTrace();
        }
    }

}