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