在Kotlin中,为什么我的每个浮动对象都占用128位而不是16位?

时间:2019-02-06 21:31:18

标签: java kotlin jvm jvm-hotspot jvm-crash

我正在尝试减少执行期间巨大数据表(数组)占用的内存空间。

为此,我正在使用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等在数组中使用基元)?

谢谢!

1 个答案:

答案 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;
   }