Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
删除未使用的变量';java中的内存_Java_Memory Management - Fatal编程技术网

删除未使用的变量';java中的内存

删除未使用的变量';java中的内存,java,memory-management,Java,Memory Management,我知道Java有自己的垃圾收集,但有时我想手动删除垃圾。有没有办法做那样的工作?考虑到我有一个long或very long函数,它声明了许多变量,使用后立即删除未使用的内存,而不是在函数末尾自动收集,这是一个好主意吗?如果手动删除垃圾,是否会影响应用程序的速度?谢谢你的帮助 您可以调用它,这可能会导致垃圾收集器进行清理。但这肯定会影响应用程序的性能。一般来说,在这里尝试“优化”任何东西都是没有意义的。在java中没有直接和立即的方法来释放内存。您可以尝试说服垃圾收集器使用众所周知的 Object

我知道Java有自己的垃圾收集,但有时我想手动删除垃圾。有没有办法做那样的工作?考虑到我有一个long或very long
函数
,它声明了许多变量,使用后立即删除未使用的内存,而不是在函数末尾自动收集,这是一个好主意吗?如果手动删除垃圾,是否会影响应用程序的速度?谢谢你的帮助

您可以调用它,这可能会导致垃圾收集器进行清理。但这肯定会影响应用程序的性能。一般来说,在这里尝试“优化”任何东西都是没有意义的。

在java中没有直接和立即的方法来释放内存。您可以尝试说服垃圾收集器使用众所周知的

Object obj = new Object();
// use obj
obj = null;
System.gc();
但不能保证这会立即释放内存


虽然这适用于堆内存,但堆栈分配的项只能在函数返回时释放。

您可以为变量分配null,验证这些对象没有任何引用,并调用System.gc(),但这只是建议JVM调用gc,但不能保证。垃圾回收cal会将应用程序的速度降低到冻结状态(停止world GC)。

手动执行此操作不值得,因为垃圾回收器通常会做得更好,而自己执行此操作可能不会对应用程序产生明显的影响


如果必须,可以将变量引用设置为null,并调用
System.gc()
,这将手动调用垃圾收集器。

为什么要“手动”删除垃圾?如果是因为内存不足,回想一下Java将在实际抛出
OutOfMemoryError
之前运行垃圾收集。如果你真的没有内存,那么就没有垃圾可以手动移除

声明变量不会在堆上分配内存。使用
new
创建对象不起作用。 JVM甚至可以对尚未超出范围但在方法结束之前不再使用的GC对象引用进行转义分析

如果您的意思是希望在系统资源不重要的某个点主动释放内存,那么使用更好的JVM调优,比如使用并行GC算法


通过将事物设置为
null
来“手动”垃圾收集很可能会减慢速度,这仅仅是因为您无意义地支付了清空引用的成本,或者调用GC的次数超过了需要的次数。

一个非常常见的建议是使用
System.GC()
,JVM可能会选择忽略它。您还可以使用范围,例如:

import java.io.*;
public class AutoVariableTest
{
    public static void main(String[] args) throws Exception
    {
        String fileName = "test.txt";
        {// This is local block just to keep auto variable in check
            File file = new File(fileName); // file is not visible outside the scope and is available for garbage collection
            BufferedReader br = null;

            try{
                br = new BufferedReader(new FileReader(file));
                // ...
            }finally{
                if(br != null)
                    br.close();
            }
        }// local block end
    }
}

如果您试图管理内存,那么Java不适合!或者在JVM中编写自己的垃圾收集机制,如果您有很多时间

如果您打算在某个时间点之后减少使用的内存量,那么最好使用变量数组,以便在不再需要时将数组设置为null。通过这种方式,垃圾收集器清理所有数据所需的时间要少得多。

可以保证GC会尽最大努力立即执行某些操作。Javadoc:“当控件从方法调用返回时,Java虚拟机已尽最大努力从所有丢弃的对象中回收空间。”无法保证将清除哪些内容。这对于递归函数非常有用。使用后将变量设置为
null
,这是一个好主意。HotSpot也会为您这样做,但不是100%保证。