我正在尝试减少执行期间巨大数据表(数组)占用的内存空间。
为此,我正在使用JCMD打印直方图。
但是我在这里发现了一些有趣的东西:
num #instances #bytes class name
----------------------------------------------
1: 28409956 454559296 java.lang.Float
2: 3156662 227280584 [Ljava.lang.Integer;
3: 3156660 227279520 [Ljava.io.Serializable;
4: 526110 21044400 [[Ljava.io.Serializable;
5: 233936 17436808 [C
6: 241719 5801256 java.lang.String
7: 54517 3684696 [Ljava.util.HashMap$Node;
8: 93867 3003744 java.util.HashMap$Node
9: 74535 2981400 java.util.LinkedHashMap$Entry
10: 38269 2143064 java.util.LinkedHashMap
11: 190 2108240 [[[Ljava.io.Serializable;
12: 29416 1411968 java.util.HashMap
13: 5345 1400312 [B
您看到我有 28409956 个Float实例,它占用的总RAM是 454559296 个字节。如果它划分字节/实例,则每个Float会得到16个字节...!这意味着每个Float都占用128位!?
我想念什么?
如何进一步减少这些Float(以及Integer,我不能使用Short)占用的内存?
或者更好的是,如何强制Kotlin使用基元(我只发现了如何使用IntArray,FloatArray等在数组中使用基元)?
谢谢!
答案 0 :(得分:1)
java.lang.Float是一种包装类型,不是基本类型。它确实需要更多的内存。
这是kotlin代码及其等效的Java:
fun m1(f: Float) = f
fun m2(f: Float?) = f
public final float m1(float f) {
return f;
}
@Nullable
public final Float m2(@Nullable Float f) {
return f;
}