Android之内存泄露、内存溢出、内存抖动分析
内存
栈(stack):是简单的数据结构,程序运行时系统自动分配,使用完毕后自动释放。优点:速度快。
堆(heap):用于存放由new创建的对象和数组。在堆中分配的内存,一方面由java虚拟机自动垃圾回收器来管理,另一方面还需要程序员提供修养,防止内存泄露问题。
方法区(method):又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
Java GC
GC可以自动清理堆中不在使用(不在有对象持有该对象的引用)的对象。
在JAVA中对象如果再没有引用指向该对象,那么该对象就无从处理或调用该对象,这样的对象称为不可到达(unreachable)。垃圾回收用于释放不可到达的对象所占据的内存。
对android来说,内存使用尤为吃紧,最开始的app进程最大分配才8M的内存,渐渐增加到16M、32M、64M,但是和服务端相比还是很渺小的。如果对象回收不及时,很容易出现OOM错误。
内存泄露
危害?内存泄漏对于app没有直接的危害,即使app有发生内存泄漏的情况,也不一定会引起app崩溃,但是会增加app内存的占用。内存得不到释放,慢慢的会造成app内存溢出。解决内存泄漏目的就是防止app发生内存溢出。
- public class MainActivity extends AppCompatActivity {
- static Activity activity;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- CommUtil commUtil = CommUtil.getInstance(this);
- }
- public class CommUtils {
- private static CommUtils instance;
- private Context context;
- private CommUtils(Context context) {
- this.context = context;
- }
- public static CommUtils getInstance(Context context) {
- if (instance == null) {
- instance = new CommUtils(context);
- }
- return instance;
- }
- }
2)异步执行耗时任务期间时,Thread、AsyncTask、TimeTask持有的Activty进行finish时,Activity实例不会被回收。
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- new AsyncTask<String, Void, String>() {
- @Override
- protected String doInBackground(String... params) {
- for (int i = 0; i < 15; i++) {
- try {
- Log.e("MainActivity2", "dddd" + i + MainActivity2.this.getLocalClassName());
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- return null;
- }
- @Override
- protected void onPostExecute(String s) {
- super.onPostExecute(s);
- }
- }.execute();
- }
3)Handler内部类造成内存泄露。
- MyHandler myHandler = new MyHandler();
- @Override
- protected void onCreate(@Nullable Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- myHandler.postDelayed(new Runnable() {
- @Override
- public void run() {
- }
- }, 50 * 1000);
- }
- class MyHandler extends Handler {
- @Override
- public void handleMessage(Message msg) {
- super.handleMessage(msg);
- }
- }
解决办法:在Activity生命周期结束前,确保Handler移除消息(mMyHanlder.removeCallbacksAndMessages(null);)或者使用静态Handler内部类。
- static MyHandler myHandler;
- @Override
- protected void onCreate(@Nullable Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- myHandler = new MyHandler(this);
- }
- static class MyHandler extends Handler {
- WeakReference<Activity> mActivityReference;
- MyHandler(Activity activity) {
- mActivityReference = new WeakReference<Activity>(activity);
- }
- @Override
- public void handleMessage(Message msg) {
- final Activity activity = mActivityReference.get();
- if (activity != null) {
- //....
- }
- }
- }
- public class DemoActivity extends AppCompatActivity {
- Runnable runnable = new Runnable() {
- @Override
- public void run() {
- }
- };
runnable默认会持有DemoActivity的引用。若Activity被finish的时候,如线程在使用runnable,则会造成内存泄露。
- public View getView(int position, View convertView, ViewGroup parent) {
- View view = null;
- if (convertView == null)
- convertView = View.inflate(this, R.layout.item_layout, false);
- view = convertView;
- return view;
- }
更多内存泄露可以通过检测工具发现。检测工具主要有MAT、Memory Monitor 、Allocation Tracker 、Heap Viewer、LeakCanary
内存溢出
内存抖动
Android之内存泄露、内存溢出、内存抖动分析相关推荐
- drools规则引擎因为内存泄露导致的内存溢出
进入这个问题之前,先了解一下drools: 在很多行业应用中比如银行.保险领域,业务规则往往非常复杂,并且规则处于不断更新变化中,而现有很多系统做法基本上都是将业务规则绑定在程序代码中. 主要存在的问 ...
- 转载浅谈MFC内存泄露检测及内存越界访问保护机制
2019独角兽企业重金招聘Python工程师标准>>> 本文所有代码均在VC2008下编译.调试.如果您使用的编译器不同,结果可能会有差别,但本文讲述的原理对于大部分编译器应该是相似 ...
- JavaScript内存泄露,闭包内存泄露如何解决
转载于:JavaScript内存泄露,闭包内存泄露如何解决 - 一粒一世界 - 博客园 JavaScript 内存泄露的4种方式及如何避免 简介 什么是内存泄露? JavaScript 内存管理 Ja ...
- 内存泄露和溢出的区别_Java 中的内存溢出和内存泄露是什么?我给你举个有味道的例子?...
JAVA中的内存溢出和内存泄露分别是什么,有什么联系和区别,让我们来看一看. 内存泄漏 & 内存溢出 1. 内存泄漏(memory leak ) 申请了内存用完了不释放,比如一共有 1024M ...
- java 多线程 内存泄露_关于内存泄露的总结
大致先分为五个小模块: 1.什么是内存泄漏 2.有哪些情况会导致内存泄漏切如何解决 3.如何检测内存泄漏 4.Java得基本数据类型和占用字节 5.什么是内存溢出和解决办法 一.什么是内存泄漏(Mem ...
- java 匿名内部类内存泄露_Android 常见内存泄露 解决方案
前言 内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃 (OOM) 等严重后果. 那什么情况下不能被 ...
- Qt中内存泄露和半自动内存管理
Qt中帮程序员做了一些内存回收的事情,但正因为这些反而让对此不熟悉的人会屡屡犯错. 收录一篇不错的文章: 在C++中学习过程中,我们都知道: delete 和 new 必须 配对使用(一 一对应):d ...
- java thread 内存泄露_Java ThreadLocal 内存泄露问题分析及解决方法。
前言 在分析ThreadLocal导致的内存泄露前,需要普及了解一下内存泄露.强引用与弱引用以及GC回收机制,这样才能更好的分析为什么ThreadLocal会导致内存泄露呢?更重要的是知道该如何避免这 ...
- java中为什么还要防止内存泄露_JAVA防止内存的泄漏什么意思,内存还能泄露?...
展开全部 尽管java虚拟机和62616964757a686964616fe59b9ee7ad9431333166353066垃圾回收机制管理着大部分的内存事务,但是在java软件中还是可能存在内存泄 ...
- win11内存泄露怎么办 Windows11内存泄露的解决方法
最近很多使用Win11系统的小伙伴在打开系统进程的时候发现桌面窗口管理器占用了大量的内存,严重造成了内存泄露,那么遇到这种情况要怎么办呢?下面就就和小编一起来看看有什么解决方法吧.更多windows1 ...
最新文章
- 【OpenCV 4开发详解】均值滤波
- Android开发者指南(18) —— Web Apps Overview
- 使用SC命令时注意事项
- 【深度学习】面向医学图像的病灶分割调研(三)
- 湖南大学第十六届程序设计竞赛 B Yuki with emofunc and playf 同余最短路
- 给 axios 和 redux-axios-middleware 添加finally方法 的使用心得
- 微信带翅膀昵称ʚɞ,这也太可了吧
- HTML+CSS制作3D旋转相册
- 苹果手机说明书_知科技新鲜事 | 华为Mate40系列手机壳曝光:3.5mm耳机孔
- 多层陶瓷电容器用处_具有综合优异电卡性能的无铅多层陶瓷电容器研究新进展...
- 常见NoSQL数据库概述
- 【JAVA程序设计】(C00011)基于ssm的企业OA(考勤)管理系统
- redis数据一致性
- 一意孤行亚马逊----一个钓鱼疯子的巴西亚马逊之行( 11.9月 27日 最惨的一天 ) 作者:咸水鱼...
- pageoffice在线打开word文件加盖电子印章
- ems苹果专线投递速度_“高功率脉冲磁控溅射”新工艺:苹果 iPhone 12 Pro 金色版图赏 - 苹果,iPhone...
- 基于vue-cli快速构建
- 激光雷达赛道“白刃战”?硅光芯片级FMCW技术进入量产周期
- 恩格尔注塑机数据采集
- 现在进行时的stem课堂设计
热门文章
- 并发编程-02并发基础CPU多级缓存和Java内存模型JMM
- Oracle实例迁移_真实场景实操
- 交叉熵损失函数分类_交叉熵损失函数
- html2Escape js 转义
- 解决 org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does no
- tomcat8+在maven中热部署
- Java中如何引用另一个类里的集合_【18期】Java序列化与反序列化三连问:是什么?为什么要?如何做?...
- 数据结构实验之栈与队列五:下一较大值(一)
- 面试题整理 2:求链表倒数第 k 个结点
- 《深度探索C++对象模型》--1 关于对象