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异常!