请谈谈你对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();
}
}
}