我知道垃圾收集器在找不到任何指向对象的指针时会收集已分配的内存。 我想知道我是否在循环中创建并初始化一些本地对象,这些对象是否由Java垃圾收集器收集? C#怎么样?
如果我在本地函数中创建并初始化某些对象,它们会发生什么?他们会在运行本地功能时收集吗?
我想知道,本地对象是否与局部变量完全相同?
感谢。
答案 0 :(得分:2)
通常在函数内存中,stack
为非对象变量分配内存,当函数完成执行时,stack
被清除,内存被释放。
对于对象,内存分配在heap
中(您将记住{strong}中的malloc()
和free()
。但是在 Java 和 C#中,free()
函数就是垃圾收集器为您做的,而不是您担心它。
因此,即使在函数中,对象也是局部变量,但不存储在stack
中,而是存储在heap
上。所以它们与int i
不同。但是当函数完成时,这些对象超出了范围。因此,您将无法再访问它们,但在garbage collector
运行并清除它们之前,它们的内存不会被释放。
但garbage collector
如何运行,运行时基于不同的算法。对于 Java 的不同实现,它们可能不一样(例如,sun java可能具有与另一个Java实现不同的算法)