内存优化之内存泄漏问题
来源:互联网 发布:阿里云数据库实例 编辑:程序博客网 时间:2024/05/17 03:28
Java采用GC进行内存管理。深入的JVM内存管理知识,推荐《深入理解Java虚拟机》。
关于内存泄漏我们要知道,JVM内存分配的几种策略。
静态的
静态的存储区,内存在程序编译的时候就已经分配好了,这块内存在程序整个运行期间都一直存在,它主要存放静态数据、全局的static数据和一些常量。
栈式的
在执行方法时,方法一些内部变量的存储都可以放在栈上面创建,方法执行结束的时候这些存储单元就会自动被注释掉。栈 内存包括分配的运算速度很快,因为内在在处理器里面。当然容量有限,并且栈式一块连续的内存区域,大小是由操作系统决定的,他先进后 出,进出完成不会产生碎片,运行效率高且稳定
堆式的
也叫动态内存 。我们通常使用new 来申请分配一个内存。这里也是我们讨论内存泄漏优化的关键存储区。GC会根据内存的使用情况,对堆内存里的垃圾内存进行回收。堆内存是一块不连续的内存区域,如果频繁地new/remove会造成大量的内存碎片,GC频繁的回收,导致内存抖动,这也会消耗我们应用的性能
我们知道可以调用 System.gc();进行内存回收,但是GC不一定会执行。面对GC的机制,我们是否无能为力?其实我们可以通过声明一些引用标记来让GC更好对内存进行回收。
开发时,为了防止内存溢出,处理一些比较占用内存并且生命周期长的对象时,可以尽量使用软引用和弱引用。
Tip
成员变量全部存储在堆中(包括基本数据类型,引用及引用的对象实体),因为他们属于类,类对象最终还是要被new出来的
局部变量的基本数据类型和引用存在栈中,应用的对象实体存储在堆中。因为它们属于方法当中的变量,生命周期会随着方法一起结束
内存泄漏的定义:
当一个对象已经不需要使用了,本该被回收时,而有另外一个正在使用的对象持有它的引用,从而导致了对象不能被GC回收。这种导致了本该被回收的对象不能被回收而停留在堆内存中,就产生了内存泄漏
内存泄漏与内存溢出的区别:
内存泄漏(Memory Leak)
进程中某些对象已经没有使用的价值了,但是他们却还可以直接或间接地被引用到GC Root导致无法回收。当内存泄漏过多的时候,再加上应用本身占用的内存,日积月累最终就会导致内存溢出OOM
内存溢出(OOM)
当 应用的heap资源超过了Dalvik虚拟机分配的内存就会内存溢出
应用卡顿
泄漏的内存影响了GC的内存分配,过多的内存泄漏会影响应用的执行效率
应用异常(OOM)
过多的内存泄漏,最终会导致 Dalvik分配的内存,出现OOM
1、单例造成的内存泄漏
当调用getInstance时,如果传入的context是Activity的context。只要这个单例没有被释放,那么这个Activity也不会被释放一直到进程退出才会释放。
protected void onDestroy() {
super.onDestroy();
mHandler.removeCallbacksAndMessages(null);
}
5、资源未关闭造成的内存泄漏
在Activity销毁时及时关闭或者注销
SensorManager sensorManager = getSystemService(SENSOR_SERVICE);Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ALL);sensorManager.registerListener(this,sensor,SensorManager.SENSOR_DELAY_FASTEST);//解决方案//不需要用的时候记得移除监听 sensorManager.unregisterListener(listener);7、不需要用的监听未移除会发生内存泄露
//add监听,放到集合里面 tv.getViewTreeObserver().addOnWindowFocusChangeListener(new ViewTreeObserver.OnWindowFocusChangeListener() { @Override public void onWindowFocusChanged(boolean b) { //监听view的加载,view加载出来的时候,计算他的宽高等。 } });//解决方案//计算完后,一定要移除这个监听 tv.getViewTreeObserver().removeOnWindowFocusChangeListener(this);Tip
tv.setOnClickListener();//监听执行完回收对象,不用考虑内存泄漏
tv.getViewTreeObserver().addOnWindowFocusChangeListene,add监听,放到集合里面,需要考虑内存泄漏
当然内存泄漏分析会有工具
- 内存优化之内存泄漏问题
- 30、内存优化之内存泄漏记录
- android 内存优化篇之内存泄漏原因与内存泄漏优化
- 性能优化二之内存泄漏
- Android性能优化之内存泄漏
- Android性能优化之内存泄漏
- Android性能优化之内存泄漏
- Android-性能优化之内存泄漏(一)
- Android-性能优化之内存泄漏(二)
- android 性能优化之内存泄漏
- Android 性能优化之内存泄漏检测以及内存优化(上)
- Android 性能优化之内存泄漏检测以及内存优化(下)
- Android开发之内存优化有效防止内存溢出OOM与内存泄漏
- Php学习之内存泄漏问题详解
- Android面试题之内存溢出和内存泄漏的问题
- Android面试题之内存溢出和内存泄漏的问题
- java之内存泄漏
- 捉虫记------之内存泄漏
- MyEclipse使用快捷键
- 【js正则表达式RegExp】使用
- c语言中realloc()函数解析
- [LeetCode]40.Combination Sum II
- 操作系统的进程、多线程、内存管理、垃圾回收、以及缓冲等方面
- 内存优化之内存泄漏问题
- USACO 3.1 Score Inflation (完全背包) P2722 总分 Score Inflation
- java中Iterator有什么用,举例说明?
- spring使用加密的属性文件
- oracle 除数为 0
- 杭电oj(Java版)——2005 第几天?
- CodeForces 204D Little Elephant and Retro Strings
- Android应用开发之数据加密浅析
- PL/SQL 异常处理