我知道这可能是一个愚蠢的问题,但我的背景更多是 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/