Android中哪些对象可作为GC Roots呢?

  1. 虚拟机栈(栈帧中的本地变量表)中的引用对象
    • 概念解释:在Java(Android基于Java)虚拟机执行方法时,会为每个方法创建一个栈帧,栈帧中包含本地变量表。本地变量表中存储了方法中的局部变量,这些局部变量如果是对象引用,那么这个引用所指向的对象就可以作为GC Roots。例如,在一个Activity的onCreate方法中定义了一个TextView对象,这个TextView的引用存储在栈帧的本地变量表中,它所指向的TextView对象就可以作为GC Roots。
    • 示例代码
      public class MainActivity extends AppCompatActivity {
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
              TextView textView = new TextView(this);
              // 此时textView这个引用所指向的TextView对象可作为GC Roots
          }
      }
      
  2. 方法区中类静态属性引用的对象
    • 概念解释:类的静态变量是属于类本身的,它们存储在方法区。如果静态变量是一个对象引用,那么这个引用所指向的对象可以作为GC Roots。例如,有一个工具类Utils,其中有一个静态的Bitmap对象作为缓存,这个静态Bitmap引用所指向的Bitmap对象就可以作为GC Roots。
    • 示例代码
      class Utils {
          public static Bitmap cacheBitmap;
          // 当有对象赋值给cacheBitmap时,该对象可作为GC Roots
      }
      
  3. 方法区中常量引用的对象
    • 概念解释:常量池中的常量如果是对象引用,例如字符串常量池中的字符串对象引用,这些引用所指向的对象可以作为GC Roots。在Java(Android也遵循)中,字符串常量池存储了字符串字面量。如果一个字符串在程序中被定义为常量并且被引用,那么这个引用所指向的字符串对象可以作为GC Roots。
    • 示例代码
      public class ConstantExample {
          public static final String CONSTANT_STRING = "Hello";
          // CONSTANT_STRING这个常量引用所指向的字符串对象可作为GC Roots
      }
      
  4. 本地方法栈中JNI(Java Native Interface)引用的对象
    • 概念解释:当在Android应用中使用本地方法(通过JNI调用C或C++代码),本地方法栈中JNI引用的对象可以作为GC Roots。例如,在一个Android应用中通过JNI调用了一个C库中的函数,并且这个函数返回了一个对象引用给Java层,这个引用所指向的对象可以作为GC Roots。
    • 示例说明:假设存在一个本地方法nativeMethod,它返回一个对象引用:
      public class NativeExample {
          public native Object nativeMethod();
          // 当调用nativeMethod得到的对象引用所指向的对象可作为GC Roots
      }
      
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容