android - 原始类型是否在 Android 中被垃圾收集?

标签 android garbage-collection dalvik

我知道这可能是一个愚蠢的问题,但我的背景更多是 C++ 和管理我自己的内存。

我目前正在减少我可以从我的一个游戏中进行的每个分配,以尝试减少垃圾收集的频率和感知的“滞后”,因此对于我创建的每个变量都是一个对象(字符串和矩形示例)我确保在构造函数中先创建它,而不是在简单 10 中创建临时变量 线函数...(我希望这是有道理的)

不管怎样,尽管今晚我工作了一些,但我意识到我对垃圾收集的假设可能完全错误,原始类型(int、boolean、float)是我在 10 行函数中创建的这些原始类型变量被称为 20 每秒增加我的垃圾收集问题?

所以一年前每隔几秒我就会在 logcat 中看到一条消息,例如

GC freed 4010 objects / 484064 bytes in 101ms

现在我每隔 15-90 秒左右就会看到一条消息...

所以换个说法:看到此消息时是否包含原始类型(int、float、boolean 等)?

最佳答案

原始类型不是对象,因此它们不会导致任何垃圾回收。但是,您必须非常小心,因为由于装箱,原始类型很容易成为对象,而无需您明确这样做。

例如,如果你想要一个整数键的 HashMap<>,你会使用 HashMap。请注意,因为“int”不是对象,所以不能在容器中使用。 Integer 是原始 int 的对象版本。当您编写这样的代码时,会自动为您创建一个 Integer 对象:

HashMap<Integer, Object> map = new HashMap<Integer, Object>();
int someNum = 12345;    // no object created.
map.put(someNum, null); // Integer object created.

请注意,如果您不使用泛型,也会发生完全相同的事情,但更隐蔽:

HashMap map = new HashMap();
int someNum = 12345;    // no object created.
map.put(someNum, null); // Integer object created.

对于这种特殊情况,您可以使用 Android 的 SparseArray 类,它是原始整数键的容器。

关于android - 原始类型是否在 Android 中被垃圾收集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2474622/

相关文章:

android - Kotlin 导航 fragment 中的 searchview.setonquerytextlistener() 类型不匹配

java最佳实践——内部类访问外部类静态变量

java - 空无限循环和 GC (JVM)。请说明效果

java - 在 Android 手机上模拟低 RAM

android - 查询/system/build.prop 中的属性

android - 前置摄像头预览不是全屏

android - 两个带线程的 SurfaceView - 相机预览无法恢复

android - 您能否在Firestore中的一个查询中将多个whereEqualTo操作链接在一起

java - Class.forName 导致类加载器移至终身代?

android - 为什么 Dalvik Monitor 在 8 字节边界上对齐