我必须假设以下方法不会泄漏内存:
public final void setData(final Integer p_iData)
{
data = p_iData;
}
data
是某个类的属性。
每次调用该方法时,new Integer
都会替换当前存在的data
引用。 那么当前/旧数据发生了什么?
Java必须在幕后做点什么;否则,每次分配一个对象时我们都必须将任何对象清空。
答案 0 :(得分:7)
简单的解释:
垃圾收集器会定期查看系统中的所有对象,并查看实时引用中无法再访问哪些对象。它释放了任何不再可达的对象。
请注意,您的方法根本不会 创建新的Integer
对象。例如,可以一次又一次地传递对同一Integer
个对象的引用。
垃圾收集的现实比这复杂得多:
答案 1 :(得分:3)
Java是一种垃圾收集语言。
一旦没有对象的实时引用,它就有资格进行垃圾回收。收集器不时运行,并将回收对象的内存。
简而言之,您的代码100%正确且不会泄漏内存。
答案 2 :(得分:0)
最终收集垃圾。
答案 3 :(得分:0)
如果没有data
的引用,java的垃圾收集器将清理旧数据并释放内存
答案 4 :(得分:0)
实际上,由于Integer是一个非原始类型的对象,因此行:
data = p_iData;
正在更新参考。
现在,GC将检查this.data
过去指向的旧对象,以确定是否没有更多对该对象的引用。如果没有,那么该对象将被销毁并释放内存(稍后某个时间)
答案 5 :(得分:0)
如果先前由data引用的对象不再被从任何正在运行的线程引用的任何对象结构引用,则它有资格进行垃圾收集。 GC由后台执行,以释放未使用对象的内存。
答案 6 :(得分:0)
我想向你展示一个例子 在某些代码中:
int x;
x=10;
x=20;
最初我将x指定为10 再次x到20 第一个引用内存将由Java GC处理。 Java GC是一个连续运行的线程,检查未引用的内存并清理它。