Java内存使用 - 这种语法是正确的还是会导致内存泄漏?

时间:2016-04-24 06:33:05

标签: java memory memory-leaks garbage-collection

// works with FetchType.LAZY and FetchType.EAGER
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "CLASS_ID")
@Fetch(FetchMode.SELECT)
@BatchSize(size = 1)
private List<Students> students;

public List<Students> getStudents() { return students; }
public void setStudents(List<Students> students) { this.students = students; }

此代码会导致内存泄漏吗?#34; obj = getObjects(i);&#34;?

我不确定obj的旧值是否已被释放,或者他们是否还在使用内存。

如果这是内存泄漏,那么正确的语法是什么?

4 个答案:

答案 0 :(得分:1)

在java中有一个垃圾收集器,所以使用这样的正常操作很难导致内存泄漏。垃圾收集器可以释放任何不再引用的内存。

有关垃圾收集的更多信息:http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

简短的回答是你的代码不应该导致内存泄漏。

答案 1 :(得分:0)

参考或对象未被发布&#34;什么时候被覆盖在为变量分配一个int时,不再需要将引用分配给它。

相反,旧的引用不再存在,GC会查找仍然存在的引用。

答案 2 :(得分:0)

  

此代码会导致内存泄漏吗?#34; obj = getObjects(i);&#34;?

不可能肯定地说。您还没有向我们展示getObjects的代码,并且可能(尽管不太可能,基于方法的名称)该方法可能会发生内部内存泄漏。

但是,重复分配对简单变量(例如obj)的引用不会泄漏内存。

  

我不确定obj的旧值是否已被释放,或者他们是否还在使用内存。

这不是那么简单:

  • 从存储管理的角度来看,obj&#34;的旧值。是引用......不是对象。
  • 当您为obj分配不同的引用时,不会立即释放这些引用所引用的对象。
  • 他们最终将在未来由GC发布,前提是:
    • 有足够的内存压力导致GC运行&#34;空间&#34;已分配对象的位置,
    • 没有别的东西引用这些东西。
  

如果这是内存泄漏,那么正确的语法是什么?

对于记录,内存泄漏不是语法问题。

答案 3 :(得分:0)

我做了一个测试,很好,java是定期释放内存。 我仍然使用HashMap来重现我的应用程序上下文。

package memtest;

import java.util.HashMap;

public class MemTest {
    public static void main(String[] args) throws InterruptedException {
        HashMap obj = new HashMap();
        int loop = 1;
        while(true) {
            HashMap newObj = new HashMap();
            newObj.put("1", "big string that is not pasted here");
            obj = newObj;
            System.err.println("At loop "+loop);
            Thread.sleep(1000);
            loop++;
        }
    }    
}