发布于 2020-06-17 23:00:39
对象的变量总是占用4个字节或8个字节(取决于VM是32位还是64位),不管它设置为null还是其他任何东西。原语的变量所占的比重与定义的原语相同(浮点数和ints为4个字节,双倍和长等为8个字节)。
因此,字符串的声明保留了4个字节。当变量超出作用域时,该内存将被回收。如果它是在函数中声明的,则当函数返回时,它会超出作用域。如果它被声明为一个带有后备字段的属性,那么当垃圾回收器回收它所属的类实例时,它就会超出作用域。(请注意,属性可能根本没有后备字段,因此不需要为每个实例为该属性预留空间。)如果它是在object或顶层空间中声明的,那么在应用程序运行时,它永远不会超出作用域。
不要将变量本身与它所指向的对象混淆。这些将占用更多的4个字节,当然大小也会有所不同。当它们不再被引用时,当它们被实例化并由垃圾收集器回收时,它们的内存是保留的(因此,如果您将最后一个对ojbect的引用设置为null,这确实会导致它的内存被释放)。
发布于 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非常擅长查找不再引用的对象。与其使用显式的空赋值,不如查看变量的作用域。一旦变量超出作用域,它就不再被使用,因此它对对象的引用不再被使用。作用域可以是函数/方法或代码块,等等。
https://stackoverflow.com/questions/62439504
复制相似问题