- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我现在正在调查旧版 BB7 应用程序中的内存泄漏问题,该应用程序最初是由不再在公司工作的开发人员为 OS 4.5 开发的。该孔太大,设备会随着时间的推移而退化,并在使用几个小时后使设备处于缓慢状态。它变得更慢,因为可怕的黑色时钟出现在屏幕上,并且频率不断增加,以进行简单的操作。我已经与调试器确认,当垃圾收集器启动时会出现黑色时钟,并且在这些时间间隔内没有发生其他繁重的处理。显然这些自动GC操作并没有缓解内存短缺的问题。
我已经使用 Eclipse 的 BB 插件中的 BlackBerry Objects View 检查了流程应用程序内存。我没有看到此进程中任何类型的实例数量异常。有趣的是,模型中某个类的大量实例似乎存在于根进程 RAM (pid=0) 中,尽管是由该应用进程创建的。它们似乎是由于对保存它们的持久 vector 的迭代而泄漏的(例如:持久存储中只有 100 个实例,但在对持久 vector 进行几次迭代后,根进程 RAM 中就有 2000 个实例。显然,这 1900 个额外实例是已持久化实例的克隆)。打开调试器后,我可以看到实例不断堆积在 RAM 中,并且不会被我在控制台中看到的简短自动 GC 收集,但当我从调试器中手动强制 GC 时,它们会被删除(这需要相当长的运行时间)。
主要嫌疑点是作为单例实例保存在 RuntimeStore
中的 DAO 类(也必须从备用入口点调用)。它保存对保存在 PersistentStore
中的 BigVector
的引用,并包含上述模型类的实例。这是一个缩短的版本:
public class LeakyDAO {
private long persistentStoreId;
private long runtimeStoreId;
private PersistentObject persistentObject;
private BigVector bigVector;
private LeakyDAO(long id_p, long id_r) {
persistentStoreId = id_p;
runtimeStoreId = id_r;
persistentObject = PersistentStore.getPersistentObject(persistentStoreId);
Object o = persistentObject.getContents();
if(o instanceof BigVector){
bigVector = (BigVector) o;
} else {
bigVector = new BigVector();
persistentObject.setContents(bigVector);
}
}
public static synchronized LeakyDAO getInstance(long idPersist, long idRuntime) {
RuntimeStore rs = RuntimeStore.getRuntimeStore();
LeakyDAO dao = (LeakyDAO) rs.get(idRuntime);
if (dao == null) {
dao = new LeakyDAO(idPersist, idRuntime);
try {
rs.put(idRuntime, dao);
} catch (IllegalArgumentException e) {
//Already exists
}
}
return dao;
}
public synchronized Object get(int index) {
return ObjectGroup.expandGroup(bigVector.elementAt(index));
}
public synchronized void insertAt(int index, Persistable p) {
ObjectGroup.createGroupIgnoreTooBig(p);
if (index >= bigVector.size()) {
bigVector.addElement(p);
} else {
bigVector.insertElementAt(p, index);
}
persistentObject.setContents(bigVector);
persistentObject.commit();
}
}
我忽略的这门课有什么可怕的错误吗?此时,我还无法确认这些实例实际上是问题的原因,因为应用程序在插入调试器时的行为非常不同。但是,由于操作系统中的错误(或已知行为),某些实例在重复调用 get
或 insertAt
后是否会被泄漏?
更新
自动垃圾收集的问题和一些 OutOfMemoryErrors 仅在调试器打开时才会出现。当它不在 Debug模式下时,自动GC确实按预期工作,所以我认为调试器有问题。在对象 View 中我也进行了一些重置。
最佳答案
我看到每个“get”都会调用expandGroup,每个插入都会调用createGroup。我认为这些函数并没有试图提高效率。这意味着他们每次都会复制对象,即使没有必要。
使用这些对象的代码是否修改了它们?或者,如果有修改,您能否缩小范围,并仅在这些情况下使用“getMutable”?如果您可以执行其中任一操作,您将能够从 insertAt 函数中删除“createGroup”,并从 get 函数中删除“expandGroup”,并保存对象副本。
关于java - 黑莓 7 : Odd Memory Leak in Root Process,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17743109/
我想创建后台应用程序,它将监听哪些应用程序已启动以及哪些应用程序移至前台。 请回复 如果问题不清楚会再次解释。 谢谢 最佳答案 这是你可以做的: 使用 ApplicationManager.getFo
下午好。 我开始用 java 和 blackberry 编程。 我正在开发一个带有三个窗口的应用程序,我将显示有关设备的基本信息,这些窗口已经完成并可以工作。 我需要创建一个在后台运行的进程,这个进程
如何翻转 Bitmap上下翻转? (我需要这个来在另一个程序中加载 OpenGL 纹理)。 这是我失败的尝试: stripe.png(由 Pitr@OpenClipart 提供): 翻转.java:
从 Internet 上可用于签署 BB 应用程序的内容来看,我可以猜测我们只需要用于签署应用程序的 .cod 文件,而不需要源代码。 有人可以确认这一点吗? 最佳答案 编译代码时会自动生成 .cod
我想访问闹钟。在我的应用程序中,我已成功访问日历并设置了约会,但我如何访问闹钟。请帮我。以下是我的代码 public class Alarm { private Event event;
作为应用程序的一部分,我们将在设备上的“file:///store/home/user/”位置创建一个文件 myApp.cfg。设备上的加密已启用。因此,myApp.cfg 被重命名为 myApp.c
我需要制作一个包含可点击号码的标签,这样当用户点击标签时,就会调用电话号码(或向用户显示调用电话的选项)。当我现在点击标签时,我只得到一个工具提示类型的菜单,其中包含复制数字的选项... privat
我有兴趣在我的 BlackBerry 应用程序中添加一个可拖动的 slider 。 我想知道 BlackBerry API 中是否有类似的东西,或者是否有人做过类似的东西! 最佳答案 有一个Gauge
最初开发黑莓应用的时候,并没有太在意能够支持多种屏幕分辨率。所以,我最终得到了在 320*240 分辨率下运行良好但在其他屏幕上完全困惑的代码。 我该如何解决这个问题?或者一般来说,如果不为每个资源构
我创建了一个这样的静态函数。 public static Bitmap Bitmap(String path) { Bitmap bitmap = Bitmap .ge
我需要 BlackBerry 本地化方面的帮助。我在 http://na.blackberry.com/eng/developers/resources/developer_labs.jsp#tab_
我创建了一个 RichTextField 我想让它只允许整数值。我怎样才能做到这一点? 最佳答案 你可以尝试这样的事情: public class MyRichTextField extends Ri
在 BlackBerry 平台中,我想知道是否可以/如何执行以下操作: 检索通话记录(我对来电记录特别感兴趣); 删除特定的通话记录; 最佳答案 要检索电话日志,请查看 PhoneCallLog cl
我想知道我们是否可以调整图像大小。假设我们要在黑莓屏幕上绘制一个实际尺寸为200x200且尺寸为100 x 100的图像。 谢谢 最佳答案 只是一种选择: BlackBerry - draw imag
黑莓 JDE 不包括 java.util.ArrayList ,即使它知道 java.util ?那是怎么回事? BB 有对应的类(class)吗?我不想使用数组,真的,因为我要处理的对象数量未知。为
我想使用 graphics.drawLine 方法在 drawListRow 中的黑莓 Listfield 中添加一个分隔符,但下面根本没有绘制线是我正在使用的来源 drawListRow(ListF
我正在为Blackberry设备开发一个应用程序。这个程序包含一个数据库。由于该API是在最新的API版本上提供的,因此我决定使用SQLite。 我遵循了随处都可以找到的所有示例,但是无论发生什么情况
我已将 Blackberry 4.6.0 应用程序移植到 4.7.0 上的 Storm。除了我试图控制的触摸事件之外,一切都运行良好。我在下面的方法中捕获触摸事件,它按预期执行,但问题是在我的 tou
我正在为 BB 开发一个项目。该应用程序与网络一起工作,并通过 HTTP 发送/接收数据。现在我使用队列和队列管理器。管理器从一个后台线程开始,并在 while (true) 循环中工作,检查队列中是
我想在黑莓中合并两个图像。一张图像是大图像,另一张图像是小图像。小图像的位置将由开发人员定义。有哪些可能的方法? 最佳答案 您可以使用 Graphics 类以不同的偏移量在其上绘制多个位图。查看Gra
我是一名优秀的程序员,十分优秀!