jvm2:Java内存溢出

内存泄露和内存溢出的区别

内存溢出通俗理解就是内存不够了,不能分配足够大的内存。
内存泄露就是程序中已动态分配的堆内存没有释放,造成内存浪费。可以发现内存泄露不停发生最终会导致内存溢出。

Java堆溢出

    /**
     * -Xms10m 启动时分配内存10m
     * -Xmx10m 最大内存10m
     * @param args
     */
    public static void main(String[] args) {
        List<OOMTest> list = new ArrayList<OOMTest>();
        
        while (true) {
            list.add(new OOMTest());
        }
        
    }
1.jpg

虚拟机栈和本地方法栈溢出

public class StackLeakTest {

    public void leak() {
        leak();
    }
    
    public static void main(String[] args) {
        StackLeakTest stackLeakTest = new StackLeakTest();
        stackLeakTest.leak();
    }
}
2.jpg

方法区和运行时常量池溢出

    /**
     * -XX:PermSize=10M JVM初始分配的方法区的容量为10M
     * -XX:MaxPermSize=10M JVM允许分配的方法区的最大容量为10M
     * @param args
     */
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder("123");
        
        while (true) {
            sb.append("123");
        }
    }
3.jpg

总结

StackOverflowError异常
线程请求的栈深度大于虚拟机所允许的最大深度将抛出StackOverflowError异常。
OutOfMemoryError异常
虚拟机在扩展栈时无法申请到足够的内存空间将抛出OutOfMemoryError异常。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容