-
虚拟机栈(栈帧中的本地变量表)中的引用对象
-
概念解释:在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 } }
-
概念解释:在Java(Android基于Java)虚拟机执行方法时,会为每个方法创建一个栈帧,栈帧中包含本地变量表。本地变量表中存储了方法中的局部变量,这些局部变量如果是对象引用,那么这个引用所指向的对象就可以作为GC Roots。例如,在一个Activity的
-
方法区中类静态属性引用的对象
-
概念解释:类的静态变量是属于类本身的,它们存储在方法区。如果静态变量是一个对象引用,那么这个引用所指向的对象可以作为GC Roots。例如,有一个工具类
Utils
,其中有一个静态的Bitmap
对象作为缓存,这个静态Bitmap
引用所指向的Bitmap
对象就可以作为GC Roots。 -
示例代码:
class Utils { public static Bitmap cacheBitmap; // 当有对象赋值给cacheBitmap时,该对象可作为GC Roots }
-
概念解释:类的静态变量是属于类本身的,它们存储在方法区。如果静态变量是一个对象引用,那么这个引用所指向的对象可以作为GC Roots。例如,有一个工具类
-
方法区中常量引用的对象
- 概念解释:常量池中的常量如果是对象引用,例如字符串常量池中的字符串对象引用,这些引用所指向的对象可以作为GC Roots。在Java(Android也遵循)中,字符串常量池存储了字符串字面量。如果一个字符串在程序中被定义为常量并且被引用,那么这个引用所指向的字符串对象可以作为GC Roots。
-
示例代码:
public class ConstantExample { public static final String CONSTANT_STRING = "Hello"; // CONSTANT_STRING这个常量引用所指向的字符串对象可作为GC Roots }
-
本地方法栈中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 }
Android中哪些对象可作为GC Roots呢?
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 引言 经过前面五个章节的分析后,对于JVM的大部分子系统都已阐述完毕,在本文中则开始对JVM的GC子系统进行全面阐...
- 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏大家都不陌生了,简单粗俗的讲,...