首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在内存方面,Kotlin中的空变量会发生什么?

在内存方面,Kotlin中的空变量会发生什么?
EN

Stack Overflow用户
提问于 2020-06-17 22:39:12
回答 2查看 801关注 0票数 1

当我第一次学习编码时,有人告诉我“当你声明一个变量时,你在内存中为这个变量预留空间”,但是如果这个变量在Kotlin中是可空的,那么这个变量何时转换为null来释放它的空间呢?

例如,我有一个可空字符串变量。

代码语言:javascript
复制
var x: String? = "Some text"

当我将x设置为null时,内存中的空间是否被解放了?

代码语言:javascript
复制
x = null

我在Kotlin的页面上读到了有关变量的内容,但是它没有提到这一点:

我理解从其他阅读,如果我没有对这个变量的任何引用,那么GC将释放内存,但是我有一个带有null值的变量。

EN

回答 2

Stack Overflow用户

发布于 2020-06-17 23:00:39

对象的变量总是占用4个字节或8个字节(取决于VM是32位还是64位),不管它设置为null还是其他任何东西。原语的变量所占的比重与定义的原语相同(浮点数和ints为4个字节,双倍和长等为8个字节)。

因此,字符串的声明保留了4个字节。当变量超出作用域时,该内存将被回收。如果它是在函数中声明的,则当函数返回时,它会超出作用域。如果它被声明为一个带有后备字段的属性,那么当垃圾回收器回收它所属的类实例时,它就会超出作用域。(请注意,属性可能根本没有后备字段,因此不需要为每个实例为该属性预留空间。)如果它是在object或顶层空间中声明的,那么在应用程序运行时,它永远不会超出作用域。

不要将变量本身与它所指向的对象混淆。这些将占用更多的4个字节,当然大小也会有所不同。当它们不再被引用时,当它们被实例化并由垃圾收集器回收时,它们的内存是保留的(因此,如果您将最后一个对ojbect的引用设置为null,这确实会导致它的内存被释放)。

票数 4
EN

Stack Overflow用户

发布于 2020-06-22 09:46:53

这里涉及两个独立的概念。

第一个是变量的概念。正如@Tenfour04所解释的,所有对象变量都需要4或8个字节(32或64位JVM)。此空间用于存储对对象的引用。

第二个是对象本身。在您的示例中,您用"Some“实例化String类的实例。该对象将包含一个char原语数组,该数组是字符串中的单个字符(“S”、“o”、“m”等)。当字符串被实例化时,JVM将分配堆中的空间。

当变量包含对"Some“字符串对象的引用时,GC将不采取任何操作。当应用程序代码不再有对对象的任何引用时,它就有资格进行垃圾收集(尽管没有确切地定义何时会发生这种情况)。

同样,在您的示例中,当您将变量x设置为null时,您将移除引用,"Some“对象将有资格进行收集。

通常,不需要显式空引用,GC非常擅长查找不再引用的对象。与其使用显式的空赋值,不如查看变量的作用域。一旦变量超出作用域,它就不再被使用,因此它对对象的引用不再被使用。作用域可以是函数/方法或代码块,等等。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62439504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档