- 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/
我在我的实验室中通过终端使用 ROOT,我们经常收集数据并且每小时都有一个文件夹,其中包含微小的 .root 文件。 我正在尝试创建一个每日 .root 文件,其中包含某一天获取的所有数据,目前我有许
我正在创建一些 Docker 镜像,并且正在阅读其他人是如何做到这一点的。当涉及到在容器内运行进程的用户时,我已经确定了三种一般模式: 它使用 root 用户 处理一切(在 root 下运行的容器内生
使用此命令设置密码后: mysqladmin.exe --user=root password 我在“根”用户的用户表中看到 3 行: http://i.stack.imgur.com/Y4Rkd.
我有这个秒表,我试图在计数达到 0 后重置它。但是我在使用“after_cancel”功能时遇到了问题。谁能帮忙? 发生的是它无休止地继续,我想杀死“之后”功能。 def countdown(self
if(file_exists( $_SERVER['DOCUMENT_ROOT'] . "/index.html")) echo '文件存在'; 当文件的所有者和组设置为 root:root 时,仅返
我尝试在 AWS 和 Google Drive 上的 Redhat 7 上安装 MySQL,但是在安装 mysql-server 5.7 后,我收到了相同的错误。 [root@localhost ~]
我试图仅将根域(而不是其子文件夹)重定向到另一个 URL,而不更改地址。我正在使用 .htaccess 并使用 [P] 标志进行重定向,这适用于子目录但不适用于根目录。 编写以下 .htaccess
我正在使用 Apache CGI mod 来允许通过 HTTP(S) 请求执行 python 脚本。问题是我想要执行的脚本 backup.py 在某个时刻执行一个子进程调用,其中 mysqldump
我有一个 script.sh 文件执行以下命令: chown -R apache:apache /var/www/html/my/data 如果我尝试使用非 root 用户(用户名 = marco)执
我目前正在开发一款可以在开车时读出短信/电子邮件的应用程序。许多用户希望支持 WhatsApp/KakaoTalk。 但是,由于没有“官方”方式来接收他们的消息,因此只有三个选项,都需要 root:
我已经看到这个问题问了几次,但从未得到完全回答(我能找到)。 需要说明的是,我的手机已 root。 我需要做的是在 root 拥有的目录下读取和写入文件,例如 /data。我知道我需要使用 super
我有一个 Google Compute Engine VM 实例,上面运行着 Asterisk Server。当我尝试运行 sudo 时收到此消息: sudo: parse error in /etc
我正在使用sail 并尝试以root 身份使用shell,这是不可能的。 切换到 root 用户要求输入密码,我不知道。 我尝试更改 dockerfile: ARG WWWROOTGROUP RUN
rvm 的全部意义在于能够安装多个 ruby 并从用户帐户访问它们。当您需要从 root 访问任何这些 ruby 时,您会怎么做?或者使用安装在其中一个 rvms 中的 gems? 有没有一种优雅的(
我正在尝试在 Openshift 中运行 SonarQube pod,但它似乎正在以 root 作为所有者安装持久卷。 我们如何将其更改为非 root 用户? 我用“hostPath”创建了我的持久卷
我是 Ansible 的新手,我已经创建了我的第一个 Ansible 角色剧本,当我尝试运行它时,它抛出了下面的错误,而角色之外的其他模块(如处理程序、模板)工作正常。我仅通过剧本中的角色观察到这个问
对“以非 root 用户和 root 用户身份运行 docker”感到困惑。 第一个问题(以非root用户运行):基于Post-installation steps for Linux ,要以非 ro
在我的项目中,我发现需要以分层方式打破我的聚合,使用顶级根级别聚合,以确保根级别的规则一致性,然后我的根下的对象可以分组为各种聚合。在计算根级聚合的完整性时,根验证自己的规则,然后委托(delegat
我不知道我是怎么做到的,但在过去几天的某个时候,我设法将我的 MAMP Pro 用户名和密码更改为 root:root 以外的其他名称。我一直在本地开发 Wordpress 版本,所以它一定是我当时做
update user set host='%' where user='root 之后,我失去了我的 MySQL root 用户的一些权限。所以我停止了服务器并用 --skip-grant-tabl
我是一名优秀的程序员,十分优秀!