【JVM】Java内存溢出分析(堆溢出、栈溢出、方法区溢出、直接内存溢出)

📫作者简介:小明java问道之路2022年度博客之星全国TOP3,专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化,文章内容兼具广度、深度、大厂技术方案,对待技术喜欢推理加验证,就职于知名金融公司后端高级工程师。

        

📫 热衷分享,喜欢原创~ 关注我会给你带来一些不一样的认知和成长。

        

🏆 2022博客之星TOP3 | CSDN博客专家 | 后端领域优质创作者 | CSDN内容合伙人

🏆 InfoQ(极客邦)签约作者、阿里云专家 | 签约博主、51CTO专家 | TOP红人、华为云享专家

        

🔥如果此文还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主~ 


🍅 文末获取联系 🍅  👇🏻 精彩专栏推荐订阅收藏 👇🏻

专栏系列(点击解锁)

学习路线(点击解锁)

知识定位

🔥Redis从入门到精通与实战🔥

Redis从入门到精通与实战

围绕原理源码讲解Redis面试知识点与实战

🔥MySQL从入门到精通🔥

MySQL从入门到精通

全面讲解MySQL知识与企业级MySQL实战

🔥计算机底层原理🔥

深入理解计算机系统CSAPP

以深入理解计算机系统为基石,构件计算机体系和计算机思维

Linux内核源码解析

围绕Linux内核讲解计算机底层原理与并发

🔥数据结构与企业题库精讲🔥

数据结构与企业题库精讲

结合工作经验深入浅出,适合各层次,笔试面试算法题精讲

🔥互联网架构分析与实战🔥

企业系统架构分析实践与落地

行业最前沿视角,专注于技术架构升级路线、架构实践

互联网企业防资损实践

互联网金融公司的防资损方法论、代码与实践

🔥Java全栈白宝书🔥

精通Java8与函数式编程

本专栏以实战为基础,逐步深入Java8以及未来的编程模式

深入理解JVM

详细介绍内存区域、字节码、方法底层,类加载和GC等知识

深入理解高并发编程

深入Liunx内核、汇编、C++全方位理解并发编程

Spring源码分析

Spring核心七IOC/AOP等源码分析

MyBatis源码分析

MyBatis核心源码分析

Java核心技术

只讲Java核心技术

本文目录

本文导读

一、栈内存溢出

1、死递归

2、线程太多

二、堆内存溢出

1、初始对象太大

2、对象没有回收

3、常量池溢出

三、方法区内存溢出

四、直接内存溢出

总结


本文导读

Java内存溢出的原因为程序在申请内存(堆/栈/方法区/直接内存等等)时,没有足够的内存空间。

内存溢出有几种类型,栈溢出(程序所要求的栈深度过大)、堆溢出(创建对象时如果没有可以分配的堆内存、对象没有被回收)、方法区溢出(Class对象未被释放,Class对象占用信息过多,有过多的Class对象)、直接内存溢出(分配的本地内存大小大于JVM的限制)。

一、栈内存溢出

1、死递归

线程请求的栈深度大于虚拟机所允许的最大深度,将抛出 StackOverflowError,可以写一个死递归程序触发。

Java的栈空间默认是1M大小,可以通过-Xss 调整

public class StackOverFlow {

    public void test(){
        test();//死递归
    }

    public static void main(String[] args)throws Throwable {
        StackOverFlow javaStack = new StackOverFlow();
        javaStack.test();
    }
}

2、线程太多

线程太多会导致栈溢出,抛出 OutOfMemoryError,例如1个方法运行中的对象占用1M内存。同时5000+个线程运行这个方法,如果机器的内存小于5G的话,那么也会发生内存溢出,这种情况会抛出OOM异常。

public class StackOutOfMemoryError {
 
    public static void main(String[] args) {
        StackOutOfMemoryError test = new StackOutOfMemoryError ();
        test.oomMethod();
    }
 
    public void oomMethod(){
        while(true){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    loopMethod();
                }
            }).start();;
        }
    }
 
    private void loopMethod(){
        while(true){
 
        }
    }
}

二、堆内存溢出

1、初始对象太大

创建对象时如果没有可以分配的堆内存,JVM就会抛出 OutOfMemoryError:java heap space 异常。

堆内存可以通过设置JVM初始堆空间和最大堆空间,堆溢出生成快照:

-Xms20M -Xmx20M -XX:+HeapDumpOnOutOfMemoryError

/**
 * VM Args: -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError
 */
public static void main(String[] args) {
    List<byte[]> list = new ArrayList<>();
    int i=0;

    while(true){
        list.add(new byte[5*1024*1024]);
        System.out.println("分配次数:"+(++i));
    }
}

2、对象没有回收

在方法执行中,回收效率不足2%,抛出 OutOfMemoryError: GC overhead limit exceeded。

/**
 *
 * VM Args:-Xms10m -Xmx10m  -Xmn5m -XX:+PrintGCDetails   堆的大小10M
 * 堆内存溢出
 */
public class HeapOom {
   public static void main(String[] args) {
       List<Object> list = new LinkedList<>(); //在方法执行的过程中,它是GCRoots
       int i =0;

       while(true){
           i++;
           if(i%10000==0) 
                System.out.println("i="+i);
           list.add(new Object());
       }
   }
}

3、常量池溢出

JDK 1.8中 PermSize 和 MaxPermGen 已经无效,JDK 1.7 和 1.8 将字符串常量由永久代转移到堆中,并且 JDK 1.8 中已经不存在永久代的结论。

对象实际存储在堆上面,最终会产生堆内存溢出(java.lang.OutOfMemoryError: Java heap space),将堆内存设置为:-Xms5m -Xmx5m。

public class ConstantPoolOOMTest {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        int i=1;
        try {
            while(true){
                list.add(UUID.randomUUID().toString().intern());
                i++;
            }
        } finally {
            System.out.println("运行次数:"+i);
        }
    }
}

三、方法区内存溢出

方法区溢出为,java.lang.OutOfMemoryError: Metaspace,一般发生在动态语言,因为动态语言编译后会放在方法区。

在经常动态生产大量Class的应用中,CGLIb字节码增强,动态语言,大量JSP(JSP第一次运行需要编译成Java类),基于OSGi的应用(同一个类,被不同的加载器加载也会设为不同的类)。如果方法区内存不够大的话也会发生java.lang.OutOfMemoryError: Metaspace溢出。

public class MethodAreaOOMTest {
    public static void main(String[] args) {
        int i=0;
        try {

            while(true){
                Enhancer enhancer = new Enhancer();
                enhancer.setSuperclass(OOMObject.class);
                enhancer.setUseCache(false);
                // 借助CGLib直接操作字节码,生成大量的动态类
                enhancer.setCallback(new MethodInterceptor() {
                    @Override
                    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
                        return proxy.invokeSuper(obj, args);
                    }
                });

                enhancer.create();
                i++;
            }

        } finally{
            System.out.println("运行次数:"+i);
        }
    }
 
    static class OOMObject{
    }
}

四、直接内存溢出

​直接内存溢出( java.lang.OutOfMemoryError: Direct buffer memory)分配的本地内存大小大于JVM的限制。NIO会使用到直接内存,可以通过NIO来模拟。

设置参数: -XX:MaxDirectMemorySize=100m 

/**
 * VM Args:-XX:MaxDirectMemorySize=100m
 * 限制最大直接内存大小100m
 * 直接内存溢出
 */
public class DirectOom {
    public static void main(String[] args) {
        // 直接分配128M的直接内存(100M)
        ByteBuffer bb = ByteBuffer.allocateDirect(128*1024*1204);
    }
}

总结

内存溢出有几种类型,栈溢出(程序所要求的栈深度过大)、堆溢出(创建对象时如果没有可以分配的堆内存、对象没有被回收)、方法区溢出(Class对象未被释放,Class对象占用信息过多,有过多的Class对象)、直接内存溢出(分配的本地内存大小大于JVM的限制)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/145784.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ros 使用turtlesim包报错

ros 使用turtlesim包报错 rosrun] Couldn’t find executable named turtlesim_node below /opt/ros/noetic/share/turtlesim 先说一下前提&#xff0c;我的命名空间是demo03-ws&#xff0c;创建了一个功能包叫rename01_node,下面编写了一个launch文件&#xff0c;如下 希望…

2023nacos源码解读第3集——nacos-client核心功能之微服务调用和配置管理测试

文章目录 1、测试项目2、项目注意事项3、 测试核心功能3.1 测试服务调用与负载均衡3.2 测试配置监听 4、参考文档 1、测试项目 项目地址 nacos-service-a nacos-service-b 2、项目注意事项 项目初始化可以使用aliyun spring initializer ,以更方便的使用springcloud alibaba…

CleanMyMac4.14中文免费版mac系统管理软件

许多小伙伴使用Mac后都反馈电脑不如想象中的流畅&#xff0c;甚至有点卡顿的现象&#xff0c;原因可能是因为无用的应用占据了过多的内存&#xff0c;或者是系统盘垃圾过多&#xff0c;导致的电脑卡顿现象。 今天小编教给大家几招&#xff0c;让自己的Mac能够一键重生&#xf…

自律性差怎么办,如何提高自律能力?

自律的力量是强大的&#xff0c;当然一个人不自律也没啥大不了的事&#xff0c;毕竟不自律的人才是大多数&#xff0c;但是当你想要有所成就的时候&#xff0c;那你就必须要学会自律&#xff0c;提高自律。 如果一个人缺乏自律性&#xff0c;那么学生时代肯定成绩不稳定&#…

线性模型拟合非线性数据中,如何找到最优的【分箱】数

具体的数据可以回看上一条博客。我们先来始化三个空列表&#xff0c;用于存储后续计算的预测得分、交叉验证得分的平均值和交叉验证得分的方差。 pred,score,var [], [], [] 2. 再定义一个列表&#xff0c;包含了我们想要尝试的分箱数量。 binsrange [2,5,10,15,20,30] 3…

MySQL学习day02

一、SQL通用语法 1&#xff09;SQL语句可以单行或多行书写&#xff0c;以分号结尾 2&#xff09;SQL语句可以使用空格/缩进来增强语句的可读性 3&#xff09;MySQL数据库的SQL语句不区分大小写&#xff0c;关键字建议使用大写 4&#xff09;注释&#xff1a; a)单行注释&#x…

深度学习+opencv+python实现昆虫识别 -图像识别 昆虫识别 计算机竞赛

文章目录 0 前言1 课题背景2 具体实现3 数据收集和处理3 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数&#xff1a;2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络 4 MobileNetV2网络5 损失函数softmax 交叉熵5.1 softmax函数5.2 交叉熵损失函数 6 优化器SGD7 学…

【软考篇】中级软件设计师 第一部分

中级软件设计师 第一部分 一. 计算机硬件1.1 运算器1.2 控制器 二. 数据的进制2.1 数的表示2.2 数的编码方式2.2.1 数据运算用补码运算 2.3 码制的取值范围2.3.1 例题一 三. 浮点的表示3.1 浮点数运算 四. 运算符五. 校验码5.1 海明校验码 六. 计算机指令6.1 计算机体系结构分类…

【unity插件】UGUI的粒子效果(UI粒子)—— Particle Effect For UGUI (UI Particle)

文章目录 前言插件地址描述特征Demo 演示如何玩演示对于 Unity 2019.1 或更高版本对于 Unity 2018.4 或更早版本 用法基本上是用法使用您现有的 ParticleSystem 预制件带 Mask 或 RectMask2D 组件脚本用法UIParticleAttractor 组件开发说明常见问题解答&#xff1a;为什么我的粒…

MySQL--MHA高可用

MHA相关知识 1.什么是MHA MHA&#xff08;MasterHigh Availability&#xff09;是一套优秀的MySQL高可用环境下故障切换和主从复制的软件MHA 的出现就是解决MySQL 单点故障的问题。目的&#xff1a;MySQL故障切换过程中&#xff0c;MHA能做到0-30秒内自动完成故障切换操作。MH…

Vue3:父组件向子组件传值(Props)

背景 在Vue3项目里&#xff0c;页面A&#xff08;在views文件夹里&#xff09;需要读取某个接口的数据&#xff0c;而页面A引入的组件a&#xff08;在components文件夹里&#xff09;也需要读取该接口的数据为了避免重复读取数据从而造成资源浪费&#xff0c;可以利用传值来实…

YOLO目标检测——苹果缺陷检测数据集下载分享【含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;苹果质量检测和自动化分拣系统数据集说明&#xff1a;苹果缺陷检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富&#xff0c;含有缺陷图片和没缺陷图片。标签说明&#xff1a;使用lableimg标注软件标注&#xff0c;标注框质量…

快速掌握华为VRP系统的CLI管理技巧,让你轻松玩转命令行!

华为VRP基础 基本概述 VRP(通用路由平台) 系统软件&#xff1a;.cc 配置文件&#xff1a;.cfg,.zip,.dat 补丁文件&#xff1a;.pat paf文件&#xff1a;.bin 设备初始化&#xff1a; 设备管理方式&#xff1a; WEB网管&#xff1a;配置与设备同网段IP地址&#xff0c;使用浏览…

发疯买了200片51,我能做点什么?

发疯买了200片51&#xff0c;我能做点什么? 对于电子元件我喜欢以5个作为一个基数&#xff0c;因为考虑的焊接失误&#xff0c;烧冒烟等等因素&#xff0c;5个芯片也足以出一套方案样机。有时候遇到网上芯片做活动&#xff0c;也会屯一点&#xff0c;一般不超过4个基数。pcb和…

Django(五、视图层)

文章目录 一、视图层1.视图函数返回值的问题2.三板斧的使用结论&#xff1a;在视图文件中写视图函数的时候不能没有返回值&#xff0c;默认返回的是None&#xff0c;但是页面上会报错&#xff0c;用来处理请求的视图函数都必须返回httpResponse对象。 二、JsonReponse序列化类的…

Elasticsearch 面试题

文章目录 Elasticsearch 读取数据您能解释一下 X-Pack for Elasticsearch 的功能和重要性吗&#xff1f;Elasticsearch 中的节点&#xff08;比如共 20 个&#xff09;&#xff0c;其中的 10 个选了 一个master&#xff0c;另外 10 个选了另一个 master&#xff0c;怎么办&…

信息系统项目管理师(第四版)教材精读思维导图-第十五章到二十四章

请参阅我的另一篇文章&#xff0c;综合介绍软考高项&#xff1a; 信息系统项目管理师&#xff08;软考高项&#xff09;备考总结_计算机技术与软件专业技术_铭记北宸的博客-CSDN博客 ​ 思维导图源文件下载链接&#xff1a; 十五章风险管理 十六章采购管理 十七章干系人管理…

2023年【陕西省安全员C证】新版试题及陕西省安全员C证考试试卷

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年陕西省安全员C证新版试题为正在备考陕西省安全员C证操作证的学员准备的理论考试专题&#xff0c;每个月更新的陕西省安全员C证考试试卷祝您顺利通过陕西省安全员C证考试。 1、【多选题】下列关于安全帽&#xf…

【数据结构 | 链表】leetcode 2. 两数相加

个人主页&#xff1a;兜里游客棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里游客棉花糖 原创 收录于专栏【LeetCode】 原题链接&#xff1a;点击直接跳转到该题目 目录 题目描述解题代码 题目描述 给你两个 非空 的链表&#xff0c;表示两个非…

【Python3】【力扣题】263. 丑数

【力扣题】题目描述&#xff1a; 此题&#xff1a;正整数n&#xff0c;能被2或3或5整除&#xff0c;且不断除以2或3或5最终的数是1。 【Python3】代码&#xff1a; 1、解题思路&#xff1a;递归。 知识点&#xff1a;递归&#xff1a;函数中调用函数自身&#xff08;必须有退…
最新文章