广告
返回顶部
首页 > 资讯 > 精选 >Java内存溢出和内存泄露的示例分析
  • 557
分享到

Java内存溢出和内存泄露的示例分析

java 2023-05-30 23:05:25 557人浏览 八月长安
摘要

这篇文章给大家分享的是有关Java内存溢出和内存泄露的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、为什么要了解内存泄露和内存溢出?内存泄露一般是代码设计存在缺陷导致的,通过了解内存泄露的场景,可以避

这篇文章给大家分享的是有关Java内存溢出和内存泄露的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

一、为什么要了解内存泄露和内存溢出?

内存泄露一般是代码设计存在缺陷导致的,通过了解内存泄露的场景,可以避免不必要的内存溢出和提高自己的代码编写水平;

通过了解内存溢出的几种常见情况,可以在出现内存溢出的时候快速的定位问题的位置,缩短解决故障的时间。 

 二、基本概念 

理解这两个概念非常重要。

内存泄露:指程序中动态分配内存给一些临时对象,但是对象不会被GC所回收,它始终占用内存。即被分配的对象可达但已无用。 

内存溢出:指程序运行过程中无法申请到足够的内存而导致的一种错误。内存溢出通常发生于OLD段或Perm段垃圾回收后,仍然无内存空间容纳新的Java对象的情况。

从定义上可以看出内存泄露是内存溢出的一种诱因,不是唯一因素。 

三、内存泄露的几种场景:

长生命周期的对象持有短生命周期对象的引用 

            这是内存泄露最常见的场景,也是代码设计中经常出现的问题。

            例如:在全局静态map中缓存局部变量,且没有清空操作,随着时间的推移,这个map会越来越大,造成内存泄露。 

修改hashset中对象的参数值,且参数是计算哈希值的字段

             当一个对象被存储进HashSet集合中以后,就不能修改这个对象中的那些参与计算哈希值的字段,否则对象修改后的哈希值与最初存储进HashSet集合中时的哈希值就不同了,在这种情况下,即使在contains方法使用该对象的当前引用作为参数去HashSet集合中检索对象,也将返回找不到对象的结果,这也会导致无法从HashSet集合中删除当前对象,造成内存泄露。 

机器的连接数和关闭时间设置 

            长时间开启非常耗费资源的连接,也会造成内存泄露。 

 四、内存溢出的几种情况: 

1、堆内存溢出(outOfMemoryError:java heap space)

       在JVM规范中,堆中的内存是用来生成对象实例和数组的。

       如果细分,堆内存还可以分为年轻代和年老代,年轻代包括一个eden区和两个survivor区。

       当生成新对象时,内存的申请过程如下:

          a、jvm先尝试在eden区分配新建对象所需的内存;

          b、如果内存大小足够,申请结束,否则下一步;

          c、jvm启动youngGC,试图将eden区中不活跃的对象释放掉,释放后若Eden空间仍然不足以放入新对象,则试图将部分Eden中活跃对象放入Survivor区;

          d、Survivor区被用来作为Eden及old的中间交换区域,当OLD区空间足够时,Survivor区的对象会被移到Old区,否则会被保留在Survivor区;

          e、 当OLD区空间不够时,JVM会在OLD区进行full GC;

          f、full GC后,若Survivor及OLD区仍然无法存放从Eden复制过来的部分对象,导致JVM无法在Eden区为新对象创建内存区域,则出现”out of memory错误”:

                                   outOfMemoryError:java heap space 

代码举例:

 public class MemoryLeak {      private String[] s = new String[1000];     public static void main(String[] args) throws InterruptedException {     Map<String,Object> m =new HashMap<String,Object>();     int i =0;     int j=10000;     while(true){       for(;i<j;i++){         MemoryLeak memoryLeak = new MemoryLeak();         m.put(String.valueOf(i), memoryLeak);       }     }   } }

      2、方法区内存溢出(outOfMemoryError:permgem space)

       在jvm规范中,方法区主要存放的是类信息、常量、静态变量等。

       所以如果程序加载的类过多,或者使用反射、gclib等这种动态代理生成类的技术,就可能导致该区发生内存溢出,一般该区发生内存溢出时的错误信息为:
             outOfMemoryError:permgem space 

代码举例:

jvm参数:-XX:PermSize=2m -XX:MaxPermSize=2m  

将方法区的大小设置很低即可,在启动加载类库时就会出现内存不足的情况   

线程栈溢出(java.lang.StackOverflowError)

       线程栈时线程独有的一块内存结构,所以线程栈发生问题必定是某个线程运行时产生的错误。

       一般线程栈溢出是由于递归太深或方法调用层级过多导致的。

       发生栈溢出的错误信息为:

              java.lang.StackOverflowError

代码举例:

 public class StackOverflowTest {      public static void main(String[] args) {     int i =0;     digui(i);   }   private static void digui(int i){     System.out.println(i++);     String[] s = new String[50];     digui(i);   } }

五、为了避免内存泄露,在编写代码的过程中可以参考下面的建议: 

尽早释放无用对象的引用 

使用字符串处理,避免使用String,应大量使用StringBuffer,每一个String对象都得独立占用内存一块区域 

尽量少用静态变量,因为静态变量存放在永久代(方法区),永久代基本不参与垃圾回收 

避免在循环中创建对象

开启大型文件或从数据库一次拿了太多的数据很容易造成内存溢出,所以在这些地方要大概计算一下数据量的最大值是多少,并且设定所需最小及最大的内存空间值。 

感谢各位的阅读!关于“Java内存溢出和内存泄露的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: Java内存溢出和内存泄露的示例分析

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

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

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

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

下载Word文档
猜你喜欢
  • Java内存溢出和内存泄露的示例分析
    这篇文章给大家分享的是有关Java内存溢出和内存泄露的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、为什么要了解内存泄露和内存溢出?内存泄露一般是代码设计存在缺陷导致的,通过了解内存泄露的场景,可以避...
    99+
    2023-05-30
    java
  • Flex内存优化原则和内存泄露的示例分析
    这篇文章将为大家详细讲解有关Flex内存优化原则和内存泄露的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Flex性能优化常用手法众所周知,目前国内的宽带应用并不是像很多发达国家发达,个人应用带宽...
    99+
    2023-06-17
  • 基于ThreadLocal 的用法及内存泄露(内存溢出)
    目录使用构造方法静态方法公共方法内存泄露解决方法为什么要将ThreadLocal 定义成 static 变量对ThreadLocal内存泄漏引起的思考概述使用场景样例代码Thread...
    99+
    2022-11-12
  • java内存管理与内存溢出异常的示例分析
    这篇文章主要介绍了java内存管理与内存溢出异常的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。说到内存管理,笔者这里想先比较一下java与C、C++之间的区别:在C...
    99+
    2023-05-31
    java
  • Java内存泄露问题实例分析
    本篇内容介绍了“Java内存泄露问题实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java内存泄露问题所谓内存泄露就是指一个不再被程...
    99+
    2023-06-29
  • 内存溢出、内存泄露的概述及常见情形
    内存溢出(OutofMemoryError) 简述 java doc 中对 Out Of Memory Error 的解释是,没有空闲内存,并且垃圾收集器也无法提供更多内存。 JVM 提供的内存管理机...
    99+
    2023-09-01
    jvm java 面试 内存泄露 内存溢出
  • JVM中内存区域与内存溢出的示例分析
    小编给大家分享一下JVM中内存区域与内存溢出的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Java内存区域与内存溢出异常运行时数据区域程序计数器当前线程...
    99+
    2023-06-17
  • Tomcat运行Java Web内存溢出的示例分析
    这篇文章主要介绍Tomcat运行Java Web内存溢出的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!如果JVM里运行的程序, 它的内存堆和持久存储区域的都满了,这个时候程序还想创建对象实例的话,垃圾收集器...
    99+
    2023-06-17
  • JAVA内存泄漏的示例分析
    本篇文章给大家分享的是有关JAVA内存泄漏的示例分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java内存泄漏是每个Java程序员都会遇到的问题,程序在本地运行一切正常,可...
    99+
    2023-06-03
  • Disruptor发生内存溢出的示例分析
    今天给大家介绍一下Disruptor发生内存溢出的示例分析。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。前言OutOfMemoryError 问题相...
    99+
    2023-06-04
  • Java中内存泄露与溢出的区别是什么
    这期内容当中小编将会给大家带来有关Java中内存泄露与溢出的区别是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java内存泄露与溢出的区别内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足...
    99+
    2023-06-17
  • java中内存泄漏和内存溢出是什么
    内存泄漏(Memory Leak)是指在程序运行过程中,因为不正确的内存管理而导致一部分内存无法被回收的现象。当程序中的对象不再被使...
    99+
    2023-08-25
    java
  • Android 内存溢出和内存泄漏的问题
    Android 内存溢出和内存泄漏的问题 在面试中,经常有面试官会问“你知道什么是内存溢出?什么是内存泄漏?怎么避免?”通过这篇文章,你可以回答出来了。 内存溢出 (OOM)是...
    99+
    2022-06-06
    内存溢出 内存泄漏 Android
  • Java8虚拟机内存溢出的示例分析
    这篇文章给大家分享的是有关Java8虚拟机内存溢出的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 Java8虚拟机(JVM)内存溢出实战 前言 相信很多JAVA中...
    99+
    2022-10-19
  • java内存泄漏和内存溢出的原因是什么
    Java内存泄漏和内存溢出的原因如下:1. 内存泄漏:内存泄漏指的是在程序运行过程中,无用的对象仍然被保持在内存中,导致内存占用不断...
    99+
    2023-08-26
    java
  • vue中单页应用内存泄露的示例分析
    这篇文章主要介绍vue中单页应用内存泄露的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、什么是内存泄漏?系统进程不再用到的内存,没有及时释放,就叫做内存泄漏(memory...
    99+
    2022-10-19
  • Java编程常见内存溢出异常的示例分析
    小编给大家分享一下Java编程常见内存溢出异常的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Java 堆是用来存储对象实例的, 因此如果我们不断地创建对...
    99+
    2023-05-30
    java
  • java内存管理关系及内存泄露的原理分析
    目录java内存管理关系及内存泄露原理java对象和内存的关系创建对象null的作用内存泄露检测内存泄露的原理java内存管理关系及内存泄露原理 这可能是最近写的博客中最接近底层的了...
    99+
    2022-11-12
  • Java内存泄漏排查的示例分析
    这篇文章将为大家详细讲解有关Java内存泄漏排查的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在一个凄凉的午夜午夜刚过,我就被一条来自监控系统的警报吵醒了。Adventory,我们的 PPC (...
    99+
    2023-06-04
  • ThreadLocal作用原理与内存泄露示例解析
    目录ThreadLocal作用简单例子局部变量、成员变量 、 ThreadLocal、静态变量共享 or 隔离原理源码分析TheadLocalTheadLocalMapThreadL...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作