Java ImageJ宏不释放内存资源

Java ImageJ宏不释放内存资源,java,macros,imagej,Java,Macros,Imagej,我使用的是ImageJ v1.49e(它附带java 1.6.0_24(64位)) 我编写了一个宏,从输入目录读取图像,进行一些处理,并根据条件将图像移动到输出目录。以批处理模式运行,因为我希望处理100000张图像 因此,我从ImageJ运行宏,通过JConsole监视内存使用情况,我只看到内存使用情况不断上升,从不下降。ImageJ分配了6GB,但很快就达到了这个限制。即使我从JConsole或宏调用GC,它也不会做任何事情 我检查以确保我在批处理模式下运行,并关闭我打开的任何窗口,但仍然无

我使用的是ImageJ v1.49e(它附带java 1.6.0_24(64位))

我编写了一个宏,从输入目录读取图像,进行一些处理,并根据条件将图像移动到输出目录。以批处理模式运行,因为我希望处理100000张图像

因此,我从ImageJ运行宏,通过JConsole监视内存使用情况,我只看到内存使用情况不断上升,从不下降。ImageJ分配了6GB,但很快就达到了这个限制。即使我从JConsole或宏调用GC,它也不会做任何事情

我检查以确保我在批处理模式下运行,并关闭我打开的任何窗口,但仍然无法打开。在网上也找不到任何关于为什么会发生这种情况的信息

我是否没有正确地释放资源? 有什么我遗漏的吗

下面是宏代码

inputDir = getDirectory("Choose the Input Directory");
outputDir = getDirectory("Choose the Output Directory");

inputDir = replace(inputDir,"\\\\", "\\\\\\\\");
outputDir = replace(outputDir,"\\\\", "\\\\\\\\");

if(inputDir != "" || outputDir != "") {
    setBatchMode(true);
    analyzeImagesBatch(inputDir, outputDir);
    exit("Done");
}
else {
    exit("Must select an input and output directory");
}

function analyzeImagesBatch(inputDir, outputDir) {
    inputList = getFileList(inputDir);

    for (i=0; i < inputList.length; i++) {
        showProgress(i+1, inputList.length);
        fileName = inputList[i];
        ok = imageAnalysis(inputDir, outputDir, fileName, 50, 30, 20);
        if(ok != 1) {
            imageAnalysis(inputDir, outputDir, fileName, 5, 10, 10);
        }
    }
}

function imageAnalysis(inputDir, outputDir, fileName, backgroundValue, size, countThresh) {
    ok = 0;
    open(inputDir+fileName);
    imageId = getImageID();
    run("8-bit");
    run("Subtract Background...", "rolling="+backgroundValue);  
    setAutoThreshold("Default");
    setOption("BlackBackground", false);
    run("Convert to Mask");
    run("Analyze Particles...", "size="+size+"-Infinity circularity=0.40-1.00 exclude clear");

    count = nResults();
    if(count >= countThresh) {
        ok = File.rename(inputDir+fileName, outputDir+fileName);
    }

    selectImage(imageId);
    close();
    return ok;
}
inputDir=getDirectory(“选择输入目录”);
outputDir=getDirectory(“选择输出目录”);
inputDir=replace(inputDir,“\\\”,“\”);
outputDir=替换(outputDir,“\\\”,“\\\”;
if(inputDir!=“”| | outputDir!=“”){
setBatchMode(真);
analyzeImagesBatch(inputDir,outputDir);
退出(“完成”);
}
否则{
退出(“必须选择输入和输出目录”);
}
功能分析图像批处理(inputDir、outputDir){
inputList=getFileList(inputDir);
对于(i=0;i=计数阈值){
ok=File.rename(inputDir+fileName,outputDir+fileName);
}
选择图像(imageId);
close();
返回ok;
}

我将宏作为Java插件重新编写,并在同一组100000张图像上运行它。内存使用保持在70mb以下


使用IJ宏肯定是内存泄漏。

我同意,我也看到过这种行为:即使在几百张图像上运行,我也清楚地看到宏运行的时间越长,速度就越慢,内存使用率也在飙升。我刚刚发现,当我在插件中包含一个内部类并经常使用时,记忆一直在增长。尽管我很小心,并清空了我不再使用的对象。我从ImageJ邮件列表中得到确认,内存泄漏的主要原因是打开了SCIFIO选项。当我更新ImageJ(斐济)时,它在默认情况下被关闭,所以这就是为什么它在更新后被修复的原因。