Java内存泄漏和垃圾收集,

标签 java memory-management memory-leaks garbage-collection

这个问题让我自己和我的同事们感到困惑。在我编写的程序中,我遇到了内存泄漏。 var 平台每次迭代都会被重新分配给一个新对象。但由于某种原因,旧的平台对象没有被 gc 清理,并且经过多次迭代后堆溢出:

你们中的一些人可能意识到这是一种 PSO 算法。但对于那些不这样做的人来说,这个函数必须被评估 1000 次,而 basicplatform 是一个数据量极大的对象,因此多个实例最终会导致内存溢出,只是为了提供一点上下文。

错误代码:

public class Fitness implements FitnessFunction{

protected Platform platform;

public Fitness(){

}

public Fitness(Platform platform) {
    this.platform = platform;
}

@Override
public double fitness(Particle p) {

    try {
        platform = new BasicPlatform("testData.csv");
    } catch (Exception e) {
        e.printStackTrace();
    }





    platform.startSimulation();
    double prof = platform.getFitness();
    v.clear();
    if(prof != 0)
    return -prof;
    return 0;
}


}

在对为什么会出现泄漏(当然不应该出现)感到困惑之后,我的 friend 向我展示了这个解决方案,他之前在类似的情况下使用过:

public class TradingRuleFitness implements FitnessFunction{

protected Platform platform;

public Fitness(){

}

public Fitness(Platform platform) {
    this.platform = platform;
}

@Override
public double fitness(Particle p) {


    Vector<Platform> v = new Vector<Platform>();
    try {
        //platform = new BasicPlatform("testData.csv");
        v.add(new BasicPlatform("testData.csv"));
    } catch (Exception e) {
        e.printStackTrace();
    }



        double prof = v.get(0).getFitness;
        v.clear();
        if(prof != 0)
        return -prof;
        return 0;
    }


}

几乎完全相同,但这次我们没有重新分配 var 平台,而是在 vector 内创建一个新对象,并在完成后将其删除。此方法似乎强制 gc 进行清理。

问题是为什么这个 vector 方法有效,但技术上应该有效的原始方法却无效?是否有更干净的解决方案?

p.s 我已经清理了不必要的代码,因为问题是关于对象的创建和删除

最佳答案

在第一种情况下,如果您的 Fitness 对象被保留,那么您的 Platform 对象也将作为字段被保留。

在第二种情况下,您的平台保存在本地变量中,并在 fitness 返回时被丢弃。

它不一定是 vector ,它可以是普通的局部变量。

尝试删除两个示例中的字段,无论哪种方式都应该有效。

关于Java内存泄漏和垃圾收集,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11223841/

相关文章:

php - 为什么 PHP 的垃圾收集器会降低性能,没有它如何管理内存?

java - Android 的通话问题

java - 如何测量 Spark 需要在分区 RDD 上运行操作的时间?

java - 栈是堆中的逻辑内存区域吗?

c++ - 在带有 libstdc++ 的 Linux 上使用 -fsanitize=memory 和 clang

c# - C# 套接字应用程序中的内存泄漏

java - tomcat上特定应用程序的线程列表

java - 详细格式化程序错误,Java Eclipse Indigo SR1

java - 以编程方式创建 Eclipse 项目时出现意外行为

excel - JAVA - 写入 Excel 文件时出现 Apache POI OutOfMemoryError