Closed fishofeyes closed 2 years ago
故意写一段内存泄漏的代码,发现很难触发内存泄漏
leak_preview_page.dart scrollController 没有dispose
已经fix
故意写一段内存泄漏的代码,发现很难触发内存泄漏
这个库写的比较简单,目前仅能检测到Widget Element State之类的释放行为,并且vm_service这个插件获取引用链的时候经常会报错,没有具体的报错原因,应该是dartVM中报错了。导致引用链获取失败,就会检测不到。
scrollController没有dispose已修复
故意写一段内存泄漏的代码,发现很难触发内存泄漏
这个库写的比较简单,目前仅能检测到Widget Element State之类的释放行为,并且vm_service这个插件获取引用链的时候经常会报错,没有具体的报错原因,应该是dartVM中报错了。导致引用链获取失败,就会检测不到。
当对象被回收了再使用object id去获取引用链就会报错
当对象被回收了再使用object id去获取引用链就会报错
故意写的一段内存泄露,结果检测出来的InstanceRef.id 为 'objects/null',获取不到引用链,会是同样的原因吗?
当对象被回收了再使用object id去获取引用链就会报错
故意写的一段内存泄露,结果检测出来的InstanceRef.id 为 'objects/null',获取不到引用链,会是同样的原因吗?
可以把测试代码贴出来看看吗
class _LeakTestPageState extends State<LeakTestPage> {
int countTimer = 100;
Timer? timer;
@override
void initState() {
super.initState();
timer = Timer.periodic(const Duration(milliseconds: 1000), (timer) {
countTimer--;
if (countTimer == 0) {
timer.cancel();
}
print('leakTest $countTimer $widget');
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
leading: IconButton(
icon: const Icon(
Icons.chevron_left
),
onPressed: _back,
),
),
body: Container(
),
);
}
void _back() {
Navigator.of(context).pop();
}
}
其实就是用一个Timer去打印widget,奇怪的是这个测试页面放在示例demo里面能检测出来,放在项目里面就不行了,头秃。
可以把测试代码贴出来看看吗
上面的测试代码在项目中没检出泄露找到原因了,在添加弱引用时,拿到的是Page的child也就是Scaffold。
我在第2个visitChildElements对element赋值就能检测出来
感谢反馈,请问您用的哪个Flutter版本,我看一下源码,看能不能找到一种更优的寻找Element的办法
感谢反馈,请问您用的哪个Flutter版本,我看一下源码,看能不能找到一种更优的寻找Element的办法
[✓] Flutter (Channel stable, 3.3.7, on macOS 13.0 22A380 darwin-arm, locale zh-Hans-CN) [!] Android toolchain - develop for Android devices (Android SDK version 33.0.2) ! Some Android licenses not accepted. To resolve this, run: flutter doctor --android-licenses [✓] Android Studio (version 2022.1)
leak_preview_page.dart scrollController 没有dispose