领域事务导致 GC 扫描 ui 冻结
Realm transaction causes GC sweep ui freeze
我的 ui 在 Realm 中进行交易时冻结。在事务期间进行大量 GC 扫描:
Starting a blocking GC Explicit
Explicit concurrent mark sweep GC freed 21(1312B) AllocSpace objects, 0(0B) LOS objects, 13% free, 106MB/122MB, paused 480us total 24.157ms
这是我第一次遇到这个问题。一直在很多项目中使用 Realm 而没有遇到这样的事情。即使删除所有代码并只保留 realm.begintransaction 和 realm.committransaction 调用它也会冻结,所以我将问题归结为事务本身。但考虑到如果开始和提交之间没有任何内容也会发生这种情况,这与大小或查询本身无关。
public static void insertValueForKeyInSession(final String sessionUuid, final String key, final String value){
Realm realm = App.getCoreRealmInstance(App.getContext());
RealmQuery<DataResponse> query = realm.where(DataResponse.class);
query.equalTo("sessionUuid", sessionUuid);
query.equalTo("key", key);
final RealmResults<DataResponse> result = query.findAll();
if (result.size() > 0) {
DataResponse response = result.get(0);
realm.beginTransaction();
response.setValue(value);
realm.commitTransaction();
} else {
DataResponse dataResponse = new DataResponse();
String uuid = UUID.randomUUID().toString();
dataResponse.setSessionUuid(sessionUuid);
dataResponse.setUuid(uuid);
dataResponse.setKey(key);
dataResponse.setValue(value);
realm.beginTransaction();
realm.copyToRealm(dataResponse);
realm.commitTransaction();
}
realm.close();
Log.d(TAG,"insertValue Stopped");
}
从 https://realm.io/docs/java/0.76.0/#writes 看来 "writes block each other, and will block the thread they are made on if other writes are in progress." 是否有可能正在进行另一次写入?
花了我一些时间,但我能够解决这个问题。仍然不知道确切的原因,如果有人能得到任何相关信息,那就太好了:)经过很多次尝试,我终于想到了我最近在这个项目中改变的所有事情。
我必须使用迁移和配置,所以之前我会通过正常 Realm.getInstance(上下文上下文)获得领域实例。我已将代码更改为 App.getCoreRealmInstance(App.getContext()).. 此方法:
RealmConfiguration realmConfiguration = new RealmConfiguration.Builder(context)
.schemaVersion(dbVersion)
.migration(new Migration())
.build();
return Realm.getInstance(realmConfiguration);
我所做的更改:
以下方法仅在启动时调用一次并设置默认配置..
RealmConfiguration realmConfiguration = new RealmConfiguration.Builder(上下文)
.schemaVersion(dbVersion)
.migration(新迁移())
。建造();
Realm.setDefaultConfiguration(领域配置)
App.getCoreRealmInstance方法现在只有returns Realm.getDefaultInstance();
我的 ui 在 Realm 中进行交易时冻结。在事务期间进行大量 GC 扫描:
Starting a blocking GC Explicit
Explicit concurrent mark sweep GC freed 21(1312B) AllocSpace objects, 0(0B) LOS objects, 13% free, 106MB/122MB, paused 480us total 24.157ms
这是我第一次遇到这个问题。一直在很多项目中使用 Realm 而没有遇到这样的事情。即使删除所有代码并只保留 realm.begintransaction 和 realm.committransaction 调用它也会冻结,所以我将问题归结为事务本身。但考虑到如果开始和提交之间没有任何内容也会发生这种情况,这与大小或查询本身无关。
public static void insertValueForKeyInSession(final String sessionUuid, final String key, final String value){
Realm realm = App.getCoreRealmInstance(App.getContext());
RealmQuery<DataResponse> query = realm.where(DataResponse.class);
query.equalTo("sessionUuid", sessionUuid);
query.equalTo("key", key);
final RealmResults<DataResponse> result = query.findAll();
if (result.size() > 0) {
DataResponse response = result.get(0);
realm.beginTransaction();
response.setValue(value);
realm.commitTransaction();
} else {
DataResponse dataResponse = new DataResponse();
String uuid = UUID.randomUUID().toString();
dataResponse.setSessionUuid(sessionUuid);
dataResponse.setUuid(uuid);
dataResponse.setKey(key);
dataResponse.setValue(value);
realm.beginTransaction();
realm.copyToRealm(dataResponse);
realm.commitTransaction();
}
realm.close();
Log.d(TAG,"insertValue Stopped");
}
从 https://realm.io/docs/java/0.76.0/#writes 看来 "writes block each other, and will block the thread they are made on if other writes are in progress." 是否有可能正在进行另一次写入?
花了我一些时间,但我能够解决这个问题。仍然不知道确切的原因,如果有人能得到任何相关信息,那就太好了:)经过很多次尝试,我终于想到了我最近在这个项目中改变的所有事情。
我必须使用迁移和配置,所以之前我会通过正常 Realm.getInstance(上下文上下文)获得领域实例。我已将代码更改为 App.getCoreRealmInstance(App.getContext()).. 此方法:
RealmConfiguration realmConfiguration = new RealmConfiguration.Builder(context)
.schemaVersion(dbVersion)
.migration(new Migration())
.build();
return Realm.getInstance(realmConfiguration);
我所做的更改:
以下方法仅在启动时调用一次并设置默认配置..
RealmConfiguration realmConfiguration = new RealmConfiguration.Builder(上下文) .schemaVersion(dbVersion) .migration(新迁移()) 。建造(); Realm.setDefaultConfiguration(领域配置)
App.getCoreRealmInstance方法现在只有returns Realm.getDefaultInstance();