Android的虚拟机垃圾回收解析,简单明了看完通透

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虚拟机会启动一个物理内存压缩阶段来释放内存空间,减少内存碎片。

你可能感兴趣的:(Android性能优化,android开发技术,android,jvm,程序员,移动开发,性能优化)