精华内容
下载资源
问答
  • 根本原因:由于Thread中包含变量ThreadLocalMap,因此ThreadLocalMap与Thread的生命周期是一样长,如果都没有手动删除对应key,都会导致内存泄漏。 测试方式:使用线程池启动新的线程,当新线程未结束时,GC无法...

    根本原因:由于Thread中包含变量ThreadLocalMap,因此ThreadLocalMap与Thread的生命周期是一样长,如果都没有手动删除对应key,都会导致内存泄漏。

    测试方式:使用线程池启动新的线程,当新线程未结束时,GC无法回收ThreadLocalMap中的内存

    测试代码:

    public class ThreadLocalDemo {
        public static void main(String[] args) {
            ThreadLocalDemo demo = new ThreadLocalDemo();
            demo.run();
        }
    
        public void run(){
            ExecutorService executorService = Executors.newFixedThreadPool(1);
            executorService.execute(new Task());
            System.gc();
        };
    
    
        class Task implements Runnable{
            @Override
            public void run() {
                ThreadLocal<byte[]> localString = new ThreadLocal<>();
                localString.set(new byte[1024*1024*300]);
            }
        }
    }

    打开jdk下bin的jconsole.exe,链接ThreadLocalDemo

    手动执行gc,内存仍有300m无法回收

    修改程序,重新链接,线程停止后再次执行GC发送已经回收

    public void run() throws InterruptedException {
        ExecutorService executorService = Executors.newFixedThreadPool(1);
        executorService.execute(new Task());
        System.gc();
        System.out.println("运行30s后停止线程");
        Thread.currentThread().sleep(30000);
        executorService.shutdown();
        System.out.println("线程停止,运行GC查看");
        Thread.currentThread().sleep(30000);
    };
    

     

    展开全文
  • 那么对于这种情况下,由于代码的实现不同就会出现很多种内存泄漏问题(让JVM误以为此对象还在引用中,无法回收,造成内存泄漏)。 实际开发中常见的错误如下: 1、静态集合类,如HashMap、LinkedList等等。如果这

    泄漏的原因本质上是长期存活对象引用短期存活对象,导致短期存活对象占用的对象无法回收。

    由于java的JVM引入了垃圾回收机制,垃圾回收器会自动回收不再使用的对象,了解JVM回收机制的都知道JVM是使用引用计数法和可达性分析算法来判断对象是否是不再使用的对象,本质都是判断一个对象是否还被引用。那么对于这种情况下,由于代码的实现不同就会出现很多种内存泄漏问题(让JVM误以为此对象还在引用中,无法回收,造成内存泄漏)。

    实际开发中常见的错误如下:

    1、静态集合类,如HashMap、LinkedList等等。如果这些容器为静态的,那么它们的生命周期与程序一致,则容器中的对象在程序结束之前将不能被释放,从而造成内存泄漏。简单而言,长生命周期的对象持有短生命周期对象的引用,尽管短生命周期的对象不再使用,但是因为长生命周期对象持有它的引用而导致不能被回收。

    2、各种连接,如数据库连接、网络连接和IO连接等。在对数据库进行操作的过程中,首先需要建立与数据库的连接,当不再使用时,需要调用close方法来释放与数据库的连接。只有连接被关闭后,垃圾回收器才会回收对应的对象。否则,如果在访问数据库的过程中,对Connection、Statement或ResultSet不显性地关闭,将会造成大量的对象无法被回收,从而引起内存泄漏。

    3、变量不合理的作用域。一般而言,一个变量的定义的作用范围大于其使用范围,很有可能会造成内存泄漏。另一方面,如果没有及时地把对象设置为null,很有可能导致内存泄漏的发生。

    public class UsingRandom {
    		private String msg;
    		public void receiveMsg(){
    		readFromNet();// 从网络中接受数据保存到msg中
    		saveDB();// 把msg保存到数据库中
    }
    }
    

    如上面这个伪代码,通过readFromNet方法把接受的消息保存在变量msg中,然后调用saveDB方法把msg的内容保存到数据库中,此时msg已经就没用了,由于msg的生命周期与对象的生命周期相同,此时msg还不能回收,因此造成了内存泄漏。

    实际上这个msg变量可以放在receiveMsg方法内部,当方法使用完,那么msg的生命周期也就结束,此时就可以回收了。还有一种方法,在使用完msg后,把msg设置为null,这样垃圾回收器也会回收msg的内存空间。

    4、内部类持有外部类,如果一个外部类的实例对象的方法返回了一个内部类的实例对象,这个内部类对象被长期引用了,即使那个外部类实例对象不再被使用,但由于内部类持有外部类的实例对象,这个外部类对象将不会被垃圾回收,这也会造成内存泄露。

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

    展开全文
  • Android内存溢出及内存泄漏原因进行发布时间:2020-08-23 15:18:36来源:脚本之家阅读:111作者:志不坚者智不达内存溢出(Out Of Memory):Android系统中每一个应用程序可以向系统申请一定的内存,当申请的内存不够...

    Android内存溢出及内存泄漏原因进行

    发布时间:2020-08-23 15:18:36

    来源:脚本之家

    阅读:111

    作者:志不坚者智不达

    内存溢出(Out Of Memory):Android系统中每一个应用程序可以向系统申请一定的内存,当申请的内存不够用的时候,就产生了内存溢出。

    内存泄漏:当某个对象不再被使用,即不再有变量引用它时,该对象占用的内存就会被系统回收。当某个对象不再被使用,但是在其他对象中仍然有变量引用它时,该对象占用的内存就无法被系统回收,从而导致了内存泄漏。

    当内存泄漏过多时,可用内存空间会减少,应用程序申请的内存不够用,就会导致内存溢出。

    内存溢出原因:

    1.内存泄漏过多。

    2.内存中加载的数据量超过内存的可用量。

    3.集合类(用于存储对象的引用)中有对对象的引用,使用完后未清空。

    4.申请的内存不够。

    5.死循环或者循环产生过多对象实例,导致大量内存被消耗。

    。。。

    内存泄漏原因:

    1.资源对象没有关闭:

    (1)注册广播接收器后没有调用unregisterReceiver()方法注销广播接收器。

    (2)打开文件流之后没有调用close()方法关闭文件流。

    (3)数据库游标cursor使用完后没有调用close()方法关闭游标。

    (4)图片资源Bitmap使用完之后没有调用recycle()方法回收。

    。。。

    2.生命周期长的对象持有生命周期短的对象的引用,导致生命周期短的对象内存无法被回收:

    (1)单例模式或者静态成员变量的生命周期和应用程序的生命周期相等,当需要引用Context时,如果传入的是Activity的Context,Activity需要被销毁时就无法被回收。解决方法是传入Application的Context,因为Application的Context生命周期等于应用程序的生命周期。

    (2)非静态内部类(匿名内部类、Handler等)默认持有外部类的引用,如果非静态内部类的对象实例生命周期比外部类生命周期长(比如非静态内部类定义了一个静态的对象实例),外部类注销时就无法被系统回收,从而导致内存泄漏。解决方法是采用静态内部类+弱引用的方式。

    总结:内存泄漏产生的原因主要有两种:一种是资源对象在使用完后没有进行关闭操作。另一种是生命周期长的对象引用了生命周期短的对象,导致生命周期短的对象即使不再使用但仍然无法被系统回收。根本原因在于需要被回收的内存资源没有被系统回收。

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持亿速云。

    展开全文
  • 本文翻译自:The Introduction of Java Memory Leaks...然而,情况并不是所谓的那么简单,因为在Java应用程序中经常会发生内存泄漏。 本教程阐释了什么是内存泄漏,为什么它会发生,以及如何阻止它们。 1.什么是...

    本文翻译自:The Introduction of Java Memory Leaks  

    翻译人员:麦田里的守望者-Rye

     

    Java中一个最重要的优点是它的内存管理,你只需要创建对象,Java垃圾回收器就会负责分配和释放内存。然而,情况并不是所谓的那么简单,因为在Java应用程序中经常会发生内存泄漏。

    本教程阐释了什么是内存泄漏,为什么它会发生,以及如何阻止它们。

     

    1.什么是内存泄漏?

    内存泄漏的定义:对象不再被应用程序使用,但垃圾回收器却不能移除它们,因为它们还在被引用。

    为了理解这个定义,我们需要理解对象在内存中的状态,下面的图阐释了什么是不再使用和什么是不再引用。

    在上面的图中,有未引用的对象和在引用的对象。未引用的对象将会被垃圾回收器回收,然而在引用的对象不会被垃圾回收器回收。未引用的对象肯定是无用的,因为没有其它的对象引用它了。然而,不再使用的对象不都是不在被引用的。它们中的有一些也正在被引用,这就是内存泄漏的来源!

     

    2.为什么会发生内存泄漏?

    让我们看一看下面的例子和了解为什么会发生内存泄漏。在下面的这个例子中,对象A引用对象B。A的生命周期(t1 - t4) 比B的生命周期(t2 - t3)长。当在应用程序中B不再被使用,A仍然持有它的引用。在这种情况下,垃圾回收器不能够把B从内存中移除。这就可能造成内存溢出问题。因为如果A像引用B一样引用了更多的对象,这里就可能存在大量的对象不能被回收而且它们还消耗了内存空间。

    相同的,B持有大量的其它引用对象也可能发生内存溢出问题。那些被B引用的对象也不会被垃圾回收器回收,所有不再被使用的对象将消耗宝贵的内存空间。

     

    3.怎样阻止内存泄漏?

    以下是防止内存泄漏的快速操作技巧。

      1.注意集合类,如HashMap,ArrayList等。它们在相同的地方可以找到内存泄漏。当它们被声明为static的时候,它们的生命周期和应用程序的生命周期一样。

      2.注意事件的监听和回调。如果注册了监听器,但在类不再被使用的时候没有取消注册的监听器,就有可能发生内存泄漏。

      3.“如果一个类管理它自己的内存,程序员应该警惕内存泄漏。” 通常一个对象的成员变量指向其它对象需要被置为null。

     

    4.一个小提问:为什么JDK6中的subString()方法会造成内存泄漏?

    要回答这个问题,你可以阅读 The substring() Method in JDK6 and JDK7

     

     

    参考文章:

    [1] Bloch, Joshua. Effective java. Addison-Wesley Professional, 2008.
    [2] IBM Developer Work. http://www.ibm.com/developerworks/library/j-leaks/

     

    展开全文
  • java内存泄露原因

    2014-03-11 09:27:33
    经常听人谈起内存泄露,但要问什么是内存泄露,没几个说得清楚。内存泄露是指无用对象(不再使用的对象)...那么,Java内存泄露根本原因是什么呢?长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,...
  • JAVA内存泄漏——内存泄漏原因内存泄漏检测工具(zt) 摘要   虽然Java虚拟机(JVM)及其垃圾收集器(garbage collector,GC)负责管理大多数的内存任务,Java软件程序中还是有可能出现内存泄漏。实际上,这在大型...
  • 软件内存泄露原因

    千次阅读 2015-10-12 13:21:38
    内存泄露原因: 1.主要是由于开发过程当中申请了计算机资源(例如...3.某些API函数操作不正确,造成内存泄漏另: 一、Java内存回收机制 不论哪种语言的内存分配方式,都需要返回所分配内存的真实地址,也就是返回
  • android内存泄漏原因

    2016-02-18 13:12:24
    内存泄漏也称作“存储渗漏”,用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元。直到程序结束。即所谓内存泄漏。   内存泄漏简单地说就是申请了一块内存空间,使用完毕后...
  •  虽然Java虚拟机(JVM)及其垃圾收集器(garbagecollector,GC)负责管理大多数的内存任务,Java软件程序中还是有可能出现内存泄漏。实际上,这在大型项目中是一个常见的问题。避免内存泄漏的第一步是要弄清楚它是如何...
  • 首先我们要知道java运行时内存的分配策略,它们分别是:静态分配、栈式分配、堆式分配,而三种存储策略所对应的内存空间分别是:静态存储区(方法去)、栈区、堆区。 静态存储区:主要存放static修饰的静态数据。...
  • 内存泄漏概念:内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。 一、单例模式使用Activity作为Context...
  • JAVA 内存泄露详解(原因、例子及解决)

    万次阅读 多人点赞 2016-05-05 20:24:58
    Java的一个重要特性就是通过垃圾收集器(GC)自动管理内存的回收,而不...理论上Java中所有不会再被利用的对象所占用的内存,都可以被GC回收,但是Java也存在内存泄露,但它的表现与C++不同。 JAVA 中的内存管...
  • JAVA内存泄漏原因内存泄漏检测工具
  • 内存泄露原因

    2013-04-09 16:17:28
    内存泄露原因 分类: 扫盲区2012-02-01 19:23 794人阅读 评论(1) 收藏 举报 profiling工具visualizationjavalinuxsolaris 目录(?)[+]  1.new,malloc后没有delete,free 2.创建...
  • ###内存泄漏也称作“存储渗漏,用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元。直到程序结束。即所谓内存泄漏内存泄漏简单地说就是申请了一块内存空间,使用完毕后没有释放...
  • JVM 内存泄漏 虚拟机内存泄漏总结

    万次阅读 2018-09-01 10:14:56
    内存泄漏 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。 一 . 以发生的方式来分类,内存泄漏可以分为4类:  ...
  • 概念 内存泄露:指程序中动态分配内存给一些临时对象,但对象不会被GC回收,它始终占用内存,被分配的对象可达但已...Java内存泄露根本原因是什么呢?长生命周期的对象持有短生命周期对象的引用就很可能发生内存...
  • Java内存泄露原因详解

    2016-10-27 21:11:32
    虽然Java有JVM帮助管理内存,但还是会发生内存泄露的情况,以下将对Java内存泄露的各种情况进行分析
  • 内存泄漏原因

    2014-07-17 20:50:02
    程序中的内存泄漏主要有:  1. 用new,malloc,GolbalAlloc等函数分配的堆内存没有用delete,free,GlobalFree等释放,这些内存在Debug时候都可以Dump出信息的,但只有new在Debug的时候会正确指出出错的行,因为在...
  • Java内存泄漏根本原因是什么呢?长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄漏,尽管短生命周期对象已经不再需要,但是因为长生命周期持有它的引用而导致不能被回收,这就是Java中内存泄漏的...
  • 转账自:http://blog.csdn.net/wtt945482445/article/details/52483944Java 内存分配策略Java 程序运行时的内存分配策略有三种,分别是静态分配,栈式分配,和堆式分配,对应的,三种存储策略使用的内存空间主要分别是...
  • 前言之前研究过一段时间关于 Android 内存泄漏的知识,大致了解了导致内存泄漏的一些原因,但是没有深入去探究,很多细节也理解的不够透彻,基本上处于一种似懂非懂的状态,最近又研究了一波,发现有很多新的收获,...
  • 一、Java内存回收机制  不论哪种语言的内存分配方式,都需要返回所分配内存的真实地址,也就是返回一个指针到内存块的首地址。Java中对象是采用new或者反射的方法创建的,这些对象的创建都是在堆(Heap)中分配的...
  • JAVA内存泄露原因解析

    2015-08-14 20:11:04
    因此,很多程序员认为Java 不存在内存泄漏问题,或者认为即使有内存泄漏也不是程序的责任,而是GC 或JVM的问题。其实,这种想法是不正确的,因为Java 也存在内存泄漏,但它的表现与C++不同。如果正在开发的Java 代码...
  • 内存泄漏也称作“存储渗漏”,用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元。直到程序结束。即所谓内存泄漏

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 44,638
精华内容 17,855
关键字:

内存泄漏根本原因