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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值