【问题标题】:In Kotlin, why do each of my Floats occupy 128 bits instead of 16 bits? [duplicate]在 Kotlin 中,为什么我的每个浮点数占用 128 位而不是 16 位? [复制]
【发布时间】:2019-06-30 22:47:26
【问题描述】:

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

为此,我使用 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 字节。如果它划分字节/实例,我将得到每个浮点数 16 个字节......!这意味着每个浮点数占用 128 位!?

我错过了什么?

如何进一步减少这些浮点数(以及整数——我不能使用 Short)占用的内存?

或者更好的是,如何强制 Kotlin 使用原语(我只发现了如何在 IntArray、FloatArray 等数组中使用)?

谢谢!

【问题讨论】:

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


    【解决方案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;
       }
    

    【讨论】:

    • 我不知道我是否得到它。我可以在 Kotlin 中使用 float 原语而不是包装器吗?
    • 是的,你可以。仔细看看我发布的代码。
    • m1 返回一个浮点原语?如果是这样,Kotlin 无论如何都会把它装箱吗?
    • 除非必须(例如,如果您将其转换为Any,或存储在Array<Float> 而不是FloatArray,或使用<Float> 等其他泛型)
    猜你喜欢
    • 1970-01-01
    • 2017-12-06
    • 1970-01-01
    • 2015-07-01
    • 2011-07-11
    • 2015-06-20
    • 1970-01-01
    • 2011-10-25
    相关资源
    最近更新 更多