内存溢出

内存溢出指的是内存中某一块区域的使用量超过了允许使用的最大值,从而使用内存时因空间不足而失败,虚拟机一般会抛出指定的错误。

在Java虚拟机中,只有程序计数器不会出现内存溢出的情况,因为每个线程的程序计数器只保存一个固定长度的地址。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

堆内存溢出

java.lang.OutOfMemoryError: Java heap space

​ 堆内存溢出指的是在堆上分配的对象空间超过了堆的最大大小,从而导致的内存溢出。堆的最大大小使用-Xmx参数进行设置,如-Xmx10m代表最大堆内存大小为10m。

​ Java堆用于储存对象实例,我们只要不断地创建对象,并且保证GC Roots到对象之间有可达路径 来避免垃圾回收机制清除这些对象,那么随着对象数量的增加,总容量触及最大堆的容量限制后就会 产生内存溢出异常。

栈内存溢出

java.lang.OutOfMemoryError: unable to create new native thread

​ 栈内存溢出指的是所有栈帧空间的占用内存超过了最大值,最大值使用-Xss进行设置,比如-Xss256k代表所有栈帧占用内存大小加起来不能超过256k。

方法区内存溢出

java.lang.OutOfMemoryError: Metaspace / PermGen space

方法区内存溢出指的是方法区中存放的内容比如类的元信息超过了方法区内存的最大值,JDK7及之前版本方法区使用永久代(-XX:MaxPermSize=值)来实现,JDK8及之后使用元空间(-XX:MaxMetaspaceSize=值)来实现。

原因:加载的类过多或动态生成类(如反射、CGLIB),超出元空间限制(-XX:MaxMetaspaceSize)。

import javassist.ClassPool;public class MetaspaceOOM {public static void main(String[] args) throws Exception {ClassPool cp = ClassPool.getDefault();for (int i = 0; i < 100000; i++) {// 动态生成类Class<?> clazz = cp.makeClass("MetaspaceOOM" + i).toClass();}}
}

直接内存溢出

java.lang.OutOfMemoryError: Direct buffer memory

​ 直接内存溢出指的是申请的直接内存空间大小超过了最大值,使用 -XX:MaxDirectMemorySize=值 设置最大值。溢出之后会抛出OutOfMemoryError:

总结:

OOM 类型触发原因解决方案
堆内存溢出对象过多/内存泄漏调整 -Xmx,优化代码
元空间溢出动态类过多限制 -XX:MaxMetaspaceSize
栈溢出(线程数过多)线程数超出系统限制使用线程池,调整 -Xss
直接内存溢出NIO 分配过多直接内存调整 -XX:MaxDirectMemorySize
  1. 通过 jstatjmapjstack 监控内存使用。
  2. 生成堆转储文件(-XX:+HeapDumpOnOutOfMemoryError),用 MAT 分析内存泄漏。
  3. 避免过度依赖反射、动态代理等易触发元空间问题的技术。

如何避免 OOM?

1. 堆内存溢出
• 诊断工具:

​ • 使用 jvisualvmMAT(Memory Analyzer Tool)分析堆转储(-XX:+HeapDumpOnOutOfMemoryError)。

​ • 检查是否有内存泄漏(对象被意外长期引用)。

​ • 优化方法:

​ • 调整堆大小(-Xmx-Xms)。

​ • 优化代码,及时释放无用对象(如清理集合、关闭资源)。

​ • 避免创建超大对象(如大数组)。

2. 元空间溢出
• 诊断工具:

​ • 使用 jstat -gcmetacapacity 监控元空间使用情况。

​ • 检查动态生成类的代码(如反射、动态代理)。

​ • 优化方法:

​ • 限制元空间大小(-XX:MaxMetaspaceSize=256m)。

​ • 减少动态类生成(如缓存反射生成的类)。

3. 栈溢出(线程数过多)
• 诊断工具:

​ • 检查线程数(ps -eLf | grep java)。

​ • 分析线程栈(jstack)。

​ • 优化方法:

​ • 减少线程数(使用线程池)。

​ • 调整线程栈大小(-Xss256k)。

4. 直接内存溢出
• 诊断工具:

​ • 监控 java.nio.BitsreservedMemory(NIO 内存使用)。

​ • 优化方法:

​ • 显式释放直接内存(调用 ((DirectBuffer) buffer).cleaner().clean())。

​ • 调整 -XX:MaxDirectMemorySize

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

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

相关文章

dvwa8——SQL Injection(Blind)

由题目得这一关用盲注写 LOW: 先用bp抓包一下 , 看到这low是get提交 , f12打开hackbar 输入?id1时报错 尝试闭合 , 回显正常 开始注入 1.order by 判断列数,3的时候开始回显报错,所以有两列 ?id1 order by 2--&SubmitSubmit# 2.无回显位置可以爆出,我们通过盲注来继…

探索分布式存储与通信:去中心化共享及通訊(DSAC)

在当今数字化时代&#xff0c;分布式系统的重要性愈发凸显。它不仅能提升数据的存储安全性和可靠性&#xff0c;还能增强通信的效率和隐私性。于是我做了这个去中心化共享及通訊的程序&#xff0c;它构建了一个强大的分布式存储和通信网络&#xff0c;下面我们就来详细了解其实…

ass字幕嵌入mp4带偏移

# 格式转化文件&#xff0c;包含多种文件的互相转化&#xff0c;主要与视频相关 from pathlib import Path import subprocess import random import os import reclass Utils(object):staticmethoddef get_decimal_part(x: float) -> float:s format(x, .15f) # 格式化为…

05 APP 自动化- Appium 单点触控 多点触控

文章目录 一、单点触控查看指针的指针位置实现手势密码&#xff1a; 二、多点触控 一、单点触控 查看指针的指针位置 方便查看手势密码-九宫格每个点的坐标 实现手势密码&#xff1a; 执行手势操作&#xff1a; 按压起点 -> 移动到下一点 -> 依次移动 -> 释放&am…

【软件】在 macOS 上安装 MySQL

在 macOS 上安装 MySQL 有多种方法&#xff0c;以下是两种常见的安装方式&#xff1a;通过 Homebrew 安装和通过安装包安装。以下是详细的步骤&#xff1a; 一、通过 Homebrew 安装 MySQL Homebrew 是 macOS 的包管理器&#xff0c;使用它安装 MySQL 非常方便。 1.安装 Home…

第11节 Node.js 模块系统

为了让Node.js的文件可以相互调用&#xff0c;Node.js提供了一个简单的模块系统。 模块是Node.js 应用程序的基本组成部分&#xff0c;文件和模块是一一对应的。换言之&#xff0c;一个 Node.js 文件就是一个模块&#xff0c;这个文件可能是JavaScript 代码、JSON 或者编译过的…

力扣热题100之二叉树的直径

题目 给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 代码 方法&#xff1a;递归 计算二叉树的直径可以理解…

OpenCV CUDA模块图像处理------创建CUDA加速的Canny边缘检测器对象createCannyEdgeDetector()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 该函数用于创建一个 CUDA 加速的 Canny 边缘检测器对象&#xff08;CannyEdgeDetector&#xff09;&#xff0c;可以在 GPU 上高效执行 Canny 边…

unix/linux,sudo,其内部结构机制

我们现在深入sudo的“引擎室”,探究其内部的结构和运作机制。这就像我们从观察行星运动,到深入研究万有引力定律的数学表达和物理内涵一样,是理解事物本质的关键一步。 sudo 的内部结构与机制详解 sudo 的执行流程可以看作是一系列精心设计的步骤,确保了授权的准确性和安…

什么是 TOML?

&#x1f6e0; Rust 配置文件实战&#xff1a;TOML 语法详解与结构体映射&#xff08; 在 Rust 中&#xff0c;Cargo.toml 是每个项目的心脏。它不仅定义了项目的名称、版本和依赖项&#xff0c;还使用了一种轻巧易读的配置语言&#xff1a;TOML。 本文将深入解析 TOML 的语法…

react native webview加载本地HTML,解决iOS无法加载成功问题

在react native中使用 “react-native-webview”: “^13.13.5”,加载HTML文件 Android: 将HTML文件放置到android/src/main/assets目录&#xff0c;访问 {uri: file:///android_asset/markmap/index.html}ios: 在IOS中可以直接可以直接放在react native项目下&#xff0c;访问…

数据结构(JAVA版)练习题

&#xff08;题目难易程度与题号顺序无关哦&#xff09; 目录 1、多关键字排序 2、集合类的综合应用问题 3、数组排序 4、球的相关计算问题 5、利用类对象计算日期 6、日期计算问题 7、星期日期的计算 8、计算坐标平面上两点距离 9、异常处理设计问题 10、Java源文件…

04-redis-分布式锁-redisson

1 基本概念 百度百科&#xff1a;控制分布式系统之间同步访问共享资源方式。 在分布式系统中&#xff0c;常常需要协调他们的动作。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源&#xff0c;那么访问这些资源的时候&#xff0c;往往需要互斥来防止…

性能优化 - 案例篇:缓存_Guava#LoadingCache设计

文章目录 Pre引言1. 缓存基本概念2. Guava 的 LoadingCache2.1 引入依赖与初始化2.2 手动 put 与自动加载&#xff08;CacheLoader&#xff09;2.2.1 示例代码 2.3 缓存移除与监听&#xff08;invalidate removalListener&#xff09; 3. 缓存回收策略3.1 基于容量的回收&…

使用jstack排查CPU飙升的问题记录

最近&#xff0c;看到短视频传播了一个使用jstack来协助排查CPU飙升的案例。我也是比较感兴趣&#xff0c;参考了视频博主的流程&#xff0c;自己做了下对应案例的实战演练&#xff0c;在此&#xff0c;想做一下&#xff0c;针对相关问题模拟与排查演练的实战过程记录。 案例中…

Sql Server 中常用语句

1.创建用户数据库 --创建数据库 use master --切换到master数据库 go-- 终止所有与SaleManagerDB数据库的连接 alter database SaleManagerDB set single_user with rollback immediate goif exists (select * from sysdatabases where nameSaleManagerDB) drop database Sal…

联通专线赋能,亿林网络裸金属服务器:中小企业 IT 架构升级优选方案

在当今数字化飞速发展的时代&#xff0c;中小企业面临着日益增长的业务需求与复杂多变的市场竞争环境。如何构建高效、稳定且具性价比的 IT 架构&#xff0c;成为众多企业突破发展瓶颈的关键所在。而亿林网络推出的 24 核 32G 裸金属服务器&#xff0c;搭配联通专线的千兆共享带…

LangChain核心之Runnable接口底层实现

导读&#xff1a;作为LangChain框架的核心抽象层&#xff0c;Runnable接口正在重新定义AI应用开发的标准模式。这一统一接口设计将模型调用、数据处理和API集成等功能封装为可复用的逻辑单元&#xff0c;通过简洁的管道符语法实现复杂任务的声明式编排。 对于面临AI应用架构选择…

CSP严格模式返回不存在的爬虫相关文件

文章目录 说明示例&#xff08;返回404&#xff09;示例&#xff08;创建CSP例外&#xff09; 说明 日期&#xff1a;2025年6月4日。 CSP严格模式是default-src none&#xff0c;但有些web应用中&#xff0c;在爬虫相关文件不存在的情况下&#xff0c;依旧返回了对应文件&…

DeviceNET从站转EtherNET/IP主站在盐化工行业的创新应用

在工业自动化飞速发展的今天&#xff0c;盐化工行业也在积极探索智能化升级的路径。其中&#xff0c;设备之间的高效通信与协同工作成为了提升生产效率和质量的关键。而JH-DVN-EIP疆鸿智能DeviceNET从站转EtherNET/IP主站的技术应用&#xff0c;为盐化工行业带来了全新的解决方…