JAVA聚焦OutOfMemoryError 异常

个人主页
文章专栏

在这里插入图片描述

在正文开始前,我想多说几句,也就是吐苦水吧…最近这段时间一直想写点东西,停下来反思思考一下。

心中万言,真正执笔时又不知先写些什么。通常这个时候,我都会随便写写,文风极像散文,形散意不散吧!

先说一下近况,最近参加了Mathorlab数学建模,作为一个大一的学生,第一次参加那么高强度的竞赛。深深的意识到自己的不足,天之大,不过蚍蜉撼树。我不过是渺小的沧海一粟。竟欲与苍天比高,不自量力、痴人说梦。梦醒了,还是得加油干…高考后,天真的以为自己不用学习了,后来发现,自己一辈子都要学习。害,挺难过的,也挺无助的。

我,出现在这里。可能你们以为我是理科生,工科女…哦不!我江苏高考纯文出身,这像极了案底。高二下之前,我的确是根正苗红的物化生。可惜,尔辈不能究物理。我无比后悔当时的决定,可是人是不会满足的,那时候不管学啥,我都会后悔。用现在的眼光,去埋怨当时的自己。这像极了霸凌…

我本科财务管理专业,但是我偏离了轨道。去学了计算机…午夜梦回,总会觉着自己可笑。一个文科生,还不是很好的大学,去学了计算机…很疯狂!看到这儿,你可能会笑话我…太不自量力了!但是,哎!

其实,当我步入大学没多久我就意识到这个轨道的尽头是什么。

如果你问我读书的意义是什么?上年这个时候,我可能还会说:为天地立心,为生民立命…多么正气,多么理想化!但是,现在我只想以后我有能力养活自己。

唉,我也不知道我的选择是不是正确的。我也不知道,我未来的我怎么去看待这个选择,越想越内耗。

我和我朋友说,我考研要考南京邮电大学…我也不知道未来怎么样,这是19岁的我选择的最适合我的出路了。反正认准了就好好去努力吧。就算错了,从头再来就是了。我才不过19岁,我最大的优势就是年轻…

共勉吧!

文章目录

    • 一、Java 堆溢出
      • 原理
      • 示例代码
      • 解决思路
    • 二、虚拟机栈和本地方法栈溢出
      • 原理
      • 示例代码
      • 解决思路
    • 三、方法区和运行时常量池溢出
      • 原理
      • 示例代码
      • 解决思路
    • 四、直接内存溢出
      • 原理
      • 示例代码

在 Java 开发中,内存溢出异常是影响程序稳定性的关键问题。了解其原理和应对方法,对开发者至关重要。

一、Java 堆溢出

原理

Java 堆用于存储对象实例。不断创建对象,且阻止垃圾回收器回收,对象数量超出堆容量时,就会引发堆溢出。

示例代码

// VM Args: -Xmx20m -Xms20m -XX:+HeapDumpOnOutOfMemoryError
public class HeapOOM {static class OOMObject {}public static void main(String[] args) {List<OOMObject> list = new ArrayList<>();while (true) {list.add(new OOMObject());}}
}

解决思路

  • 利用内存映像分析工具(如 Eclipse Memory Analyzer )分析堆转储快照。
  • 区分内存泄漏和内存溢出:若存在无用对象长期占用内存,是内存泄漏;若对象都有用但堆空间不足,可调整堆参数(-Xmx 与 - Xms ),并优化代码减少内存占用。

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

原理

  • 线程请求栈深度超虚拟机允许值,抛出StackOverflowError
  • 虚拟机栈若支持动态扩展,扩展时内存申请失败,抛出OutOfMemoryError (HotSpot 不支持栈动态扩展 )。

示例代码

  • 测试StackOverflowError
// VM Args: -Xss128k
public class JavaVMStackSOF {private int stackLength = 1;public void stackLeak() {stackLength++;stackLeak();}public static void main(String[] args) throws Throwable {JavaVMStackSOF oom = new JavaVMStackSOF();try {oom.stackLeak();} catch (Exception e) {System.out.println("stack length:" + oom.stackLength);throw e;}}
}
  • 测试大量线程导致内存溢出
// VM Args: -Xss2M
public class JavaVMStackOOM {private void dontStop() {while (true) {}}public void stackLeakByThread() {while (true) {Thread thread = new Thread(() -> dontStop());thread.start();}}public static void main(String[] args) throws Throwable {JavaVMStackOOM oom = new JavaVMStackOOM();oom.stackLeakByThread();}
}

解决思路

  • 出现StackOverflowError 时,可根据错误堆栈分析递归调用等问题代码。
  • 对于大量线程导致的内存溢出,可减少线程数量、调整栈内存大小(-Xss ),或升级 64 位虚拟机以获取更多内存。

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

原理

  • 方法区存储类信息、常量池等。运行时动态生成大量类(如使用 CGLib ),会耗尽方法区空间。
  • 运行时常量池是方法区一部分,字符串操作(如String.intern() )不当,可能导致常量池溢出。

示例代码

  • 方法区溢出测试(借助 CGLib )
// VM Args: -XX:PermSize=10M -XX:MaxPermSize=10M
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class JavaMethodAreaOOM {static class OOMObject {}public static void main(String[] args) {while (true) {Enhancer enhancer = new Enhancer();enhancer.setSuperclass(OOMObject.class);enhancer.setUseCache(false);enhancer.setCallback(new MethodInterceptor() {@Overridepublic Object intercept(Object obj, java.lang.reflect.Method method, Object[] args, MethodProxy proxy) throws Throwable {return proxy.invokeSuper(obj, args);}});enhancer.create();}}
}
  • 运行时常量池溢出测试(String.intern()
// JDK 6 运行:-XX:PermSize=6M -XX:MaxPermSize=6M
// JDK 7及以上运行:-Xmx6M
public class RuntimeConstantPoolOOM {public static void main(String[] args) {String str1 = new StringBuilder("计算机").append("软件").toString();System.out.println(str1.intern() == str1); String str2 = new StringBuilder("ja").append("va").toString();System.out.println(str2.intern() == str2); }
}

解决思路

  • 方法区溢出时,调整方法区相关参数(如 JDK 8 前的 - XX:PermSize 和 - XX:MaxPermSize ,JDK 8 及以后的 - XX:MetaspaceSize 等 ),优化代码减少动态类生成。
  • 针对常量池溢出,合理使用String.intern() 方法,避免无意义的字符串入池操作。

四、直接内存溢出

原理

直接内存容量由-XX:MaxDirectMemorySize 参数控制,默认与 Java 堆最大值相同。直接或间接使用DirectByteBufferUnsafe 等分配内存超出限制,会引发溢出。

示例代码

// VM Args: -Xmx20M -XX:MaxDirectMemorySize=10M
import sun.misc.Unsafe;
import java.lang.reflect.Field;
public class DirectMemoryOOM {private static final int _1MB = 1024 * 1024;public static void main(String[] args) throws Exception {Field unsafeField = Unsafe.class.getDeclaredFields()[0];unsafeField.setAccessible(true);Unsafe unsafe = (Unsafe) unsafeField.get(null);while (true) {unsafe.allocateMemory(_1MB);}}
}

解决思路

  • 合理设置-XX:MaxDirectMemorySize 参数。
  • 排查代码中直接内存分配操作,如 NIO 相关代码,确保内存分配合理。

ld.get(null);
while (true) {
unsafe.allocateMemory(_1MB);
}
}
}


解决思路- 合理设置`-XX:MaxDirectMemorySize` 参数。
- 排查代码中直接内存分配操作,如 NIO 相关代码,确保内存分配合理。通过深入理解 Java 内存溢出异常原理,结合具体代码示例和解决思路,开发者能更好地定位和解决内存问题,保障 Java 程序稳定运行。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在Spring Boot中配置自定义端口运行应用程序

Spring Boot 应用程序默认在端口 8080 上运行嵌入式 Web 服务器&#xff08;如 Tomcat、Jetty 或 Undertow&#xff09;。然而&#xff0c;在开发、测试或生产环境中&#xff0c;开发者可能需要将应用程序配置为在自定义端口上运行&#xff0c;例如避免端口冲突、适配微服务架构…

linux嵌入式(进程与线程1)

Linux进程 进程介绍 1. 进程的基本概念 定义&#xff1a;进程是程序的一次执行过程&#xff0c;拥有独立的地址空间、资源&#xff08;如内存、文件描述符&#xff09;和唯一的进程 ID&#xff08;PID&#xff09;。 组成&#xff1a; 代码段&#xff1a;程序的指令。 数据…

智驭未来:NVIDIA自动驾驶安全白皮书与实验室创新实践深度解析

一、引言&#xff1a;自动驾驶安全的范式革新 在当今数字化浪潮的推动下&#xff0c;全球自动驾驶技术正大步迈入商业化的深水区。随着越来越多的自动驾驶车辆走上道路&#xff0c;其安全性已成为整个行业乃至社会关注的核心命题。在这个关键的转折点上&#xff0c;NVIDIA 凭借…

多模态大模型 Qwen2.5-VL 的学习之旅

Qwen-VL 是阿里云研发的大规模视觉语言模型&#xff08;Large Vision Language Model, LVLM&#xff09;。Qwen-VL 可以以图像、文本、检测框作为输入&#xff0c;并以文本和检测框作为输出。Qwen-VL 系列模型性能强大&#xff0c;具备多语言对话、多图交错对话等能力&#xff…

Redis 与 Memcache 全面对比:功能、性能与应用场景解析

Redis 和 Memcache 都是常用的内存数据库&#xff0c;以下是它们在多个方面的能力比较&#xff1a; 一、数据类型 Redis&#xff1a;支持丰富的数据类型&#xff0c;如字符串&#xff08;String&#xff09;、哈希&#xff08;Hash&#xff09;、列表&#xff08;List&#x…

Oracle--PL/SQL编程

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 PL/SQL&#xff08;Procedural Language/SQL&#xff09;是Oracle数据库中的一种过程化编程语言&#xff0c;构建于SQL之上&#xff0c;允许编写包含S…

新增优惠券

文章目录 概要整体架构流程技术细节小结 概要 接口分析 一个基本的新增接口&#xff0c;按照Restful风格设计即可&#xff0c;关键是请求参数。之前表分析时已经详细介绍过这个页面及其中的字段&#xff0c;这里不再赘述。 需要特别注意的是&#xff0c;如果优惠券限定了使…

力扣面试经典150题(第二十三题)- KMP算法

问题 给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不是 haystack 的一部分&#xff0c;则返回 -1 。 示例 1&#xff1a; 输入&#xff1a;haysta…

PostgreSQL 的 MVCC 机制了解

PostgreSQL 的 MVCC 机制了解 PostgreSQL 使用多版本并发控制(MVCC)作为其核心并发控制机制&#xff0c;这是它与许多其他数据库系统的关键区别之一。MVCC 允许读操作不阻塞写操作&#xff0c;写操作也不阻塞读操作&#xff0c;从而提供高度并发性。 一 MVCC 基本原理 1.1 M…

互联网大厂Java面试:RocketMQ、RabbitMQ与Kafka的深度解析

互联网大厂Java面试&#xff1a;RocketMQ、RabbitMQ与Kafka的深度解析 面试场景 面试官&#xff1a;马架构&#xff0c;您好&#xff01;欢迎参加我们的面试。今天我们将围绕消息中间件展开讨论&#xff0c;尤其是RocketMQ、RabbitMQ和Kafka。您有十年的Java研发和架构设计经…

《巧用DeepSeek快速搞定数据分析》书籍分享

文章目录 前言内容简介作者简介购书链接书籍目录 前言 随着大数据时代的到来&#xff0c;数据分析和人工智能技术正迅速改变着各行各业的运作方式。DeepSeek作为先进的人工智能模型&#xff0c;不仅在自然语言处理领域具有广泛应用&#xff0c;还在数据分析、图像识别、推荐系…

4.Three.js 中 Camera 摄像机详解

一、什么是 Camera&#xff1f; 在 Three.js 中&#xff0c;Camera&#xff08;摄像机&#xff09;决定了我们如何观察三维场景。 你可以把它理解为我们“眼睛”的位置和方向&#xff0c;场景中的物体再复杂&#xff0c;如果没有摄像机&#xff0c;就没有“观察角度”&#x…

gem5-gpu教程03 当前的gem5-gpu软件架构(因为涉及太多专业名词所以用英语表达)

Current gem5-gpu Software Architecture 这是当前gem5-gpu软件架构的示意图。 Ruby是在gem5-gpu上下文中用于处理CPU和GPU之间内存访问的高度可配置的内存系统 CudaCore (src/gpu/gpgpu-sim/cuda_core.*, src/gpu/gpgpu-sim/CudaCore.py) Wrapper for GPGPU-Sim shader_cor…

负载均衡的实现方式有哪些?

负载均衡实现方式常见的有: 软件负载均衡、硬件负载均衡、DNS负载均衡 扩展 二层负载均衡&#xff1a;在数据链路层&#xff0c;基于MAC地址进行流量分发&#xff0c;较少见于实际应用中 三层负载均衡&#xff1a;在网络层&#xff0c;基于IP地址来分配流量&#xff0c;例如某…

MyBatis 和 MyBatis-Plus 在 Spring Boot 中的配置、功能对比及 SQL 日志输出的详细说明,重点对比日志输出的配置差异

以下是 MyBatis 和 MyBatis-Plus 在 Spring Boot 中的配置、功能对比及 SQL 日志输出的详细说明&#xff0c;重点对比日志输出的配置差异&#xff1a; 1. MyBatis 和 MyBatis-Plus 核心对比 特性MyBatisMyBatis-Plus定位基础持久层框架MyBatis 的增强版&#xff0c;提供代码生…

《数据结构世界的乐高积木:顺序表的奇幻旅程》

目录 1. 线性表 2. 顺序表 2.1 概念与结构 2.2 分类 2.2.1 静态顺序表 2.2.2 动态顺序表 2.3 动态顺序表的实现 1. 线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。线性表是⼀种在实际中⼴泛使⽤的数据结构&#xff0c;常⻅的…

RHCE 练习二:通过 ssh 实现两台主机免密登录以及 nginx 服务通过多 IP 区分多网站

一、题目要求 1.配置ssh实现A&#xff0c;B主机互相免密登录 2.配置nginx服务&#xff0c;通过多ip区分多网站 二、实验 实验开始前需准备两台 linux 主机便于充当服务端以及客户端&#xff0c;两台主机 IP 如下图&#xff1a; 实验1&#xff1a;配置 ssh 实现 A&#xff0…

第十五届蓝桥杯 2024 C/C++组 好数

题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; 好数 思路&#xff1a; 第一种思路详解&#xff1a; 因为每次检查数都是从个位开始&#xff0c;所以对于每一个数都是先检查奇数位再检查偶数位&#xff0c;即存在先检查奇数位再检查偶数位的循环。注意一次完…

展锐Android13状态栏默认显示电池电量百分比

展锐Android13电池状态默认不显示电池电量百分比&#xff0c;打开 /frameworks/base/packages/SettingsProvider/res/values/defaults.xml 在xml的文件最后&#xff0c;增加一项配置def_show_battery_percent&#xff1a; <?xml version"1.0" encoding"u…

OpenCV 高斯模糊 cv2.GaussianBlur

OpenCV 高斯模糊 cv2.GaussianBlur flyfish cv2.GaussianBlur 是 OpenCV 库中用于对图像进行高斯模糊处理的函数。 高斯模糊的含义 高斯模糊是一种常见的图像滤波技术&#xff0c;它可以对图像进行平滑处理&#xff0c;减少图像中的噪声和细节&#xff0c;使得图像看起来更…