繁体   English   中英

Java分配内存泄漏

[英]Java Assignment Memory Leaks

我必须假设以下方法不会泄漏内存:

public final void setData(final Integer p_iData)
{
    data = p_iData;
}

data是某类的属性。

每次调用该方法时, new Integer都将替换当前存在的data引用。 那么当前/旧数据发生了什么?

Java必须在幕后做点什么; 否则,每次分配对象时我们都必须将任何对象置零。

简单解释:

垃圾收集器会定期查看系统中的所有对象,并查看实时引用中不再可访问的对象。 它释放了任何不再可达的对象。

请注意,您的方法根本不会创建新的Integer对象。 例如,可以一次又一次地传递对同一个Integer对象的引用。

垃圾收集的现实比这复杂得多:

  • 现代GC往往是代际的 ,假设大多数对象都是短命的,因此它不需要经常检查整个(可能很大)的堆; 它可以经常检查“最近”对象的活跃度
  • 对象可以有终结器 - 代码在垃圾回收之前运行。 这通过一个循环延迟了这些对象的垃圾收集,并且该对象甚至可以通过使其自身可达而“复活”自身
  • 现代GC可以并行收集,并有许多调整选项

Java是一种垃圾收集语言。

一旦没有对象的实时引用,它就有资格进行垃圾回收。 收集器不时运行并将回收对象的内存。

简而言之,您的代码是100%正确的,并没有泄漏内存。

最终会收集垃圾。

如果没有对data引用,java的垃圾收集器将清理旧数据并释放内存

实际上,由于Integer是一个非原始类型的对象,因此该行:

data = p_iData;

正在更新参考。

现在,GC将检查this.data过去指向的旧对象,以确定是否没有更多对该对象的引用。 如果没有,那么该对象将被销毁并释放内存(稍后会被释放)

如果先前由数据引用的对象不再被从任何正在运行的线程引用的任何对象结构引用,则它有资格进行垃圾收集。 GC在后台由Java执行以释放未使用对象的内存。

我想在一些代码中向您展示一个示例:

int x;
x=10;
x=20;

最初,我再次将x分配给10个x到20的第一个参考内存将由Java GC处理。 Java GC是一个连续运行的线程,检查未引用的内存并清理它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM