首页 > 其他分享 >JVM 常见错误汇总

JVM 常见错误汇总

时间:2023-07-28 09:44:51浏览次数:30  
标签:java 错误 虚拟机 汇总 void 内存 JVM public 溢出

栈内存溢出

栈内存错误包括:栈帧过多(StackOverflowError)、栈帧过大(OutOfMemoryError)

  • StackOverflowError:如果线程请求的栈深度大于虚拟机所允许的最大深度;
  • OutOfMemoryError:如果虚拟机的占内存允许动态扩展,当扩展容量无法申请到足够的内存时;

栈帧过多

/**
 * 栈帧过多导致内存溢出演示
 * java.lang.StackOverflowError
 * 
 * -Xss256k 设置栈内存大小
 */
public class StackOverflowDemo {

    private static int count;

    public static void main(String[] args) {
        try {
            method1();
        }catch (Throwable e){
            e.printStackTrace();
            System.out.println(count);
        }

    }

    private static void method1() {
        count++;
        method1();
    }

}

栈帧过大

/**
 * 栈帧过大导致内存溢出演示 
 * Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread
 * 
 * -Xss256k 设置栈内存大小
 *
 *《Java虚拟机规范》明确允许Java虚拟机实现自行选择是否支持栈的动态扩展, 而HotSpot虚拟机的选择不支持扩展;
 * 结论:无论式由于栈帧太大还是虚拟机容量太小, 当新的栈帧内存无法分配的时候, HotSpot虚拟机抛出的都是StackOverflowError异常; 
 * 若在允许动态扩展栈容量大小的虚拟机上, 结果就会导致不一样的错误; 如Classic虚拟机, 则会出现java.lang.OutOfMemoryError;
 * 若测试不限于单线程, 通过不断建立线程的方式, 在HotSpot也可以产生内存溢出异常;代码如下, 现象不容易出现;
 * 注: Java的线程时映射到操作系统的内核线程上的, 因此代码执行时有较大风险, 可能会导致操作系统假死;
 */
public class Demo {

    private void dontStop() {
        while (true) {
        }
    }

    public void stackLeakByThread() {
        while (true) {
            Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    dontStop();
                }
            });
            thread.start();
        }
    }

    public static void main(String[] args) throws Throwable {
        Demo oom = new Demo();
        oom.stackLeakByThread();
    }
}

堆内存溢出

堆内存溢出包括:Java堆(Heap)内存溢出、元空间内存溢出、运行时常量池溢出、本机直接内存溢出;

Java 堆内存溢出

/**
 * 演示堆内存溢出
 * java.lang.OutOfMemoryError: Java heap space
 *
 * -Xmx8m
 */
public class Demo {

        public static void main(String[] args) {
            int i = 0;
            try {
                List<String> list = new ArrayList<>();
                String a = "hello";
                while (true) {
                    list.add(a); // hello, hellohello, hellohellohellohello ...
                    a = a + a;  // hellohellohellohello
                    i++;
                }
            } catch (Throwable e) {
                e.printStackTrace();
                System.out.println(i);
            }
        }
}

方法区溢出:永久代内存溢出、元空间内存溢出

  • 永久代内存溢出(JDK1.6)
演示永久代内存溢出 java.lang.OutOfMemoryError: PermGen space
-XX:MaxPermSize=8m
    
    import com.sun.xml.internal.ws.org.objectweb.asm.ClassWriter;
import com.sun.xml.internal.ws.org.objectweb.asm.Opcodes;
  • 元空间内存溢出(JDK1.8)
import jdk.internal.org.objectweb.asm.ClassWriter;
import jdk.internal.org.objectweb.asm.Opcodes;

/**
 * 演示元空间内存溢出 
 * 
 * java.lang.OutOfMemoryError: Metaspace
 *
 * -XX:MaxMetaspaceSize=8m
 */
public class Demo extends ClassLoader { // 可以用来加载类的二进制字节码
    public static void main(String[] args) {
        int j = 0;
        try {
            Demo test = new Demo();
            for (int i = 0; i < 10000; i++, j++) {
                // ClassWriter 作用是生成类的二进制字节码
                ClassWriter cw = new ClassWriter(0);
                // 版本号, public, 类名, 包名, 父类, 接口
                cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, "Class" + i, null, "java/lang/Object", null);
                // 返回 byte[]
                byte[] code = cw.toByteArray();
                // 执行了类的加载
                test.defineClass("Class" + i, code, 0, code.length); // Class 对象
            }
        } finally {
            System.out.println(j);
        }
    }
}

直接内存溢出

import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;

/**
 * 演示直接内存溢出
 *
 * -Xmx6M
 */
public class Demo {
    static int _100Mb = 1024 * 1024 * 100;

    public static void main(String[] args) {
        List<ByteBuffer> list = new ArrayList<>();
        int i = 0;
        try {
            while (true) {
                ByteBuffer byteBuffer = ByteBuffer.allocateDirect(_100Mb);
                list.add(byteBuffer);
                i++;
            }
        } finally {
            System.out.println(i);
        }
        // 方法区是jvm规范
        // jdk6 中对方法区的实现称为永久代
        // jdk8 对方法区的实现称为元空间
    }
}

标签:java,错误,虚拟机,汇总,void,内存,JVM,public,溢出
From: https://www.cnblogs.com/HOsystem/p/17586764.html

相关文章

  • SqlSugar.SqlSugarException: 连接数据库过程中发生错误,证书链是由不受信任的颁发机
    本地代码调试时报错 解决办法:直接在“数据库连接字符串最后面”增加证书信任的配置。;TrustServerCertificate=true ......
  • web浏览器常见错误代码
    浏览器常见错误代码:Http:3xx-重定向301:对象已永久移走,即永久重定向302:对象已临时移走304:未修改307:临时重定向4xx-客户端错误400:错误的请求401:访问被拒绝403:禁止访问404:未找到405:用来访问页面的方法不被允许5xx-服务器错误500:内部服务器错误501:页眉值指定了未实现的......
  • VBA利用transform函数和ADO实现交叉汇总
    VBA中transform函数基本语法:Createsacrosstabquery.SyntaxTRANSFORMaggfunctionselectstatementPIVOTpivotfield[IN(value1[,value2[,...]])]TheTRANSFORMstatementhastheseparts: 假设存在三列数据:受理人、受理日期、业务量,怎么变成表:受理人、(按照受......
  • Java十大经典排序算法汇总
    以下是十大经典排序算法:冒泡排序(BubbleSort):比较相邻两个元素,如果逆序则交换,重复多轮,直到无逆序情况。选择排序(SelectionSort):在待排序元素中选择最小(大)元素,放在已排序序列的起始位置,重复多轮,直到所有元素有序。插入排序(InsertionSort):从第二个元素开始,将每个元素插入到已排序......
  • java启动jar包修改JVM默认内存问题
    JVM默认物理内存JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每......
  • java new date() 错误
    Java中的Date类及其常见错误在Java中,Date类是用于表示日期和时间的类。它提供了一些方法来处理日期和时间的操作。然而,在使用Date类时,有一些常见的错误容易导致程序出现问题。本文将介绍这些错误,并提供代码示例来演示如何正确使用Date类。1.错误示例:使用无参构造函数创建Date对......
  • cpu 操作系统 JVM(大白话)
    大白话直接描述下,cpu,操作系统和jvm:cpu就像健身房的跑步机硬件设备操作系统就是更有权威的大人(有很多权限)jvm及我们写的java应用,或其他用户程序,就像一群小朋友每个小朋友都想在跑步机上玩,大人就需要按某种规则安排(任务调度),只允许玩多久,每次换其他小朋友,都要记录下当前同学的......
  • 【Azure 环境】AAD 注册应用获取AAD Group权限接口遇 403 : Attempted to perform an u
    问题描述通过AzureAD的注册应用获取到Token后,访问AADGroup并查看日志信息时候,遇见了 {"error":{"code":"UnauthorizedAccessException","message":"Attemptedtoperformanunauthorizedoperation."}}Python代码--使用AAD注册应用获取Tokenimportre......
  • JVM系统优化实践(23):GC生产环境案例(6)
    您好,这里是「码农镖局」51CTO博客,欢迎您来,欢迎您再来~在互联网大厂中,对每天亿级流量的日志进行清洗、整理是非常常见的工作。在某个系统中,需要对用户的访问日志做脱敏处理,也就是清洗掉姓名、身份证号、手机号等个人隐私信息后在保存到数据库中或者交付给其他应用使用。系统的设计者......
  • GET chrome-extension://invalid/ net::ERR_FAILED是什么错误
    GETchrome-extension://invalid/net::ERR_FAILED是什么错误错误信息"GETchrome-extension://invalid/net::ERR_FAILED"通常表示在Chrome浏览器中发生了一个资源加载失败的问题。该错误信息表明浏览器尝试获取一个Chrome扩展(chrome-extension)中的资源,但该资源的URL地址是无效......