iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java 常见的几种内存溢出异常的原因及解决
  • 936
分享到

Java 常见的几种内存溢出异常的原因及解决

2024-04-02 19:04:59 936人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录堆内存溢出原因:解决方案:栈内存溢出原因:解决方案:方法区和运行时常量池内存溢出原因:本机直接内存溢出原因:解决方案:元空间内存溢出原因:解决方案:内存溢出的异常有很多,并且每种

内存溢出的异常有很多,并且每种内存溢出都会有不同的异常信息和解决方式,下面会列出常见的几种内存溢出异常

堆内存溢出

java.lang.OutOfMemoryError: Java heap space

原因:

  • 当堆内存不足,并且已经达到JVM设置的最大值,无法继续申请新的内存,存活的对象在堆内存中无法被回收,那么就会抛出该异常,表示堆内存溢出。
  • 当一次从数据库查询大量数据,堆内存没有足够的内存可以存放大量的数据
  • 大量的强引用对象在堆内存中存活,GC无法回收这些对象,新创建的对象在新生代无法进行分配,Full GC仍然无法进行回收

解决方案:

  • 查看当前JVM的堆内存配置是否太小,可以考虑增加堆内存大小

JAVA_OPTS="-server -Xms1024m -Xmx1024m"

表示将堆内存的初始值和最大值都设置为1024m

-Xms设置堆内存的初始值

-Xmx设置堆内存的最大值

-Xms和-Xmx最好设置相同的内存大小,可以防止因为JVM频繁进行内存的调整影响稳定性和使用

  • 查看代码中是否有从数据库中一次加载大量数据的情况,或者代码中有大量强引用无法进行回收

通过JVM参数:-XX:+HeapDumpOnOutOfMemoryError可以让虚拟机在出现内存溢出的时候Dump出当前的堆内存快照,便于保留快照分析

栈内存溢出

java.lang.outOfMemoryError:StackOverFlow Error

原因:

  • 线程请求的栈深度大于虚拟机允许的最大深度,抛出StackOverflowError
  • 虚拟机在扩展栈时无法申请到足够的内存空间,抛出OutOfMemoryError

解决方案:

  • 检查代码是否出现深度递归的情况,或者递归的终止条件没有设置
  • 如果是线程的栈内存空间过小,则通过-Xss设置每个线程的栈内存空间

默认的-Xss参数的大小应该是1M

栈内存是线程私有的,如果需要创建更多的线程,那么就需要将每个线程的栈内存空间减小,通过-Xss参数设置每个线程的栈内存空间

配置参数: JAVA_OPTS="-server -Xms1024m -Xmx1024m -Xss128k"

jdk8如果没有配置-Xss默认大小为512k

-Xss 设置每个线程的堆栈大小,一般默认512~1024kb,和jdk版本有关

方法区和运行时常量池内存溢出

java.lang.outOfMemoryError: PermGen space

原因:

  • 方法区存放的是Class的相关信息,如类名、访问修饰符、常量池、字段描述、方法描述等,内存溢出的原因可能是加载的类过多导致方法区没有足够的内存
  • 如果程序中大量使用cglib或者动态代理等对目标类进行代理,那么在运行时会生成大量的代理类,如spring、Hibernate等框架。所以生成的代理类过多导致方法区没有足够的内存

解决方案:

  • 减少没有必要的Class加载,防止方法区内存溢出并且减少程序的编译时间
  • 通过JVM参数设置方法区的大小,-XX:PermSize和-XX:MaxPermSize设置方法区的大小

运行时常量池是方法区的一部分,所以增加方法区的内存大小,相当于间接的增加了运行时常量池的内存大小

本机直接内存溢出

Direct buffer memory

Java 允许应用程序通过 DirectByteBuffer 直接访问堆外内存,许多高性能程序通过 DirectByteBuffer 结合内存映射文件(Memory Mapped File)实现高速 io

原因:

DirectByteBuffer 的默认大小为 64 MB,一旦使用超出限制,就会抛出 Direct buffer memory 错误。使用NIO则可能会出现该异常

解决方案:

DirectMemory的内存大小可以通过-XX:MaxDirectMemorySize指定,如果没有设置,则默认和Java堆最大值(-Xmx)一样

元空间内存溢出

Metaspace

Jdk8 之后使用元空间(metaspace)代替永久代,元空间和永久代最大的区别是元空间的内存使用的是本地内存,而永久代使用的是JVM的内存

永久代、元空间都是方法区的实现,方法区是规范

原因:

元空间中存储的是类信息、常量池、方法描述等信息,直接使用本地内存,当本地内存不足的时候,会抛出OutOfMemoryError:Metaspace异常

解决方案:

虽然元空间的内存不是由JVM控制,不过可以通过JVM参数来设置分配的内存空间的大小-XX:MaxMetaspaceSize配置参数

以上就是Java 常见的几种内存溢出异常及解决的详细内容,更多关于Java 内存溢出的资料请关注编程网其它相关文章!

--结束END--

本文标题: Java 常见的几种内存溢出异常的原因及解决

本文链接: https://www.lsjlt.com/news/124538.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java 常见的几种内存溢出异常的原因及解决
    目录堆内存溢出原因:解决方案:栈内存溢出原因:解决方案:方法区和运行时常量池内存溢出原因:本机直接内存溢出原因:解决方案:元空间内存溢出原因:解决方案:内存溢出的异常有很多,并且每种...
    99+
    2024-04-02
  • java.lang.NullPointerException异常的几种原因及解决方案
    目录java程序中NullPointerException异常的一些例子。1. 调用实例方法时出现NullPointerException2. 访问/修改null对象的字段时出现Nu...
    99+
    2023-05-18
    java.lang.NullPointerException异常 java.lang.NullPointerException
  • Java编程常见内存溢出异常的示例分析
    小编给大家分享一下Java编程常见内存溢出异常的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Java 堆是用来存储对象实例的, 因此如果我们不断地创建对...
    99+
    2023-05-30
    java
  • 空指针异常出现的几种原因及解决方法
    目录 空指针异常: 空指针容易出现的场景 避免方案 空指针异常: 什么是空,什么是指针? 空就是:小明过生日,小华送给了小明一个“礼物”,这个“礼物”只有一个外面的包装但是里面什么都没有,这个礼物就是"",而空则是小华压根没有给小...
    99+
    2023-09-01
    java
  • .Net程序内存异常的原因及解决
    目录一、概要二、场景三、思路(1)分析Part1,分析日志堆积原因Part2,查找内存泄漏的根本原因(2)工具Part3,总结Part4,彩蛋一、概要 大概在今年三月份的时候突然被...
    99+
    2024-04-02
  • JVM的内存溢出异常说明
    本篇内容介绍了“JVM的内存溢出异常说明”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!举例说明含义:-Xss128k每个线程的java栈大小...
    99+
    2023-06-17
  • 内存溢出、内存泄露的概述及常见情形
    内存溢出(OutofMemoryError) 简述 java doc 中对 Out Of Memory Error 的解释是,没有空闲内存,并且垃圾收集器也无法提供更多内存。 JVM 提供的内存管理机...
    99+
    2023-09-01
    jvm java 面试 内存泄露 内存溢出
  • Java的内存区域与内存溢出异常你了解吗
    目录1.运行时数据区域1.程序计数器(线程私有)2.Java虚拟机栈(线程私有)3.本地方法栈(线程私有)4.Java堆(线程共享)5.方法区(线程共享)6.运行时常量池2.对象是如...
    99+
    2024-04-02
  • Java中FileNotFoundException异常的常见原因和解决方法
    在Java编程中,FileNotFoundException是一个常见的异常,它表示在尝试访问文件时无法找到指定的文件。本文将介绍FileNotFoundException异常的常见原因,并提供相应的解决方法和示例代码。 文件路径错误:F...
    99+
    2023-12-23
    java 开发语言
  • C++ 内存泄漏的常见原因及其解决方法
    常见 c++++ 内存泄漏原因:1. 忘记释放指针;2. 双重释放;3. 循环引用;4. 静态变量;5. 全局对象。解决方法:1. 使用智能指针;2. 注意循环引用;3. 避免静态变量;...
    99+
    2024-05-02
    c++ 内存泄漏
  • Java内存区域与内存溢出异常知识讲解
    本篇内容介绍了“Java内存区域与内存溢出异常知识讲解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!正文一. 基本概念在开始讲解之前, 需要...
    99+
    2023-06-05
  • JAVA常见的运行异常有哪几种
    在Java中,常见的运行时异常有以下几种: NullPointerException(空指针异常):当程序试图访问一个空对象的属性...
    99+
    2024-02-29
    JAVA
  • java内存管理与内存溢出异常的示例分析
    这篇文章主要介绍了java内存管理与内存溢出异常的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。说到内存管理,笔者这里想先比较一下java与C、C++之间的区别:在C...
    99+
    2023-05-31
    java
  • java内存溢出的原因有哪些
    Java内存溢出的原因主要有以下几点:1. 无限循环:当程序中存在无限循环或递归调用时,会导致内存溢出。每次循环或递归调用都会产生一...
    99+
    2023-08-11
    java
  • java内存溢出的原因和解决办法是什么
    Java内存溢出的原因通常是程序申请的内存超过了JVM所能提供的内存限制。常见的内存溢出原因包括:1. 对象创建过多:如果程序中频繁...
    99+
    2023-08-18
    java
  • Android 内存泄漏的常见原因及其对应的解决方案
    Android 内存泄漏 Android应用程序中常见的内存泄漏原因有很多,以下是一些常见的原因及对应的解决方案: 1. 静态引用导致的内存泄漏: 静态变量持有对Activity或Fragment的引...
    99+
    2023-09-15
    android
  • Java中java.lang.ClassCastException异常原因及解决方法
    通常我们在 OOP 设计中都会使用到继承。 ​​但是在继承对象之间的强制转换可能会遇到​​java.lang.ClassCastException​​异常的错误。 错误的日志如下:...
    99+
    2024-04-02
  • php内存溢出报错的原因是什么及怎么解决
    今天小编给大家分享一下php内存溢出报错的原因是什么及怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。报错信息当 PH...
    99+
    2023-07-05
  • java内存泄漏和内存溢出的原因是什么
    Java内存泄漏和内存溢出的原因如下:1. 内存泄漏:内存泄漏指的是在程序运行过程中,无用的对象仍然被保持在内存中,导致内存占用不断...
    99+
    2023-08-26
    java
  • 详解Java中NullPointerException异常的原因以及解决方法
    NullPointerException是Java中常见的异常之一,通常是在运行时发生的。该异常表示程序试图访问一个空对象的属性或调...
    99+
    2023-08-11
    java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作