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);
}
}
}
}
分享到:
相关推荐
通过深入分析"private-leaking-investigation"项目,开发者可以更好地理解和预防AngularJS中的内存泄漏问题,提高应用性能和稳定性。在实际开发中,应时刻保持对内存管理的警惕,遵循最佳实践,以避免潜在的内存泄漏...
Vue.js 是一款非常流行的前端JavaScript框架,用于构建用户界面。Vue.js 1.x 和 2.0 是其两个主要版本,两者之间存在一些显著的区别。本文将深入探讨V2EX克隆项目从Vue.js 1.x升级到2.0的过程,以及这个过程中涉及的...
关键字: 内存泄漏 checkMem.pas 摘要: 这是一篇介绍如何使用CheckMem.pas单元检查delphi应用程序内存泄漏的文章 作者:999roseto347(fdaf at 163 dot com) 版本:V1.0 创建日期:2004-06-11 目录...
8. **Repository和User模型**:开发者需要创建对应的Java或Kotlin类来表示GitHub的Repository和User对象,以便于在应用中处理和展示这些数据。 9. **网络请求和数据缓存**:应用可能使用Retrofit或OkHttp进行网络...
总结起来,Cisco Fusion Router在IOS XE操作系统上的路由泄露功能是通过创建和管理VRF,使用BGP进行路由信息交换,并利用prefix-list和route-map策略来控制哪些路由应该在VRF间泄露,从而实现网络隔离的同时保证必要...
在当今数字化的世界中,信息安全和数据保护成为了至关重要的议题。金融安全、数字风险以及安全建设是企业和个人都必须关注的领域。在《信息安全_数据安全_asec-t08-leaking-ads-is-user-data-truly-secure》这份报告...
Gradient Inversion Attack Leaking Private Labels in Two-Party Split Learning_两方分裂学习中泄漏私有标签的梯度反转攻击.pdf
- **用一般现在时代替一般将来时**(如例1中的is heated和例2中的please be sure to tell):在时间状语从句和条件状语从句中,通常使用一般现在时来表示将来可能发生的情况,这被称为“主将从现”原则。...
时态和语态是英语考试中非常重要的一部分,包括现在完成时、过去完成时、将来完成时、现在完成进展时、过去完成进展时和将来完成进展时等。下面是详细的知识点解释: 一、时态和语态 1. 如何解答时态问题 时态...
用于根据输入的单词或句子生成多个句子建议。 有关项目详细信息的更多信息,请参见与此项目相关联的。 响应:仅生成1个私钥,即生成描述的单词数 Input: hydrant requires repair Output: hydrant requires repair ...
漏斗模型由三个关键元素构成:容量(capacity)、漏嘴流水速率(leaking rate)和剩余空间(left quota)。容量指的是漏斗可容纳的最大水量,对应于限流场景中系统的最大处理能力。漏嘴流水速率是单位时间内漏出的...
【成人学士学位英语考试复习】的文档涵盖了多个关于时态和语态的重要知识点,对于备考者来说,理解和掌握这些内容至关重要。时态是英语语法的核心部分,它用于表达动作或状态发生的时间。 1. **时态问题解答**:在...
loki-rule-operator Loki-rule-operator是轻量级的Kubernetes运算符,可将LokiRule和GlobalLokiRule自定义资源定义添加到集群中。 这些资源有助于为您的配置。例子apiVersion : logging.opsgy.com/v1beta1kind : ...
这些题目和答案主要涵盖的是日常英语交际用语和一些专业情境中的英语表达,适用于值班机工考证培训中的英语学习。以下是这些题目所涉及的主要知识点: 1. 介绍他人:正确的表达是"introduce you to",例如"I will ...
文档中还提到了几种不正常的蒸汽疏水阀状态,包括“淹没或停用”(NOT OK “DROWNED OR OUT OF SERVICE” STEAM TRAPS)和“泄漏”(NOT OK “LEAKING” STEAM TRAPS)的情况。通过对这些异常状态的诊断,可以及时...
在成人学士学位英语考试中,时态和语态是重要的考察点。下面将详细解析这些时态及其应用。 1. 一般过去时 如例1所示,当句子中有明确的过去时间状语(如last week)时,应使用一般过去时。所以正确答案是A. missed...