助手函数能在Java中节省内存吗?

助手函数能在Java中节省内存吗?,java,memory-management,garbage-collection,Java,Memory Management,Garbage Collection,如果您有一个大函数,并且函数中有多个变量可以生成新对象。对象一直在堆内存中,直到我们超出函数的作用域,然后它们被标记为GC,对吗?因此,如果将函数分解为几个小函数,那么在调用函数结束之前,这些辅助函数所需的对象将标记为GC,这可能会为调用函数中的其他内容清除内存,对吗 假设我有以下功能: public ArrayList<File> someProcessing() { ArrayList<File> files = new ArrayLi

如果您有一个大函数,并且函数中有多个变量可以生成新对象。对象一直在堆内存中,直到我们超出函数的作用域,然后它们被标记为GC,对吗?因此,如果将函数分解为几个小函数,那么在调用函数结束之前,这些辅助函数所需的对象将标记为GC,这可能会为调用函数中的其他内容清除内存,对吗

假设我有以下功能:

    public ArrayList<File> someProcessing()
    {
        ArrayList<File> files = new ArrayList<Files>();
        // Skipping getting the files for convenience
        
        // Do Something
        LargObject obj = new LargeObject();
        obj.doSomething(files);
        // Do something else
        DifferentLargObject obj2 = new DifferentLargeObject();
        obj2.doSomething(files);
        return files;
    }
public ArrayList someProcessing()
{
ArrayList files=新的ArrayList();
//为方便起见,跳过获取文件
//做点什么
LargObject obj=新的LargObject();
目标剂量测量(文件);
//做点别的
DifferentLargObject obj2=新的DifferentLargeObject();
obj2.doSomething(文件);
归还文件;
}

在这里,obj和obj2将一直存在,直到我们不再在处理范围内

如果我们再做两个函数:

    private void foo(ArrayList<File> files)
    {
        // Do Something
        LargObject obj = new LargeObject();
        obj.doSomething(files);
    }
    
    private void bar(ArrayList<File> files)
    {
        // Do something else
        DifferentLargObject obj2 = new DifferentLargeObject();
        obj2.doSomething(files);
    }
private void foo(ArrayList文件)
{
//做点什么
LargObject obj=新的LargObject();
目标剂量测量(文件);
}
专用空心条(ArrayList文件)
{
//做点别的
DifferentLargObject obj2=新的DifferentLargeObject();
obj2.doSomething(文件);
}
并将某些处理更改为

 public ArrayList<File> someProcessing()
    {
        ArrayList<File> files = new ArrayList<Files>();
        // Skipping getting the files for convenience
        
        // Do Something
        foo(files);
        // Do something else
        bar(files);
        return files;
    }
public ArrayList someProcessing()
{
ArrayList files=新的ArrayList();
//为方便起见,跳过获取文件
//做点什么
foo(档案);
//做点别的
酒吧(档案);
归还文件;
}

在foo()之后,obj应该被标记为GC,对吗?因此,可能会在函数someProcessing()中为以后保存内存。为了澄清,我只是问我的假设是否正确。而且,我真的没有这样的问题。这只是一个想法。

Hi@Qwaddles可用于垃圾收集和被垃圾收集是两个独立的事件。-前者不能保证后者会很快发生。后者是一个移动的目标-请参阅关于它在过去如何工作的许多好信息。“在这里,obj和obj2将一直存在,直到我们不再在某些处理范围内”不一定。您是正确的,将代码移动到单独的方法将保证
LargeObject
实例能够更快地符合GC的条件。这并不意味着您将看到任何差异,因为:1)GC可能要到稍后才会发生,2)JIT编译器可能已经发现
LargeObject
实例在
doSomething()
调用后未使用,因此它可能会提前释放对象实例。通常,对象从不“标记为GC”。垃圾收集不是这样工作的。在某些罕见的情况下,使用这些方法可能会产生影响,但您可以使用
{…}
块或仅使用
新建LargeObject().doSomething(文件)来实现相同的效果以避免在作用域中包含不必要的变量。