Android虚拟机垃圾回收原理
Android虚拟机使用的是基于Java的Dalvik虚拟机,它的垃圾回收机制和Java虚拟机的垃圾回收机制类似。Dalvik虚拟机中的垃圾回收分为分代垃圾回收和并发垃圾回收两种方式。
首先,Dalvik虚拟机使用分代垃圾回收机制,将所有Java对象分为Young Generation、Old Generation和Permanent Generations三代。当一个对象被创建时,它被分配到Young Generation。在Young Generation中的对象,当内存不足时,就会触发一次Minor GC(年轻代垃圾回收)。Minor GC只扫描年轻代中的对象,清理出所有无法到达的对象,并将剩余的对象移动到Old Generation。
在Old Generation中的对象,当内存不足时,就会触发一次Major GC(老年代垃圾回收)。Major GC会扫描整个堆中的所有对象,清理出所有无法到达的对象,并将剩余的对象保留在Old Generation中。Permanent Generation是用于存放静态对象和常量的一块区域,不参与垃圾回收。
除了分代垃圾回收之外,Dalvik虚拟机还使用了基于标记-清除算法的并发垃圾回收机制。这种回收机制可以在系统正常运行时,进行垃圾回收操作。首先是标记阶段,通过标记所有无法到达的对象。然后在清除阶段回收无法到达的对象。
Java内存和非Java内存的垃圾回收
Android虚拟机垃圾回收机制由两个部分组成
Java内存的垃圾回收
Java内存的垃圾回收主要涉及分代垃圾回收和并发垃圾回收。
分代垃圾回收:Java的分代垃圾回收机制将内存分成了不同的区域,每个区域负责管理不同年龄的对象。在年轻代区域,垃圾回收不会引起程序停顿;在老年代区域,垃圾回收可能会导致程序停顿。当某个区域的内存使用超过了其限制时,就会触发垃圾回收。
并发垃圾回收:并发垃圾回收是在应用程序正常运行时,与操作系统同时运行的垃圾回收机制。在并发垃圾回收期间,虚拟机会启动一个线程来标记和清理无用对象,以释放内存空间。
非Java内存的垃圾回收
除了Java对象,Android应用程序还使用大量的非Java内存,如Bitmap、JNI对象和资源等。由于这些对象不受Java垃圾回收机制的管理,因此需要专门的垃圾回收机制来进行处理。
在非Java内存的垃圾回收中,主要涉及Bitmap的回收。Bitmap是一种占用大量内存的对象,使用不当容易引起内存问题。Android提供了一种bitmap.recycle()方法来释放Bitmap对象所占用的内存空间。如果在应用退出前手动将所有Bitmap回收,则可以避免内存泄漏和应用崩溃等问题。
总的来说,Android虚拟机垃圾回收机制是通过Java内存和非Java内存的垃圾回收机制来有效地管理内存,提高系统性能和稳定性。在实际应用中,程序员需要根据实际需求来合理地使用内存和垃圾回收机制,以避免出现内存泄漏和应用崩溃等问题。
基于Android虚拟机的垃圾回收实战代码
java
public class MainActivity extends AppCompatActivity {
private String[] arr = new String[10000];
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.textView);
for (int i=0; i<10000; i++) {
arr[i] = Integer.toString(i);
}
}
@Override
protected void onResume() {
super.onResume();
updateUI();
}
private void updateUI() {
StringBuilder stringBuilder = new StringBuilder();
for (String s : arr) {
stringBuilder.append(s).append("\n");
}
textView.setText(stringBuilder.toString());
}
@Override
protected void onDestroy() {
super.onDestroy();
//手动调用垃圾回收机制
System.gc();
}
}
这个代码可以创建一个大小为10000的字符串数组,然后在onResume方法中对UI进行更新,最后在onDestroy方法中手动调用垃圾回收机制。在这个例子中,每次更新UI时,都会创建一个新的StringBuilder对象并通过循环将数组中的字符串连接起来。如果没有手动调用垃圾回收机制,这些未使用的StringBuilder对象和字符串对象将会一直占用内存,可能会导致内存泄漏和应用崩溃。通过手动调用垃圾回收机制,可以清除这些无法到达的对象,释放内存空间,保证应用的稳定性和性能。
总结
Android虚拟机垃圾回收机制的运作过程主要分为以下几个阶段
- 内存分配阶段:当应用需要加载新的类或创建新的对象时,Android虚拟机会根据需要动态分配内存空间。
- 分代回收阶段:Android虚拟机采用分代垃圾回收机制,将内存分为不同的代,根据不同代的对象生命周期,选择不同的垃圾回收策略进行回收,以优化内存的使用。
- 并发标记阶段:应用程序正常运行时,Android虚拟机会启动一个线程用于对堆内存进行并发标记,标记存活对象,以便后续的清理操作。
- 并发清理阶段:在并发标记阶段结束之后,虚拟机会启动一个线程来清理不可达对象,以回收内存空间。
- 物理内存压缩阶段:当内存占用过高时,Android虚拟机会启动一个物理内存压缩阶段来释放内存空间,减少内存碎片。
网友评论