精华内容
下载资源
问答
  • 什么是内存泄漏 指程序中动态分配内存给一些临时对象,但是对象不会被GC所回收,它始终占用内存。即被分配的对象可达但已无用。 造成这种现象的原因要从,jvm内存模型和java GC机制说起 一般局部变量是存在java...

    什么是内存泄漏

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

    造成这种现象的原因要从,jvm内存模型和java GC机制说起
    在这里插入图片描述
    一般局部变量是存在java虚拟机栈的栈帧里,在代码里一个方法就会有一个栈帧, new一个对象他会在堆里开辟块内存来存放他的实例,当这个实例赋值给局部变量的时候,就把它们通过动态链接连接上了,这就是常说的栈指向堆。

    当方法执行完成后,栈帧就弹出java虚拟机栈,然后销毁,但之前动态链接指向的对象实例任然会存在在堆内存里。这时就有javaGC的机制来处理这已经不用的对象了。

    结构

    这时说一下堆内存的结构,堆是由新生代和老年代组成,新生代里又有Eden和SurvivorFrom、SurvivorTo区。

    垃圾判断算法

    一般通过这两种算法去判断对象是否存活:1.引用计数法 2.可达性分析算法

    分代收集算法

    分代收集算法分代收集算法严格来说并不是一种思想或理论,而是融合上述3种基础的算法思想,而产生的针对不同情况所采用不同算法的一套组合拳,根据对象存活周期的不同将内存划分为几块。

    新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。

    老年代中,因为对象存活率高、没有额外空间对它进行分配担保,就必须使用标记-清理算法或者标记-整理算法来进行回收。

    对象年龄

    虚拟机给每个对象定义了一个对象年龄(Age)计数器,如果对象在Eden出生并经过第一次Minor GC后仍然存活,并且能被Survivor容纳的话,将被移动到Survivor空间中(正常情况下对象会不断的在Survivor的From与To区之间移动),并且对象年龄设为1。对象在Survivor区中每经历一次Minor GC,年龄就增加1岁,当它的年龄增加到一定程度(默认15岁),就将会晋升到老年代中。对象晋升老年代的年龄阈值,可以通过参数 XX:MaxPretenuringThreshold 设置。

    GC流程

    Minor GC
    新new对象的时候会在Eden区开辟内存空间,当Eden区没有足够空间进行分配时,虚拟机会发起一次 Minor GC,此时就会把Eden+SurvivorFrom里面没有非存活的对象都回收调,把存活的对象用复制回收算法放到SurvivorTo区里面(如果From内存不足了,会直接放到老年代里),然后From Survivor和To Survivor的逻辑关系会发生颠倒: From变To , To变From,目的是保证有连续的空间存放对方,避免碎片化的发生。这样第二次Minor GC的时候就会把Eden区存活的对象放到了之前的SurvivorTo里了。

    Full GC
    每一次Minor GC过后,都会往新生代里的Survivor区放还存活的对象,而本身就存在在Survivor区存活的对象则会年龄+1,直到到达年龄最大限制值时(可以通过配置XX:MaxPretenuringThreshold来修改最大年龄限制,此参数默认为15),会通过复制回收算法把对象放到老年代里。当很多次这样的操作之后,老年代内存也写满了,就会触发Full GC了。

    内存泄漏现象详细描述

    内存泄漏现象就是,在开发时,创建完一个对象之后,这个对象在后面的代码里没有再需要用他了,但是却还被之前代码引用着无法释放,他就会先一直存放在新生代的Survivor区里,直达多次Minor GC 让这对象的年龄到达设置的最高值,最终到老年代里,而老年代里的对象是只有老年代写满后触发的Full GC才能回收资源,所以他就一直站着内存不释放,而且程序里也没有再使用他的地方,这样就是内存泄漏。

    内存泄漏处理

    三个方面处理
    1.主要因为代码原因造成的内存泄漏,可以找机器内存里占内存比较多的类,找到用他的方法,优化代码逻辑,及时释放对象的引用。
    2.jvm参数,可以通过增大XX:MaxPretenuringThreshold参数值,让对象更有可能被Minor GC回收掉,但同时得用XX:PretenureSizeThreshold这个参数限制存放在新生代的最大的对象是多少,防止对象在新生区,占用空间大,会由于空间不足而导致很多小对象进入到老年区,最后可以增大Survivor区的内存使用率-XX:TargetSurvivorRatio这个参数(默认为50%),降低进入老年代的频率。
    3.机器根据程序的访问量来保证数量,还得做好负载均衡,防止某一台机器访问量过高,这样也容易造成内存泄漏,当内存泄漏严重的时候,会造成内存溢出,从服务挂掉。

    展开全文
  • 1、static的使用。 2、单例的使用。 3、线程的使用。 4、Handler的使用。 这篇博客写的不错 ,我们在开发的时候要注意别犯与这篇文章内的Handler的错误使用方法。...内存泄露无外乎引用的无法释放,比如环形引用等。

    1、static的使用。

    2、单例的使用。

    3、线程的使用。

    4、Handler的使用。这篇博客写的不错,我们在开发的时候要注意别犯与这篇文章内的Handler的错误使用方法。

    5、图片的使用。

    6、资源未关闭

    内存泄露无外乎引用的无法释放,比如环形引用等。

    展开全文
  • 当遇到这个输入法造成的内存泄露的时候,我表示一脸惊讶,因为我整个Activity中没有如何一个输入类控件,更不存在使用输入键盘。但是内存就这样不知不觉的泄露了。既然遇到了问题,我们就要寻求解决方案。 先看一下...

    当遇到这个输入法造成的内存泄露的时候,我表示一脸惊讶,因为我整个Activity中没有如何一个输入类控件,更不存在使用输入键盘。但是内存就这样不知不觉的泄露了。既然遇到了问题,我们就要寻求解决方案。
    先看一下内存泄露对象InputMethodManager的引用路径
    这里写图片描述

    要想让Activity释放掉,思路就是将path togc这个链路剪断就可以.在这个bug中这个链路上有两个节点mContext(DecorView)和 mCurRootView(InputMethodManager)可供考虑.下面思路就是从这两个节点中选择一个入手剪断path to gc即可.

    阅读源码可知, DecorView继承自FrameLayout,mContext是其上下文环境,牵涉太多,不适合操作入手.mCurRootView在InputMehtodManager中的使用就简单得多了,在被赋值初始化后,被使用的场景只有一次判断及一次日志打印.所以这里选中mCurRootView为突破口.剪断其path to gc的操作为通过Java Reflection方法将mCurRootView置空即可(见文后代码).

    编码实现后,再测,发现仍有泄露,但泄露情况有所变化,如下图:
    这里写图片描述

    新的泄露点为mServedView/mNextServedView,可以通过同样的JavaReflection将其置空,剪断path to gc.但这里有个问题得小心,这里强制置空后,会不会引起InputMethodManager的NullPointerException呢?会不会引起系统内部逻辑崩溃?再次查阅源码,发现mServedView及mNextServedView在代码逻辑中一直有判空逻辑,所以这时就可以放心的强制置空来解决问题了.
    这里写图片描述

    为了让输入法在特定的Activity中置空,在其他的Activity中显示,我们需要做判断。fixInputMethodManagerLeak(ContextdestContext)方法参数中将目标要销毁的Activity A作为参数传参进去。在代码中,去获取InputMethodManager的关联View,通过View.getContext()与Activity A进行对比,如果发现两者相同,就表示需要回收;如果两者不一样,则表示有新的界面已经在使用InputMethodManager了,直接不处理就可以了。

    下面写一个InputMethodManager工具类来处理内存泄露,下面直接贴代码:

    package com.hwapu.education.teacher.utils;
    
    import java.lang.reflect.Field;
    
    import android.content.Context;
    import android.view.View;
    import android.view.inputmethod.InputMethodManager;
    
    /**
     * @author tangdekun
     * 用于输入法管理
     */
    public class InputMethodManagerUtils {
    
    
    
    
        /**
         * @param destContext 上下文对象
         * 用于解决输入法内存泄露
         * 参考:http://blog.csdn.net/sodino/article/details/32188809
         */
        public static void fixInputMethodManagerLeak(Context destContext) {  
            if (destContext == null) {  
                return;  
            }  
    
            InputMethodManager imm = (InputMethodManager) destContext.getSystemService(Context.INPUT_METHOD_SERVICE);  
            if (imm == null) {  
                return;  
            }  
    
            String [] arr = new String[]{"mCurRootView", "mServedView", "mNextServedView"};  
            Field f = null;  
            Object obj_get = null;  
            for (int i = 0;i < arr.length;i ++) {  
                String param = arr[i];  
                try{  
                    f = imm.getClass().getDeclaredField(param);  
                    if (f.isAccessible() == false) {  
                        f.setAccessible(true);  
                    } // author: sodino mail:sodino@qq.com  
                    obj_get = f.get(imm);  
                    if (obj_get != null && obj_get instanceof View) {  
                        View v_get = (View) obj_get;  
                        if (v_get.getContext() == destContext) { // 被InputMethodManager持有引用的context是想要目标销毁的  
                            f.set(imm, null); // 置空,破坏掉path to gc节点  
                        } else {  
                            // 不是想要目标销毁的,即为又进了另一层界面了,不要处理,避免影响原逻辑,也就不用继续for循环了        
                            break;  
                        }  
                    }  
                }catch(Throwable t){  
                    t.printStackTrace();  
                }  
            }  
        }
    
    }
    

    直接在内存泄露的Activity的onDestory()方法中执行该方法:

    @Override
        protected void onDestroy() {
            // TODO Auto-generated method stub
            InputMethodManagerUtils.fixInputMethodManagerLeak(this);
            super.onDestroy();
    
        }


    参考文章:
    [Android][Memory Leak] InputMethodManager内存泄露现象及解决

    展开全文
  • 前几天在定位一个很奇怪的"内存泄漏"问题。我们的服务在arm下面跑到好好的,但是在x86下面的环境下面内存运行时间久了就上涨。用vargrind工具检查内存,也没发现什么问题,说明我们的代码方面应该试ok的。 对比一下...

    前几天在定位一个很奇怪的"内存泄漏"问题。我们的服务在arm下面跑到好好的,但是在x86下面的环境下面内存运行时间久了就上涨。用vargrind工具检查内存,也没发现什么问题,说明我们的代码方面应该试ok的。

    对比一下两套环境的不同,发现libc和libstdc++的版本不同,所以就怀疑应该试这版本上的差异导致内存管理上的不同表现。

    经过测试数据的对比,如果将libc 升级到高版本 比如2.28 运行期间内存表现就会很稳定。原因在于,高版本的libc 的 freee 会定期调用 systrim ,将内存还给操作系统。

    其实这是一个 Free/Delete Not Returning Memory To OS 问题,可以参考学习

    使用jemalloc解决内存碎片问题

    内存优化总结:ptmalloc、tcmalloc和jemalloc

    参考
    【春节红包系列】一次"内存泄漏"引发的血案

    malloc_trim(3) — Linux manual page

    glibc application holding onto unused memory until just before exit

    展开全文
  • 服务器中polkits内存占用很大,经过查阅资料发现可能...polkits存在内存泄漏现象。​ 参考: Bug29069-polkitd memory leaks https://bugs.freedesktop.org/show_bug.cgi?id=29069 进一步发现在redhat的bug清...
  • “没用的对象出现无法回收的现象就是内存泄漏”。 内存泄漏会造成哪些问题: ​ 应用可使用内存逐步变小,增加了堆内存压力 ​ 降低了应用性能,比如频繁触发GC ​ 严重的时候也会造成内存溢出,OOM ​ OOM 发生在,...
  • ARM调查内存泄漏

    2019-03-24 10:27:56
    valgrind即使在arm上移植成功了,想跑起来也非常困难,那么如果去调查arm平台的内存泄漏问题呢,一种思路是替换glibc的malloc 首先定义自己的mymalloc.h // Last Update:2018-09-26 11:27:00 /** * @file mymalloc...
  • 内存溢出和内存泄露

    2018-08-09 22:58:05
    内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory; 内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存...发生内存泄漏的代码会被多次执行到,每次...
  • 当程序员先前未分配的一块内存(或多于一部分)没有正确分配时,就会发生内存泄漏。即使该程序不再使用该内存,它仍然是“保留”的,并且直到程序员适当地重新分配该内存后,程序才能使用该内存。 这就是所谓的...
  • 现象: 在特定的机型上,某个界面上出现InputMethodManager持有一Activity,导致该Activity无法回收.如果该Activity再次被打开,则旧的会释放掉,但新打开的会被继续持有无法释放回收. 要想让Activity释放掉,思路...
  • Java有了GC为什么还会出现内存泄漏问题? 1. 静态集合类泄漏 静态集合类像HashMap,Vector等的使用最容易出现内存泄漏,静态变量的声明周期与应用程序一直,所有的对象Object也不能内释放,因为被其他对象引用着。 2...
  • tomcat7内存泄漏

    千次阅读 2018-08-08 09:56:57
    Tomcat7 它增加了一个内存泄漏的检查,主要是判断web应用重载时,类加载器中所有对象的引用都释放干净。 一般出现提示可能的原因: 1.JDBC驱动注册 2.一些日志框架 3.在ThreadLocal中保存对象,但是并不去删除它 4....
  • 静态内存的数量在编译时是固定的,在程序运行期间也不会改变。自动变量使用的内存数量在程序运行期间自动增加或者减少。但是动态分配的内存数量只会增加,除非使用***free()***函数进行释放。例如,假设有一个创建...
  • java内存泄漏的定位与分析

    万次阅读 2017-03-27 22:14:15
    1、为什么会发生内存泄漏 Java如何检测内在泄漏呢?我们需要一些工具进行检测,并发现内存泄漏问题,不然很容易发生down机问题。 编写java程序最为方便的地方就是我们不需要管理内存的分配和释放,一切由jvm来...
  • 内存泄露是指:内存泄漏也称作"存储渗漏",用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元。直到程序结束。(其实说白了就是该内存空间使用完毕之后未回收)即所谓内存泄漏。 ...
  • 在Android开发中,内存泄漏是比较常见的问题,有过一些Android编程经历的童鞋应该都遇到过,但为什么会出现内存泄漏呢?内存泄漏又有什么影响呢? 在Android程序开发中,当一个对象已经不需要再使用了,本该被...
  • 内存泄漏和内存溢出

    万次阅读 多人点赞 2018-08-22 15:28:58
    内存泄漏:(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果   内存泄露 memory leak,是指程序在申请内存后,...
  • 内存泄漏(增长)火焰图

    千次阅读 2020-03-18 08:26:00
    无论是内存泄漏还是内存增长,如果你的应用在扩展,你肯定想先看看其内部发生了什么,说不定其实是个很容易修复的小问题。但关键是你怎样才能做到呢? 在调试增长问题时,不管你是使用应用程序还是系统工具,通常都...
  • 所以 Michael Simon 推测,目前这种问题的产生可能是因为 macOS 没有正确管理这种统一的内存结构,从而系统会分配超出可用内存的 RAM、不会释放不再需要的 RAM,导致电脑性能逐渐下降,这种现象通常称为“内存泄漏”...
  • 如何定位和解决内存泄露

    千次阅读 2016-07-27 19:02:00
    由于内存泄露导致的游戏BUG的情况。在TestBird手游测试平台上的发生频率很高,我也在此前的文章中谈到过内存占用过高会对手机中的应用造成的影响,今天我们再深入探讨一下内存泄露的问题。  内存泄露是指程序中间...
  • 上周五晚上主营出现部分设备掉线,经过查看日志发现是由于缓存系统出现长时间gc导致的...然后紧急把剩余未gc的一个节点内存dump下来,使用mat工具打开发现,com.mysql.jdbc.NonRegisteringDriver 对象占了堆内存的大...
  • Android内存泄漏的轻松解决方法

    千次阅读 2019-07-02 08:08:53
    这篇文章主要给大家介绍了关于Android内存泄漏的轻松解决方法,文中通过示例代码介绍的非常详细,对各位Android具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧 前言 内存管理的目的就是让我们在开发...
  • vue项目中的内存泄漏

    2021-03-10 17:06:10
    vue中内存泄漏的问题 Q:前几天项目遇到了一个问题,访问页面导致内存不断上涨。 A:原因是在跳转路由销毁页面的时候,并没有释放内存。 接下来就开始查找资料,去排查到底是哪部分的问题,导致内存不释放。 以下...
  • 和你一起终身学习,这里是程序员Android经典好文推荐,通过阅读本文,您将收获以下知识点:一、内存泄露二、 Android的GC机制三、为什么会内存泄露四、 系统级别的内存管理五、内存抖...
  • 学习linux内核之前一直对“内存泄漏”有这么一个认识,就是程序申请了一段内存后,即使程序退出了,那段内存也无法访问了。  后面学习linux内核中的进程管理部分后,觉得这个想法存在问题。当一个进程执行完毕的...
  • 问题描述:某机器煲机爱奇艺视频2、3h后,会出现爱奇艺崩溃,或者退出...基于上面Log,在播放爱奇艺时 free -m,显示只有10M多内存,所以第一时间想到内存不够,优化内存,由于长时间煲机导致运行内存不够爱奇艺挥霍的
  • 1、为什么会发生内存泄漏 java 如何检测内在泄漏呢?我们需要一些工具进行检测,并发现内存泄漏问题,不然很容易发生down机问题。 编写java程序最为方便的地方就是我们不需要管理内存的分配和释放,一切由jvm...
  • 内存溢出和内存泄漏

    千次阅读 2018-05-02 22:29:25
    内存溢出(out ofmemory) 通俗理解就是内存不够,通常在运行大型软件或游戏时,软件或游戏所需要的内存远远超出了你主机内安装的内存所承受大小,就...内存溢出现象: 第一种OutOfMemoryError: PermGenspace 发生...
  • 刚刚做完了一个项目的性能测试,“有幸”也遇到了内存泄露的案例,所以在此和大家分享一下。 主要从以下几部分来说明,关于内存内存泄露、溢出的概念,区分内存泄露内存溢出;内存的区域划分,了解GC回收机制;...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 34,748
精华内容 13,899
关键字:

内存泄漏现象