`
zeroblue
  • 浏览: 46916 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

工具类:用于监听Activity的创建和内存级回收情况,防止Activity Leaking

 
阅读更多

import java.io.BufferedOutputStream;
import java.io.Closeable;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;

import android.app.Activity;
import android.content.Context;

public final class ActivityMemoryMonitor
{
	private final static ReferenceQueue<Activity> referenceQueue = new ReferenceQueue<Activity>();
	private final static Map<PhantomReference<Activity>, String> phantomReferenceMap = new HashMap<PhantomReference<Activity>, String>();

	private final static String logFile = "activity_memory_monitor.log";

	private static Timer memoryMonitorTimer = null;

	public static void setActivityToMonitoringQueue(Activity activity)
	{
		String activityInfo = activity.toString() + "." + activity.hashCode();
		phantomReferenceMap.put(new PhantomReference<Activity>(activity, referenceQueue), activityInfo);
		writeLogToFile(activity, "Activity Created: " + activityInfo);

		startMonitoringIfNeeded(activity.getApplicationContext());
	}

	private static void startMonitoringIfNeeded(Context context)
	{
		if (memoryMonitorTimer != null)
		{
			return;
		}
		memoryMonitorTimer = new Timer();
		memoryMonitorTimer.schedule(new MemoryMonitorTask(context), 0, 2000);
	}

	private static synchronized void writeLogToFile(Context context, String message)
	{
		FileOutputStream fos = null;
		BufferedOutputStream out = null;
		try
		{
			fos = context.openFileOutput(logFile, Context.MODE_APPEND);
			out = new BufferedOutputStream(fos);
			String log = new Date().toString() + "  " + message + "\n";
			out.write(log.getBytes());
		} catch (IOException e)
		{
		} finally
		{
			close(out);
			close(fos);
		}
	}

	private static void close(Closeable c)
	{
		if (c == null)
		{
			return;
		}

		try
		{
			c.close();
		} catch (IOException e)
		{
		}

	}

	private static class MemoryMonitorTask extends TimerTask
	{
		private Context context;

		MemoryMonitorTask(Context context)
		{
			this.context = context;
		}

		@Override
		public void run()
		{
			System.gc();

			Object o = ActivityMemoryMonitor.referenceQueue.poll();
			if (o != null)
			{
				writeLogToFile(context, "GC Cllected: " + phantomReferenceMap.get(o));
				phantomReferenceMap.remove(o);
			}
		}
	}

}
 
分享到:
评论
1 楼 zeroblue 2011-10-25  
使用时只要在Activity的onCreate方法里写一句:ActivityMemoryMonitor.setActivityToMonitoringQueue(this);

日志会写到data/data/程序包名/files目录下

相关推荐

    private-leaking-investigation:用于演示 AngularJS 内存泄漏的示例应用程序

    通过深入分析"private-leaking-investigation"项目,开发者可以更好地理解和预防AngularJS中的内存泄漏问题,提高应用性能和稳定性。在实际开发中,应时刻保持对内存管理的警惕,遵循最佳实践,以避免潜在的内存泄漏...

    V2EX克隆项目升级Vuejs1xto20

    Vue.js 是一款非常流行的前端JavaScript框架,用于构建用户界面。Vue.js 1.x 和 2.0 是其两个主要版本,两者之间存在一些显著的区别。本文将深入探讨V2EX克隆项目从Vue.js 1.x升级到2.0的过程,以及这个过程中涉及的...

    CheckMem.pas

    关键字: 内存泄漏 checkMem.pas 摘要:  这是一篇介绍如何使用CheckMem.pas单元检查delphi应用程序内存泄漏的文章 作者:999roseto347(fdaf at 163 dot com) 版本:V1.0 创建日期:2004-06-11 目录...

    Android-一个GithubAndroidApp

    8. **Repository和User模型**:开发者需要创建对应的Java或Kotlin类来表示GitHub的Repository和User对象,以便于在应用中处理和展示这些数据。 9. **网络请求和数据缓存**:应用可能使用Retrofit或OkHttp进行网络...

    Cisco-Fusion-Router-IOS-XE-route-leaking-guide from yuanshou

    总结起来,Cisco Fusion Router在IOS XE操作系统上的路由泄露功能是通过创建和管理VRF,使用BGP进行路由信息交换,并利用prefix-list和route-map策略来控制哪些路由应该在VRF间泄露,从而实现网络隔离的同时保证必要...

    信息安全_数据安全_asec-t08-leaking-ads-is-user-data-truly-secure.pdf

    在当今数字化的世界中,信息安全和数据保护成为了至关重要的议题。金融安全、数字风险以及安全建设是企业和个人都必须关注的领域。在《信息安全_数据安全_asec-t08-leaking-ads-is-user-data-truly-secure》这份报告...

    Gradient Inversion Attack Leaking Private Labels in Two-Party Sp

    Gradient Inversion Attack Leaking Private Labels in Two-Party Split Learning_两方分裂学习中泄漏私有标签的梯度反转攻击.pdf

    成人学士学位英语考试复习资料.doc

    - **用一般现在时代替一般将来时**(如例1中的is heated和例2中的please be sure to tell):在时间状语从句和条件状语从句中,通常使用一般现在时来表示将来可能发生的情况,这被称为“主将从现”原则。...

    成人学位英语复习资料.doc

    时态和语态是英语考试中非常重要的一部分,包括现在完成时、过去完成时、将来完成时、现在完成进展时、过去完成进展时和将来完成进展时等。下面是详细的知识点解释: 一、时态和语态 1. 如何解答时态问题 时态...

    sentence_prediction:使用LSTM(语言建模)进行句子预测

    用于根据输入的单词或句子生成多个句子建议。 有关项目详细信息的更多信息,请参见与此项目相关联的。 响应:仅生成1个私钥,即生成描述的单词数 Input: hydrant requires repair Output: hydrant requires repair ...

    8应用 7:一毛不拔 —— 漏斗限流(1).md

    漏斗模型由三个关键元素构成:容量(capacity)、漏嘴流水速率(leaking rate)和剩余空间(left quota)。容量指的是漏斗可容纳的最大水量,对应于限流场景中系统的最大处理能力。漏嘴流水速率是单位时间内漏出的...

    成人学士学位英语考试复习资料[自动保存的].doc

    【成人学士学位英语考试复习】的文档涵盖了多个关于时态和语态的重要知识点,对于备考者来说,理解和掌握这些内容至关重要。时态是英语语法的核心部分,它用于表达动作或状态发生的时间。 1. **时态问题解答**:在...

    loki-rule-operator:Kubernetes Operator,可帮助您为Loki设置配置警报规则

    loki-rule-operator Loki-rule-operator是轻量级的Kubernetes运算符,可将LokiRule和GlobalLokiRule自定义资源定义添加到集群中。 这些资源有助于为您的配置。例子apiVersion : logging.opsgy.com/v1beta1kind : ...

    值班机工考证培训班英语练习试题(库)(带答案解析).doc

    这些题目和答案主要涵盖的是日常英语交际用语和一些专业情境中的英语表达,适用于值班机工考证培训中的英语学习。以下是这些题目所涉及的主要知识点: 1. 介绍他人:正确的表达是"introduce you to",例如"I will ...

    EXAMPLES OF STEAM TRAP AUTO DIAGNOSIS WITH LKS1000-V3 PRO.pdf

    文档中还提到了几种不正常的蒸汽疏水阀状态,包括“淹没或停用”(NOT OK “DROWNED OR OUT OF SERVICE” STEAM TRAPS)和“泄漏”(NOT OK “LEAKING” STEAM TRAPS)的情况。通过对这些异常状态的诊断,可以及时...

    成人学士学位英语考试复习资料全.doc

    在成人学士学位英语考试中,时态和语态是重要的考察点。下面将详细解析这些时态及其应用。 1. 一般过去时 如例1所示,当句子中有明确的过去时间状语(如last week)时,应使用一般过去时。所以正确答案是A. missed...

Global site tag (gtag.js) - Google Analytics