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类,它是原始整数键的容器.
| 归档时间: |
|
| 查看次数: |
2819 次 |
| 最近记录: |