关于初始化变量的内存管理技巧?
Memory management tips on initialising variables?
我正在尝试将我的应用 运行 降低为 Memory Leaks
的风险,并且我目前正专注于整理我的变量初始化作为快速修复。
例如,
public void renameItems(Activity activity, ...) {
AlertDialog.Builder builderInner = new AlertDialog.Builder(activity, R.style.MyAlertDialogStyle);
LinearLayout layout = new LinearLayout(activity);
final TextView itemTitle = new TextView(activity);
final EditText itemTitleInput = new EditText(activity);
final TextView subItem = new TextView(activity);
final EditText subItemInput = new EditText(activity);
// Irrelevant code ...
}
每当调用此方法时,是否每次都会创建这些变量的新实例?如果是这样,完成后我将如何取消它们?
我也尝试过更改变量的范围,但我需要将上下文传递给它们(我从方法中收到),我不确定我将如何在全球范围内做到这一点。
也许这不是针对所提供代码的解决方案的确切答案,但您要求针对应用程序内部 handle/detect 内存泄漏的一般解决方案,对吗?
神师 Jake Wharton 前段时间发布了一个很好的工具来检测潜在的内存泄漏:
它叫做 LeakCanary
集成到您的应用程序中真的很容易! (但请注意不要将其添加到发布版本!!!)
在 github page 上描述了如何将 LeakCanary 集成到您的应用中:
在你的build.gradle中:
dependencies {
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.4'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4'
testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4'
}
在您的申请中class:
public class ExampleApplication extends Application {
@Override public void onCreate() {
super.onCreate();
LeakCanary.install(this);
}
}
Sooooo...但是现在你漏水了,接下来怎么办?
根据我的个人经验,请注意做这样的事情:
- 尽量避免将 Activity 或 Activity 上下文保存为 class
成员。如果可能,请始终使用应用程序上下文!
- 尽量避免通过运行时创建布局!使用 xml-layout
给它们充气
- 如果您正在使用 EventBus,RxJava/RxAndroid,等等:不要忘记取消订阅您正在使用的 tools/framworks/providers
使用。如果他们在 Activity 遇到之后没有退订
onPause()
或 onStop()
- 如果您真的害怕在方法内部创建变量,请尽量避免在方法顶部创建所有变量,在需要时创建它们!在 Java 你没有 nullify/terminate 他们!这就是您拥有垃圾收集器的原因!
我正在尝试将我的应用 运行 降低为 Memory Leaks
的风险,并且我目前正专注于整理我的变量初始化作为快速修复。
例如,
public void renameItems(Activity activity, ...) {
AlertDialog.Builder builderInner = new AlertDialog.Builder(activity, R.style.MyAlertDialogStyle);
LinearLayout layout = new LinearLayout(activity);
final TextView itemTitle = new TextView(activity);
final EditText itemTitleInput = new EditText(activity);
final TextView subItem = new TextView(activity);
final EditText subItemInput = new EditText(activity);
// Irrelevant code ...
}
每当调用此方法时,是否每次都会创建这些变量的新实例?如果是这样,完成后我将如何取消它们?
我也尝试过更改变量的范围,但我需要将上下文传递给它们(我从方法中收到),我不确定我将如何在全球范围内做到这一点。
也许这不是针对所提供代码的解决方案的确切答案,但您要求针对应用程序内部 handle/detect 内存泄漏的一般解决方案,对吗?
神师 Jake Wharton 前段时间发布了一个很好的工具来检测潜在的内存泄漏: 它叫做 LeakCanary
集成到您的应用程序中真的很容易! (但请注意不要将其添加到发布版本!!!)
在 github page 上描述了如何将 LeakCanary 集成到您的应用中:
在你的build.gradle中:
dependencies {
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.4'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4'
testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4'
}
在您的申请中class:
public class ExampleApplication extends Application {
@Override public void onCreate() {
super.onCreate();
LeakCanary.install(this);
}
}
Sooooo...但是现在你漏水了,接下来怎么办? 根据我的个人经验,请注意做这样的事情:
- 尽量避免将 Activity 或 Activity 上下文保存为 class 成员。如果可能,请始终使用应用程序上下文!
- 尽量避免通过运行时创建布局!使用 xml-layout 给它们充气
- 如果您正在使用 EventBus,RxJava/RxAndroid,等等:不要忘记取消订阅您正在使用的 tools/framworks/providers
使用。如果他们在 Activity 遇到之后没有退订
onPause()
或onStop()
- 如果您真的害怕在方法内部创建变量,请尽量避免在方法顶部创建所有变量,在需要时创建它们!在 Java 你没有 nullify/terminate 他们!这就是您拥有垃圾收集器的原因!