美文网首页Android开发Android开发经验谈Android开发
Android的虚拟机垃圾回收解析,简单明了看完通透!

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

作者: 谁动了我的代码 | 来源:发表于2023-03-28 16:27 被阅读0次

    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的虚拟机垃圾回收解析,简单明了看完通透!

        本文链接:https://www.haomeiwen.com/subject/ppztddtx.html