OOMError总结
结构
StackOverflowError
栈的大小一般为512k-1024k,随着方法的深度调用,有可能会将栈空间撑爆.
以下为递归调用的例子:
public class StackOverflowErrorDemo {
private void sayHello(){
// System.out.println("sayHello");
sayHello();
}
public static void main(String[] args) {
long maxMemory = Runtime.getRuntime().maxMemory();
long totalMemory = Runtime.getRuntime().totalMemory();
System.out.println("maxMemory = " + maxMemory + "字节\t" + (maxMemory/1024/1024) +"MB");
System.out.println("totalMemory = " + totalMemory + "字节\t" + (maxMemory/1024/1024) +"MB");
StackOverflowErrorDemo stackOverflowErrorDemo = new StackOverflowErrorDemo();
stackOverflowErrorDemo.sayHello();
}
}
运行结果
maxMemory = 3799515136字节 3623MB
totalMemory = 257425408字节 3623MB
Exception in thread "main" java.lang.StackOverflowError
at com.wu.pratice.jvm.StackOverflowErrorDemo.sayHello(StackOverflowErrorDemo.java:13)
java.lang.OutOfMemoryError
java.lang.OutOfMemoryError: Java heap space
public class OutOfMemoryErrorDemo {
public static void main(String[] args) {
long maxMemory = Runtime.getRuntime().maxMemory();
long totalMemory = Runtime.getRuntime().totalMemory();
System.out.println("maxMemory = " + maxMemory + "字节\t" + (maxMemory/1024/1024) +"MB");
System.out.println("totalMemory = " + totalMemory + "字节\t" + (maxMemory/1024/1024) +"MB");
String str = "www.baidu.com";
while (true){
str += str + new Random().nextInt(888888888) + new Random().nextInt(999999999);
}
}
}
运行结果
maxMemory = 3799515136字节 3623MB
totalMemory = 257425408字节 3623MB
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3332)
at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:674)
at java.lang.StringBuilder.append(StringBuilder.java:208)
at com.wu.pratice.jvm.OutOfMemoryErrorDemo.main(OutOfMemoryErrorDemo.java:24)
java.lang.OutOfMemoryError: GC overhead limit
/**
* @author wuzhenwei
* @Description
* JVM参数配置
* -Xms10m -Xmx10m -XX:+PrintGCDetails -XX:MaxDirectMemorySize=5m
*
* GC回收时间过长时会抛出OutOfMemoryError。过长时定义是,超过98%的时间用来做GC并且回收了不到2%的堆内存
* 连续对此GC都只回收了不到2%的极端情况下才会抛出。假如不抛出GC overhead limit错误会发生什么情况呢?
* 那就是GC清理的这么点内存很快会再次填满,破事GC再次执行,这样就形成恶性循环,CPU使用率一直是100%,而GC却没有任何成果。
* @create 2019/6/11
*/
public class GCOverHeadDemo {
public static void main(String[] args) {
int i = 0;
List<String> list = new ArrayList();
try {
while (true){
list.add(String.valueOf(++i).intern());
}
}catch (Throwable e){
System.out.println("循环次数="+i);
e.printStackTrace();
throw e;
}
}
}
运行结果
[GC (Allocation Failure) [PSYoungGen: 2048K->504K(2560K)] 2048K->896K(9728K), 0.0011220 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC (Allocation Failure) [PSYoungGen: 2450K->491K(2560K)] 2842K->2471K(9728K), 0.0020922 secs] [Times: user=0.05 sys=0.00, real=0.00 secs]
[GC (Allocation Failure) [PSYoungGen: 2539K->496K(2560K)] 4519K->4241K(9728K), 0.0058396 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
[GC (Allocation Failure) [PSYoungGen: 2544K->496K(2560K)] 6289K->6282K(9728K), 0.0043694 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[Full GC (Ergonomics) [PSYoungGen: 496K->0K(2560K)] [ParOldGen: 5786K->5913K(7168K)] 6282K->5913K(9728K), [Metaspace: 3498K->3498K(1056768K)], 0.0544893 secs] [Times: user=0.11 sys=0.00, real=0.06 secs]
[Full GC (Ergonomics) [PSYoungGen: 2048K->461K(2560K)] [ParOldGen: 5913K->7040K(7168K)] 7961K->7502K(9728K), [Metaspace: 3498K->3498K(1056768K)], 0.0394096 secs] [Times: user=0.05 sys=0.00, real=0.04 secs]
[Full GC (Ergonomics) [PSYoungGen: 2048K->2046K(2560K)] [ParOldGen: 7040K->7040K(7168K)] 9088K->9087K(9728K), [Metaspace: 3498K->3498K(1056768K)], 0.0313519 secs] [Times: user=0.09 sys=0.00, real=0.03 secs]
[Full GC (Ergonomics) [PSYoungGen: 2048K->2047K(2560K)] [ParOldGen: 7040K->7040K(7168K)] 9088K->9088K(9728K), [Metaspace: 3498K->3498K(1056768K)], 0.0225124 secs] [Times: user=0.05 sys=0.00, real=0.02 secs]
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7040K->7040K(7168K)] 9088K->9088K(9728K), [Metaspace: 3498K->3498K(1056768K)], 0.0237509 secs] [Times: user=0.09 sys=0.00, real=0.02 secs]
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7042K->7042K(7168K)] 9090K->9090K(9728K), [Metaspace: 3498K->3498K(1056768K)], 0.0249834 secs] [Times: user=0.03 sys=0.02, real=0.03 secs]
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7044K->7044K(7168K)] 9092K->9092K(9728K), [Metaspace: 3498K->3498K(1056768K)], 0.0223360 secs] [Times: user=0.06 sys=0.00, real=0.02 secs]
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7046K->7046K(7168K)] 9094K->9094K(9728K), [Metaspace: 3498K->3498K(1056768K)], 0.0225908 secs] [Times: user=0.02 sys=0.00, real=0.02 secs]
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7047K->7047K(7168K)] 9095K->9095K(9728K), [Metaspace: 3498K->3498K(1056768K)], 0.0223594 secs] [Times: user=0.08 sys=0.00, real=0.02 secs]
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7049K->7049K(7168K)] 9097K->9097K(9728K), [Metaspace: 3498K->3498K(1056768K)], 0.0224219 secs] [Times: user=0.05 sys=0.00, real=0.02 secs]
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7051K->7051K(7168K)] 9099K->9099K(9728K), [Metaspace: 3498K->3498K(1056768K)], 0.0228104 secs] [Times: user=0.08 sys=0.01, real=0.02 secs]
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7053K->7053K(7168K)] 9101K->9101K(9728K), [Metaspace: 3498K->3498K(1056768K)], 0.0236656 secs] [Times: user=0.02 sys=0.00, real=0.02 secs]
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7054K->7054K(7168K)] 9102K->9102K(9728K), [Metaspace: 3498K->3498K(1056768K)], 0.0236217 secs] [Times: user=0.06 sys=0.00, real=0.02 secs]
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7056K->7056K(7168K)] 9104K->9104K(9728K), [Metaspace: 3498K->3498K(1056768K)], 0.0248194 secs] [Times: user=0.01 sys=0.00, real=0.03 secs]
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7058K->7058K(7168K)] 9106K->9106K(9728K), [Metaspace: 3498K->3498K(1056768K)], 0.0264594 secs] [Times: user=0.03 sys=0.00, real=0.03 secs]
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7060K->7060K(7168K)] 9108K->9108K(9728K), [Metaspace: 3498K->3498K(1056768K)], 0.0240950 secs] [Times: user=0.03 sys=0.00, real=0.02 secs]
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7061K->7061K(7168K)] 9109K->9109K(9728K), [Metaspace: 3498K->3498K(1056768K)], 0.0265609 secs] [Times: user=0.03 sys=0.02, real=0.03 secs]
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7063K->7063K(7168K)] 9111K->9111K(9728K), [Metaspace: 3498K->3498K(1056768K)], 0.0256697 secs] [Times: user=0.06 sys=0.00, real=0.03 secs]
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7065K->7065K(7168K)] 9113K->9113K(9728K), [Metaspace: 3498K->3498K(1056768K)], 0.0243302 secs] [Times: user=0.03 sys=0.00, real=0.02 secs]
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7067K->7067K(7168K)] 9115K->9115K(9728K), [Metaspace: 3498K->3498K(1056768K)], 0.0223255 secs] [Times: user=0.06 sys=0.00, real=0.02 secs]
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7068K->7068K(7168K)] 9116K->9116K(9728K), [Metaspace: 3498K->3498K(1056768K)], 0.0242984 secs] [Times: user=0.03 sys=0.00, real=0.02 secs]
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7070K->7070K(7168K)] 9118K->9118K(9728K), [Metaspace: 3498K->3498K(1056768K)], 0.0232696 secs] [Times: user=0.03 sys=0.00, real=0.02 secs]
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7072K->7072K(7168K)] 9120K->9120K(9728K), [Metaspace: 3498K->3498K(1056768K)], 0.0243549 secs] [Times: user=0.02 sys=0.00, real=0.03 secs]
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7074K->7074K(7168K)] 9122K->9122K(9728K), [Metaspace: 3498K->3498K(1056768K)], 0.0255183 secs] [Times: user=0.03 sys=0.00, real=0.03 secs]
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7075K->7075K(7168K)] 9123K->9123K(9728K), [Metaspace: 3498K->3498K(1056768K)], 0.0666535 secs] [Times: user=0.01 sys=0.00, real=0.07 secs]
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7077K->7077K(7168K)] 9125K->9125K(9728K), [Metaspace: 3498K->3498K(1056768K)], 0.0278818 secs] [Times: user=0.03 sys=0.00, real=0.03 secs]
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7079K->7079K(7168K)] 9127K->9127K(9728K), [Metaspace: 3498K->3498K(1056768K)], 0.0258323 secs] [Times: user=0.05 sys=0.00, real=0.03 secs]
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7081K->7081K(7168K)] 9129K->9129K(9728K), [Metaspace: 3498K->3498K(1056768K)], 0.0336989 secs] [Times: user=0.03 sys=0.00, real=0.03 secs]
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7082K->7082K(7168K)] 9130K->9130K(9728K), [Metaspace: 3498K->3498K(1056768K)], 0.0578536 secs] [Times: user=0.05 sys=0.00, real=0.06 secs]
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7084K->7084K(7168K)] 9132K->9132K(9728K), [Metaspace: 3498K->3498K(1056768K)], 0.0528367 secs] [Times: user=0.02 sys=0.00, real=0.05 secs]
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7086K->7069K(7168K)] 9134K->9117K(9728K), [Metaspace: 3498K->3498K(1056768K)], 0.0405904 secs] [Times: user=0.06 sys=0.00, real=0.04 secs]
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7070K->7070K(7168K)] 9118K->9118K(9728K), [Metaspace: 3498K->3498K(1056768K)], 0.0235003 secs] [Times: user=0.03 sys=0.00, real=0.02 secs]
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7072K->7072K(7168K)] 9120K->9120K(9728K), [Metaspace: 3498K->3498K(1056768K)], 0.0239408 secs] [Times: user=0.09 sys=0.00, real=0.02 secs]
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7074K->7073K(7168K)] 9122K->9121K(9728K), [Metaspace: 3498K->3498K(1056768K)], 0.0364052 secs] [Times: user=0.06 sys=0.00, real=0.04 secs]
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7074K->7074K(7168K)] 9122K->9122K(9728K), [Metaspace: 3498K->3498K(1056768K)], 0.0234213 secs] [Times: user=0.08 sys=0.00, real=0.02 secs]
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7076K->7076K(7168K)] 9124K->9124K(9728K), [Metaspace: 3498K->3498K(1056768K)], 0.0300923 secs] [Times: user=0.02 sys=0.01, real=0.03 secs]
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7078K->7078K(7168K)] 9126K->9126K(9728K), [Metaspace: 3498K->3498K(1056768K)], 0.0288421 secs] [Times: user=0.01 sys=0.00, real=0.03 secs]
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7080K->7080K(7168K)] 9128K->9128K(9728K), [Metaspace: 3498K->3498K(1056768K)], 0.0256733 secs] [Times: user=0.03 sys=0.00, real=0.03 secs]
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7081K->7081K(7168K)] 9129K->9129K(9728K), [Metaspace: 3498K->3498K(1056768K)], 0.0244612 secs] [Times: user=0.09 sys=0.00, real=0.02 secs]
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7083K->7083K(7168K)] 9131K->9131K(9728K), [Metaspace: 3498K->3498K(1056768K)], 0.0244141 secs] [Times: user=0.03 sys=0.00, real=0.02 secs]
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7085K->7085K(7168K)] 9133K->9133K(9728K), [Metaspace: 3498K->3498K(1056768K)], 0.0261886 secs] [Times: user=0.06 sys=0.00, real=0.03 secs]
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7087K->7087K(7168K)] 9135K->9135K(9728K), [Metaspace: 3498K->3498K(1056768K)], 0.0244101 secs] [Times: user=0.05 sys=0.00, real=0.02 secs]
[Full GC (Ergonomics) [PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7088K->7088K(7168K)] 9136K->9136K(9728K), [Metaspace: 3498K->3498K(1056768K)], 0.0237575 secs] [Times: user=0.06 sys=0.00, real=0.02 secs]
循环次数=145468
[Full GC (Ergonomics) java.lang.OutOfMemoryError: GC overhead limit exceeded
at java.lang.Integer.toString(Integer.java:401)
at java.lang.String.valueOf(String.java:3099)[PSYoungGen: 2047K->2047K(2560K)] [ParOldGen: 7105K->7090K(7168K)] 9153K->9138K(9728K), [Metaspace: 3523K->3523K(1056768K)], 0.0241028 secs] [Times: user=0.06 sys=0.02, real=0.02 secs]
java.lang.OutOfMemoryError: Direct buffer memory
/**
* @author wuzhenwei
* @Description
* JVM参数配置
* -Xms10m -Xmx10m -XX:+PrintGCDetails -XX:MaxDirectMemorySize=5m
*
* 导致原因:
* 写NIO程序经常使用ByteBuffer来读取或写入数据,这是一种基于通道(Channel)与缓冲区(Buffer)的I/O方式,
* 它可以使用Native函数库直接分配堆外内存,然后通过一个存储在java堆里面的DirectByteBuffer对象作为这块内存的引用进行操作。
* 这样能再一些场景中显著提高性能,因为避免了再java堆和Native堆中来回复制数据。
* ByteBuffer.allocate(capacity) 第一种方式是分配JVM堆内存,属于GC管辖范围,由于需要拷贝所以速度相对较慢
* ByteBuffer.allocateDirect(capacity) 第二种方式是分配OS本地内存,不属于GC管辖范围,由于不需要内存拷贝所以速度相对较快。
*
* 但如果不断分配本地内存,堆内存很少使用,那么JVM就不需要进行GC,DirectByteBuffer对象们就不会被回收,这时候堆内存充足,但本地内存可能已经使用光了,再次尝试分配本地内存就会出现OutOfMemoryError,那程序就直接崩溃了。
*
* @create 2019/6/11
*/
public class DirectBufferMemoryDemo {
public static void main(String[] args) {
System.out.println("配置的maxDirectMemorySize=" + sun.misc.VM.maxDirectMemory()/1024/1024 + "MB");
// 配置的直接内存大小为5M 这里设置6M
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(6*1024*1024);
}
}
运行结果
配置的maxDirectMemorySize=5MB
[GC (System.gc()) [PSYoungGen: 1992K->488K(2560K)] 1992K->696K(9728K), 0.0007343 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[Full GC (System.gc()) [PSYoungGen: 488K->0K(2560K)] [ParOldGen: 208K->660K(7168K)] 696K->660K(9728K), [Metaspace: 3493K->3493K(1056768K)], 0.0039097 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Direct buffer memory
at java.nio.Bits.reserveMemory(Bits.java:693)
at java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:123)
at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:311)
at com.wu.pratice.jvm.DirectBufferMemoryDemo.main(DirectBufferMemoryDemo.java:20)
Heap
PSYoungGen total 2560K, used 57K [0x00000000ffd00000, 0x0000000100000000, 0x0000000100000000)
eden space 2048K, 2% used [0x00000000ffd00000,0x00000000ffd0e770,0x00000000fff00000)
from space 512K, 0% used [0x00000000fff00000,0x00000000fff00000,0x00000000fff80000)
to space 512K, 0% used [0x00000000fff80000,0x00000000fff80000,0x0000000100000000)
ParOldGen total 7168K, used 660K [0x00000000ff600000, 0x00000000ffd00000, 0x00000000ffd00000)
object space 7168K, 9% used [0x00000000ff600000,0x00000000ff6a51f0,0x00000000ffd00000)
Metaspace used 3525K, capacity 4502K, committed 4864K, reserved 1056768K
class space used 391K, capacity 394K, committed 512K, reserved 1048576K
java.lang.OutOfMemoryError: unable to create new native thread
/**
* @author wuzhenwei
* @Description
* 高并发请求服务器时,经常出现如下异常
* 准确的讲该native thread异常与对应的平台有关
*
* 导致原因:
* 你的应用创建了太多线程了,一个应用进程创建多个线程,超过系统承载极限
* 你的服务器并不允许你的应用程序创建这么多线程,Linux系统默认允许单个进程可以创建的线程数是1024个,你的应用创建超过这个数量,就会报
*
* 解决办法:
* 1. 想办法降低你应用程序创建线程的数量,分析应用是否真的需要创建这么多线程,如果不是,修改代码将线程数量降到最低
* 2. 对于有的应用,确实需要创建很多线程,远超过linux系统的默认1024个线程的限制,可以通过修改linxu服务器配置,扩大linux默认限制
*
* @create 2019/6/11
*/
public class UnableCreateNewThreadDemo {
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();
}
}).start();
}
}
}
Linux上运行结果
- root用户登录结果:
************ i = 3613
************ i = 3614
Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:717)
at com.wu.pratice.jvm.UnableCreateNewThreadDemo.main(UnableCreateNewThreadDemo.java:31)
- test用户登录结果:
************ i = 1012
************ i = 1013
Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:717)
at com.wu.pratice.jvm.UnableCreateNewThreadDemo.main(UnableCreateNewThreadDemo.java:31)
- Linux优化建议
查看系统配置文件/etc/security/limits.d/20-nproc.conf,可以根据实际需求进行调整
[root@node3 test]# cat /etc/security/limits.d/20-nproc.conf
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.
* soft nproc 1024 #非root用户的线程数
root soft nproc unlimited #root用户没有限制
test用户下查看进程允许创建的线程数
[test@node3 test]$ ulimit -u
1024
root用户下查看进程允许创建的线程数
[root@node3 test]# ulimit -u
1874
java.lang.OutOfMemoryError: Metaspace
/**
* @author wuzhenwei
* @Description
* JVM参数配置
* -XX:MetaspaceSize=8m -XX:MaxMetaspaceSize=8m
*
* java8及以后的版本使用Metaspace来替代永久代
* MetaspaceSize是方法区在HostSpot中的实现,它与永久代最大的区别在于:Metaspace并不在虚拟机内存中而是使用本地内存,也即在java8中,class metadata,被存储在叫做Metaspace的native memory
*
* 永久代存储了以下信息:
* 虚拟机加载的类信息
* 常量池
* 静态变量
* 即时编译后的代码
*
* 模仿Metaspace空间溢出,我们需要不断生成类到元空间,类占据的空间总是会超过Metaspace指定的空间大小的。
* @create 2019/6/12
*/
public class MetaspaceOOMDemo {
static class OOMTest{
}
public static void main(String[] args) {
int i = 0;
try {
while (true){
i++;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(OOMTest.class);
enhancer.setUseCache(false);
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
return methodProxy.invokeSuper(o,args);
}
});
enhancer.create();
}
}catch (Throwable e){
System.out.println("=============第" + i +"次发生异常");
e.printStackTrace();
}
}
}
运行结果
java.lang.OutOfMemoryError: Metaspace
=============第326次发生异常
at org.springframework.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:345)
at org.springframework.cglib.proxy.Enhancer.generate(Enhancer.java:492)
at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData.get(AbstractClassGenerator.java:114)
at org.springframework.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:291)
at org.springframework.cglib.proxy.Enhancer.createHelper(Enhancer.java:480)
at org.springframework.cglib.proxy.Enhancer.create(Enhancer.java:305)
at com.wu.pratice.jvm.MetaspaceOOMDemo.main(MetaspaceOOMDemo.java:48)