【Java】常见内存溢出OOM

news2024/11/20 15:37:46

文章目录

  • 前言
  • 一、定义
  • 二、 为什么会OOM?
  • 三、JVM内存模型
  • 四、OOM常见类型
    • 4.1 java堆内存溢出
    • 4.2 方法区溢出
    • 4.3 JAVA虚拟机栈溢出
  • 五、OOM分析--heapdump
  • 总结

前言

一、定义

  • 内存溢出: out of memory,OOM,全称“Out Of Memory”,翻译成中文就是“内存用完了”,来源于java.lang.OutOfMemoryError。看下关于的官方说明:

    Thrown when the Java Virtual Machine cannot allocate an object because it is out of memory, and no more memory could be made available by the garbage collector.

    意思就是说,当JVM因为没有足够的内存来为对象分配空间并且垃圾回收器也已经没有空间可回收时,就会抛出这个error(注:非exception,因为这个问题已经严重到不足以被应用处理)。

    是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。

  • 内存泄露: memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。
    memory leak会最终会导致out of memory!

二、 为什么会OOM?

为什么会没有内存了呢?原因不外乎有两点:

  1. 分配的少了:比如虚拟机本身可使用的内存(一般通过启动时的VM参数指定)太少。
  2. 应用用的太多,并且用完没释放,浪费了。此时就会造成内存泄露或者内存溢出。

内存泄露:申请使用完的内存没有释放,导致虚拟机不能再次使用该内存,此时这段内存就泄露了,因为申请者不用了,而又不能被虚拟机分配给别人用。

内存溢出:申请的内存超出了JVM能提供的内存大小,此时称之为溢出。

在之前没有垃圾自动回收的日子里,比如C语言和C++语言,我们必须亲自负责内存的申请与释放操作,如果申请了内存,用完后又忘记了释放,比如C++中的new了但是没有delete,那么就可能造成内存泄露。偶尔的内存泄露可能不会造成问题,而大量的内存泄露可能会导致内存溢出。

而在Java语言中,由于存在了垃圾自动回收机制,所以,我们一般不用去主动释放不用的对象所占的内存,也就是理论上来说,是不会存在“内存泄露”的。但是,如果编码不当,比如,将某个对象的引用放到了全局的Map中,虽然方法结束了,但是由于垃圾回收器会根据对象的引用情况来回收内存,导致该对象不能被及时的回收。如果该种情况出现次数多了,就会导致内存溢出,比如系统中经常使用的缓存机制。Java中的内存泄露,不同于C++中的忘了delete,往往是逻辑上的原因泄露。

三、JVM内存模型

在这里插入图片描述

按照JVM规范,JAVA虚拟机在运行时会管理以下的内存区域:

  • 程序计数器:当前线程执行的字节码的行号指示器,线程私有
  • JAVA虚拟机栈:Java方法执行的内存模型,每个Java方法的执行对应着一个栈帧的进栈和出栈的操作。
  • 本地方法栈:类似“ JAVA虚拟机栈 ”,但是为native方法的运行提供内存环境。
  • JAVA堆:对象内存分配的地方,内存垃圾回收的主要区域,所有线程共享。可分为新生代,老生代。
  • 方法区:用于存储已经被JVM加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。Hotspot中的“永久代”。
  • 运行时常量池:方法区的一部分,存储常量信息,如各种字面量、符号引用等。
  • 直接内存:并不是JVM运行时数据区的一部分, 可直接访问的内存, 比如NIO会用到这部分。
    按照JVM规范,除了程序计数器不会抛出OOM外,其他各个内存区域都可能会抛出OOM。

四、OOM常见类型

最常见的OOM情况有以下三种:

4.1 java堆内存溢出

  • java堆内存溢出 java.lang.OutOfMemoryError: Java heap space,此种情况最常见,一般由于内存泄露或者堆的大小设置不当引起。对于内存泄露,需要通过内存监控软件查找程序中的泄露代码,而堆大小可以通过虚拟机参数-Xms,-Xmx等修改。

4.2 方法区溢出

  • 方法区溢出 java永久代溢出 java.lang.OutOfMemoryError: PermGen space 一般出现于大量Class或者jsp页面,或者采用cglib等反射机制的情况,因为上述情况会产生大量的Class信息存储于方法区。此种情况可以通过更改方法区的大小来解决,使用类似-XX:PermSize=64m -XX:MaxPermSize=256m的形式修改。另外,过多的常量尤其是字符串也会导致方法区溢出。

4.3 JAVA虚拟机栈溢出

  • JAVA虚拟机栈溢出 java.lang.StackOverflowError 不会抛OOM error,但也是比较常见的Java内存溢出。JAVA虚拟机栈溢出,一般是由于程序中存在死循环或者深度递归调用造成的,栈大小设置太小也会出现此种溢出。可以通过虚拟机参数-Xss来设置栈的大小。

五、OOM分析–heapdump

要dump堆的内存镜像,可以采用如下两种方式:

  • 设置JVM参数-XX:+HeapDumpOnOutOfMemoryError,设定当发生OOM时自动dump出堆信息。不过该方法需要JDK5以上版本。
  • 使用JDK自带的jmap命令。"jmap -dump:format=b,file=heap.bin <pid>" 其中pid可以通过jps获取。

dump堆内存信息后,需要对dump出的文件进行分析,从而找到OOM的原因。常用的工具有:

  • mat: eclipse memory analyzer, 基于eclipse RCP的内存分析工具。详细信息参见:http://www.eclipse.org/mat/,推荐使用。
  • jhat:JDK自带的java heap analyze tool,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言OQL,分析相关的应用后,可以通过http://localhost:7000来访问分析结果。不推荐使用,因为在实际的排查过程中,一般是先在生产环境 dump出文件来,然后拉到自己的开发机器上分析,所以,不如采用高级的分析工具比如前面的mat来的高效。

这个链接:http://www.ibm.com/developerworks/cn/opensource/os-cn-ecl-ma/index.html中提供了一个采用mat分析的例子 。

注意:因为JVM规范没有对dump出的文件的格式进行定义,所以不同的虚拟机产生的dump文件并不是一样的。在分析时,需要针对不同的虚拟机的输出采用不同的分析工具(当然,有的工具可以兼容多个虚拟机的格式)。IBM HeapAnalyzer也是分析heap的一个常用的工具。

总结

涉及到的虚拟机的技术或者工具,往往需要考虑到虚拟机规范以及不同的虚拟机实现。尤其是针对虚拟机调优时,往往需要针对虚拟机在某些方面的实现策略来考虑,比如,不同的虚拟机的垃圾回收算法是不一样的,而这直接影响了虚拟机某些参数的设置,以达到虚拟机的最佳性能。

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

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

相关文章

西门子S7-1200 PLC之间无线PROFINET通信

西门子S7-1200 PLC 使用Profinet通讯时&#xff0c;一个做Profinet IO控制器&#xff0c;一个做Profinet IO设备。一个Profinet IO控制器可以最多支持16个Profinet IO设备&#xff0c;Profinet通讯不使用通讯指令&#xff0c;只需要配置好数据传输地址&#xff0c;就能够实现数…

睿铂在广东,自然资源部经济管理科学研究所“多测合一”项目分享

引言 DG4 Pros倾斜摄影相机作为睿铂旗舰系列产品&#xff0c;它的硬件与软件配置都无愧于其顶级倾斜相机的称号。在它的帮助下&#xff0c;客户得以挑战很多以往受限于设备技术条件&#xff0c;实施起来非常困难的项目。 本次&#xff0c;自然资源部经济管理科学研究所&#…

App Store上线APP流程

现在App Store上已经有数百万款应用&#xff0c;因此对于App的规范要求也越来越高&#xff0c;对于新上线的APP需要满足这些规则并不是件容易的事。今天和大家分享这方面的知识&#xff0c;希望大家喜欢。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff…

Mysql中存储引擎的区别及比较

MyISAM存储引擎 MyISAM基于ISAM存储引擎&#xff0c;并对其进行扩展。它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。MyISAM拥有较高的插入、查询速度&#xff0c;但不支持事务。 MyISAM主要特性有&#xff1a; 1、大文件&#xff08;达到63位文件长度&#…

AI人工智能随机森林分类器的原理、优缺点、应用场景和实现方法

随机森林分类器&#xff08;Random Forest Classifier&#xff09;是一种常用的机器学习算法&#xff0c;它是基于决策树的一种集成学习方法。在人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;领域中&#xff0c;随机森林分类器是一种高效的算法&…

艺术签名免费设计的方法分享,快来收下

在今天的数字时代&#xff0c;艺术签名已经成为一个流行的趋势。无论是在社交媒体上&#xff0c;还是在个人品牌推广中&#xff0c;艺术签名都是一个重要的元素。但是&#xff0c;对于很多人来说&#xff0c;设计一个独特的艺术签名可能需要付出昂贵的代价。然而&#xff0c;有…

flstudio21更新内容介绍FL水果2023旗舰版下载

昨天为大家展示了 FL STUDIO21 新增的插件&#xff0c;今天让我们看一看还有哪些新变化&#xff1f;FL Studio中文版惯称水果, 是一个完整的电音软件音乐制作环境或数字音频工作站。是现在流行的数字音频工作站之一,包括撰写,整理,记录,编辑,电音,混音和掌握专业品质的音乐。 0…

Open Ai 常见接口参数说明以及常见报错总结

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…

【SPSS】生存-寿命表分析详细操作教程(附案例实战)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

Plc能否通过以太网网关实现无线数据交互?

西门子S7-1200 PLC 使用Profinet通讯时&#xff0c;一个做Profinet IO控制器&#xff0c;一个做Profinet IO设备。一个Profinet IO控制器可以最多支持16个Profinet IO设备&#xff0c;Profinet通讯不使用通讯指令&#xff0c;只需要配置好数据传输地址&#xff0c;就能够实现数…

Cesium 实战 - 模型亮度调整(解决模型非常暗的问题)

Cesium 实战 - 模型亮度调整&#xff08;解决模型非常暗的问题&#xff09; 环境版本试错过程解决问题在线示例 在某个项目中&#xff0c;遇到个问题&#xff0c;模型加载之后非常暗&#xff0c;经其他软件确认&#xff0c;模型本身正常&#xff0c;但是通过 Cesium 加载之后就…

Vue3项目技巧(更新中ing)

文章目录 axios封装http.jstestAPI.jsmain.js测试如果项目中需要多个baseURL 自动导入scss文件案例文件使用案例 引入aliyun图标库先看效果查看官网文档引入并使用 vueuse实现-吸附导航交互安装案例 多个组件共享的请求、数据、封装到pinia案例父组件中调用子组件中应用 axios封…

django admin后台管理系统中配置可上传多张图片功能

目录 一、默认的常规方式只能上传一张图片的示例 二、配置可上传多张图片 问题&#xff1a;在django自带的admin后台管理系统中常规的方式只能上传一张图片&#xff0c;无法上传添加多张图片&#xff0c;如下图。所以现在需要配置可上传多张图片的功能&#xff01; 一、默认的…

【Atlas200】Host?Device?RC?EP?

目录 atlas500的ep模式Atlas 200 DK的host侧内存地址的分配Device侧内存管理内存的拷贝复用方案atlas500的ep模式 如上图所示,cpu+内存一侧为host侧;而gpu+显存一侧为device侧。 Atlas 200 DK的 在昇腾310AI处理器(NPU)中,Davinci Core负责专用计算,而Control CPU则负责…

拉电流 、灌电流、吸收电流

单片机的引脚&#xff0c;可以用程序来控制&#xff0c;输出高、低电平&#xff0c;这些可算是单片机的输出电压。但是程序控制不了单片机的输出电流。单片机的输出电流&#xff0c;很大程度上是取决于引脚上的外接器件。 什么是拉电流 、灌电流、吸收电流 ? 51单片机的IO口驱…

SpringCloud(28. 分布式会话与分布式事务)

上一篇&#xff1a;27. Redis 和 ZK 分布式锁 文章目录 1. 集群部署时的分布式 session 如何实现&#xff1f;2. 分布式事务方案2.1 两阶段提交方案/XA方案2.2 TCC 方案2.3 本地消息表2.4 可靠消息最终一致性方案2.5 最大努力通知方案 1. 集群部署时的分布式 session 如何实现&…

极狐(GitLab) 重磅发布新产品「极狐星」,让研发效能看得清,算得准,成就企业精英效能管理

在研发驱动业务增长的今天&#xff0c;越来越多的研发管理者发现&#xff1a; 总是觉得研发资源不够用&#xff1f; 如何用数据衡量研发效能&#xff1f; 如何定位软件交付瓶颈&#xff1f; 怎样管理并预警项目状态&#xff1f; 想尽早发现代码泄露风险怎么办&#xff1f;…

GPS轨迹在Three.js中的地理对齐和显示

如何使用 three.js 可视化 GPS 轨迹&#xff1f; 棘手的部分是获得正确的投影&#xff0c;以便 GPS 轨迹与我的 Jotunheimen 地形图对齐。 在 D3.js 的帮助下&#xff0c;我能够做我想做的事。 推荐&#xff1a;用 NSDT设计器 快速搭建可编程3D场景。 我将使用我之前在 Leaflet…

二十三种设计模式第八篇--装饰器模式

装饰器模式是一种结构型设计模式&#xff0c;它允许在不改变对象原有结构的情况下&#xff0c;动态地添加新的行为或功能。装饰器模式通过将对象包装在一个装饰器对象中&#xff0c;来实现对对象的功能扩展。装饰器对象与被装饰对象具有相同的接口&#xff0c;因此可以无缝地替…