在Android中收集原始类型的垃圾吗?

snc*_*tln 16 android garbage-collection dalvik

我知道这可能是一个愚蠢的问题,但我的背景更多是用c ++和管理自己的记忆.

我目前正在削减我可以从我的一个游戏中尝试减少垃圾收集频率和感知"滞后"的每一个分配,所以我创建的每个变量都是一个Object(例如String和Rect)我我确保我先在构造函数中创建它,而不是在简单的10行函数中创建临时变量...(我希望这是有道理的)

无论如何我今晚工作得更多,我意识到我对垃圾收集的假设可能完全错误,原始类型(int,boolean,float)是我在10行函数中创建的原始类型变量每秒20次增加我的垃圾收集问题?

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

GC在101ms内释放了4010个对象/ 484064个字节

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

所以重新解释我的问题:看到这条消息时是否包含原始类型(int,float,boolean等)?

hac*_*bod 25

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

例如,如果您想要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.
Run Code Online (Sandbox Code Playgroud)

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

HashMap map = new HashMap();
int someNum = 12345;    // no object created.
map.put(someNum, null); // Integer object created.
Run Code Online (Sandbox Code Playgroud)

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


jqp*_*liq 6

似乎答案是否定的.它看起来像基元是用Java放在堆栈中而不是放在堆中,只有对象被垃圾收集.我找到了很多对此的简短引用,请查看维基百科.对于一些稍重阅读,请在JVM垃圾收集实现,解释多一点明确的是原语存储在物理上分离的存储位置以便它们不会错误地包含垃圾回收的纸这里.如果你想略读,第4页是最直接解释的地方.

这里是特定于android的线程,说明gc 只扫描指针以及如何检查指针