在内存方面,Kotlin中的null变量将如何处理?

当我第一次学习编码时,被告知“当您声明一个变量时,您会在内存中为该变量保留空间”,但是,如果该变量在Kotlin中为空,那么何时将该变量转换为null以释放其空间?

例如,我有一个可为空的String变量。

var x: String? = "Some text"

当我将x设置为null时,是否释放了内存空间?

x = null

我在Kotlin的页面上读到有关变量的信息,但没有提及任何内容:

我了解from other reading,如果我没有对该变量的任何引用,则GC将释放内存,但是我有一个变量,其值为null

iCMS 回答:在内存方面,Kotlin中的null变量将如何处理?

对象变量始终占用4个字节或8个字节(取决于VM是32位还是64位),无论其设置为null还是其他值。用于原语的变量占用与为其定义的原语一样多的变量(用于浮点数和整数的字节为4个字节,用于双精度和长整数的字节为8个字节,等等)。

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

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

,

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

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

第二个是对象本身。在您的示例中,使用“某些文本”实例化String类的实例。该对象将包含一个char基元数组,这些基元是字符串中的各个字符(“ S”,“ o”,“ m”等)。实例化String时,将在堆中分配空间通过JVM。

虽然变量包含对“某些文本” String对象的引用,但GC将不采取任何措施。当您的应用程序代码不再具有对该对象的任何引用时,它就有资格进行垃圾回收(尽管没有确切定义何时发生)。

同样,在您的示例中,当您将变量x设置为null时,您将删除引用,并且“某些文本”对象将有资格被收集。

通常,没有必要显式地使引用为空,GC非常擅长查找不再被引用的对象。与其使用显式的空值分配,不如查看变量的范围。一旦变量超出范围,就不再使用它,因此不再使用对对象的引用。范围可以是函数/方法或代码块等。

本文链接:https://www.f2er.com/2110256.html

大家都在问