广告
返回顶部
首页 > 资讯 > 精选 >如何理解Java中的内存溢出问题
  • 252
分享到

如何理解Java中的内存溢出问题

2023-06-15 17:06:54 252人浏览 独家记忆
摘要

这篇文章主要介绍“如何理解Java中的内存溢出问题”,在日常操作中,相信很多人在如何理解Java中的内存溢出问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解Java中的内存溢出问题”的疑惑有所帮助!

这篇文章主要介绍“如何理解Java中的内存溢出问题”,在日常操作中,相信很多人在如何理解Java中的内存溢出问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解Java中的内存溢出问题”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

一、内存溢出原因

内存溢出就是内存不够,引起内存溢出的原因有很多种,常见的有以下几种:

内存中加载的数据量过于庞大,如一次从数据库取出过多数据;

集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;

代码中存在死循环或循环产生过多重复的对象实体;

使用的第三方软件中的BUG;

启动参数内存值设定的过小;

当然实际情况中内存溢出的原因就太多了。下面我们就对这些原因分类一下:

以上的图是基于java7来叙述的,从上面这张图我们能够得到如下信息:java虚拟机把内存分为5个模块。

(1)程序计数器:程序计数器是线程私有的,主要的作用是通过改变这个计数器的值来选取下一条需要执行的字节码指令。既然每个线程都有一个,那么这些线程的计数器是互不影响的。也不会抛出任何异常。

(2)虚拟机栈和本地方法栈:虚拟机栈描述的是java方法执行的内存模型,每个方法在执行的时候都会创建一个栈帧用于存储局部变量表、操作数栈、动态连接、方法出口等信息。本地方法栈与虚拟机栈的区别是,虚拟机栈为虚拟机执行java方法服务,而本地方法栈则为虚拟机提供native方法服务。

在单线程的操作中,无论是由于栈帧太大,还是虚拟机栈空间太小,当栈空间无法分配时,虚拟机抛出的都是StackOverflowError异常,而不会得到OutOfMemoryError异常。而在多线程环境下,则会抛出OutOfMemoryError异常。

(3)java堆和方法区:java堆区主要存放对象实例和数组等,方法区保存类信息、常量、静态变量等等。运行时常量池也是方法区的一部分。这两块区域是线程共享的区域,只会抛出OutOfMemoryError。

不知道各位在B站看见过那个面试经典场景没,在回答java的内存运行数据区结构时,以上的功能作用是一方面,如果回答时把内存溢出问题添加上是一个极大的加分项。

二、内存溢出实例

1、堆溢出

既然堆是存放实例对象的,那我们就无线创建实例对象。这样堆区迟早会满。

public class HeapOOM {     static class User {}  public static void main(String[] args) {    List<User> list = new ArrayList<User>();          while (true) {              list.add(new User());       }  } } 

因为我提前设置了堆区内存,所以无限创建就会抛出异常。

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

Java虚拟机规范中描述了两种异常:

如果线程请求的栈深度大于虚拟机允许的最大深度,将抛出StackOverflowError异常。

如果虚拟机在扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常。

第一种我们只需要使用方法递归调用即可模拟:

public class StackOutOfMemoryError {     public static void main(String[] args) {               test();     }     private static void Go() {         System.out.println("StackOverflowError异常");         test();     } } 

第二种也可以递归调用模拟,,但是使用的是类直接调用。

public class JavaVMStackSOF {     private int stackLength = 1;     public void stackLeak() {         stackLength++;         stackLeak();     }  public static void main(String[] args) {         JavaVMStackSOF oom = new JavaVMStackSOF();         oom.stackLeak();     } } 

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

public class JavaMethodAreaOOM {     public static void main(String[] args) {         while (true) {             Enhancer enhancer = new Enhancer();             enhancer.setSuperclass(User.class);             enhancer.setUseCache(false);             enhancer.setCallback(new MethodInterceptor() {                 public Object intercept(Object obj, Method method,                       Object[] args, MethodProxy proxy) throws Throwable {                     return proxy.invokeSuper(obj, args);                 }             });             enhancer.create();         }     }     static class User {} } 

4、本机直接内存溢出

DirectMemory容量可通过-XX: MaxDirectMemorySize指定,如果不指定,则默认与Java堆最大值  (-Xmx指定)一样。

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);         }     } }

上面介绍了几个实例,那遇到这种问题如何排查呢?

三、内存溢出排查

排查其实最主要的就是检查代码,而且内存溢出往往都是代码的问题。当然一下几点都是需要注意的:

(1)内存中加载的数据量过于庞大,如一次从数据库取出过多数据;

(2)集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;

(3)代码中存在死循环或循环产生过多重复的对象实体;

(4)使用的第三方软件中的BUG;

(5)启动参数内存值设定的过小;

最后就是解决了。

第一步,修改JVM启动参数,直接增加内存。

第二步,检查错误日志

第三步,对代码进行走查和分析,找出可能发生内存溢出的位置。

一般情况下代码出错的概率会比较大一些,当然了不同的场景不同错误总是复杂多样的。

到此,关于“如何理解Java中的内存溢出问题”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: 如何理解Java中的内存溢出问题

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

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

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

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

下载Word文档
猜你喜欢
  • 如何理解Java中的内存溢出问题
    这篇文章主要介绍“如何理解Java中的内存溢出问题”,在日常操作中,相信很多人在如何理解Java中的内存溢出问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解Java中的内存溢出问题”的疑惑有所帮助!...
    99+
    2023-06-15
  • Java中的内存溢出问题怎么解决
    本篇内容主要讲解“Java中的内存溢出问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中的内存溢出问题怎么解决”吧!一、内存溢出原因内存溢出就是内存不够,引起内存溢出的原因有很...
    99+
    2023-06-15
  • java内存溢出问题如何排查
    Java内存溢出问题的排查可以按照以下步骤进行:1. 观察错误信息:当Java发生内存溢出时,通常会抛出`java.lang.Out...
    99+
    2023-09-29
    java
  • java堆内存溢出问题怎么解决
    Java堆内存溢出问题的解决方法有以下几种: 增加堆内存大小:可以通过修改JVM的启动参数,增加堆内存的大小,例如增加-Xmx参...
    99+
    2023-10-27
    java
  • 如何解决angular4中JavaScript内存溢出问题
    这篇文章主要介绍如何解决angular4中JavaScript内存溢出问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!最近在写基于angular4的项目的时候,在build --p...
    99+
    2022-10-19
  • java线上内存溢出问题如何排查
    Java线上内存溢出问题的排查步骤如下:1. 查看错误日志:首先检查应用程序的错误日志,查找与内存溢出相关的异常信息。常见的内存溢出...
    99+
    2023-10-11
    java
  • 如何解决PHP开发中的内存溢出问题
    随着PHP的应用越来越广泛,PHP开发中的内存溢出问题也成为了开发者们共同面临的挑战。内存溢出是指程序在运行过程中申请的内存超过了内存空间的限制,导致程序出现异常或崩溃的情况。本文将介绍如何解决PHP开发中的内存溢出问题,并提供一些具体的代...
    99+
    2023-10-21
    解决方法 内存溢出
  • c语言内存溢出问题如何解决
    C语言内存溢出问题可以通过以下几种方式来解决:1. 检查代码逻辑:检查代码中的循环、递归、动态内存分配等地方是否存在错误,比如没有正...
    99+
    2023-10-10
    c语言
  • Spring Cloud Gateway内存溢出问题如何解决
    本篇内容主要讲解“Spring Cloud Gateway内存溢出问题如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring Cloud Gateway内存溢出问题如何解决”吧!记 ...
    99+
    2023-06-20
  • java中出现内存溢出如何解决
    本篇文章为大家展示了java中出现内存溢出如何解决,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。常用的java框架有哪些1.SpringMVC,Spring Web MVC是一种基于Java的实现了...
    99+
    2023-06-14
  • java内存溢出如何解决
    Java内存溢出(Out of Memory Error)是指Java程序在运行过程中申请的内存超出了JVM所能提供的最大内存限制,...
    99+
    2023-10-28
    java
  • 解决vue内存溢出报错的问题
    目录vue内存溢出报错vue项目打包内存溢出问题踩坑打包时一直报错从网上搜的答案还是踩坑了最终针对我的有效方案vue内存溢出报错 '"node --max-old-...
    99+
    2022-11-13
  • java中list内存溢出如何解决
    在Java中,List的内存溢出问题通常是由于大量数据的存储导致的。以下是一些可能的解决方法:1. 增加JVM的堆内存:通过设置JV...
    99+
    2023-10-09
    java
  • Android 内存溢出和内存泄漏的问题
    Android 内存溢出和内存泄漏的问题 在面试中,经常有面试官会问“你知道什么是内存溢出?什么是内存泄漏?怎么避免?”通过这篇文章,你可以回答出来了。 内存溢出 (OOM)是...
    99+
    2022-06-06
    内存溢出 内存泄漏 Android
  • Java中出现堆内存溢出如何解决
    今天就跟大家聊聊有关Java中出现堆内存溢出如何解决,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发...
    99+
    2023-06-15
  • java堆内存溢出如何解决
    Java堆内存溢出指的是在Java应用程序中分配给Java堆的内存空间不足,导致无法继续正常执行程序。要解决Java堆内存溢出问题,...
    99+
    2023-08-23
    java
  • Java通过导出超大Excel文件解决内存溢出问题
    前言 将业务数据导出到Excel表中,导出任务数据量较大时,导出的项目就会内存溢出,本文通过Java操作Poi的SXSSFWorkbook类进行导出,解决内存溢出问题。 1.采用Po...
    99+
    2022-11-12
  • android内存溢出和内存泄漏问题怎么解决
    Android内存溢出和内存泄漏是常见的问题,可以通过以下方法来解决:1. 使用内存分析工具:可以使用Android Studio自...
    99+
    2023-08-26
    android
  • 解决Pytorch内存溢出,Ubuntu进程killed的问题
    pytorch显存越来越多的一个原因 optimizer.zero_grad() loss.backward() optimizer.step() train_loss += l...
    99+
    2022-11-12
  • 解决运行vue项目内存溢出问题
    目录运行vue项目内存溢出记录一下JavaScript heap out of memory(Vue项目运行内存溢出)解决方法运行vue项目内存溢出 npm clone下拉的项目,s...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作