|
|
1
25
基元类型不是对象,因此不会导致任何垃圾收集。但是,您必须非常小心,因为由于装箱的原因,如果不显式地执行此操作,原始类型很容易成为对象。 例如,如果您想要一个整数键的hashmap<gt;,您将使用hashmap。注意,因为“in t”不是对象,所以不能在容器中使用。integer是基元int的对象版本。当您这样编写代码时,将自动为您创建integer对象:
请注意,如果不使用泛型,则会发生完全相同的事情,但更隐藏的是:
对于这种特殊情况,您可以使用android的sparsearray类,它是一个包含原始整数密钥的容器。 |
|
|
2
6
似乎答案是否定的。它看起来像原语在Java中堆栈而不是堆中,而只有对象是垃圾收集的。我发现了很多关于这个的简短参考资料,查阅维基百科。对于一些稍微重一些的阅读,请参阅一篇关于JVM垃圾收集实现的文章,它更明确地解释了原语存储在物理上独立的内存位置,因此它们不会被错误地包含在垃圾收集中。 here . 如果你想略读,第4页是最直接的解释。 以下是特定于Android的线程,说明了GC only scans pointers 以及如何 it checks that |
|
|
3
2
[注意:我还没有完全的评论权限,因此我将添加此作为单独的答案。]
这不太准确。基元可以保存在局部变量中,也可以作为类的静态或实例字段。在后一种情况下,它们确实存储在堆中,但重要的是,它们没有自己的“生命”,特别是,它们与包含在其中的对象不分开。
这是一个真实的陈述,但它也有点误导,与最初的问题无关。事实上,当一个方法调用另一个方法(等等)时,这些方法的激活帧存储在dalvik实现中的堆栈上。区别在于,当孤立地查看激活帧时,dalvik激活帧不包含 在内部 它们是一个可变大小的堆栈。在这点上,Dalvik安排激活框架的方式更像是如何处理传统的C类语言(如C或C++)。 |
|
codeforester · 测量GC暂停时间的最佳方法是什么? 8 年前 |
|
|
Venki WAR · 需要解释G1的并行完整GC 8 年前 |
|
|
Stephan_Berlin · 为什么CMS系列中的初始标记阶段 8 年前 |
|
|
Bonsaisteak · 为什么年轻一代需要三个区域来收集垃圾? 8 年前 |
|
|
goks · 如何清除熊猫的数据帧内存? 8 年前 |