Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.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 - Fatal编程技术网

Java 这些代码是否存在内存泄漏?

Java 这些代码是否存在内存泄漏?,java,Java,我有五种类似的方法,但我想知道上面的代码是否会导致内存泄漏,因为SerieColor是静态的 如果内存泄漏,那么解决方法是什么 static private ArrayList seriesColors = new ArrayList(); public Audiogram(int widthParm, int heightParm) throws Exception { super(widthParm, heightP

我有五种类似的方法,但我想知道上面的代码是否会导致内存泄漏,因为SerieColor是静态的

如果内存泄漏,那么解决方法是什么

static private       ArrayList   seriesColors      = new ArrayList();

public Audiogram(int widthParm, int heightParm)
            throws Exception
    {
        super(widthParm, heightParm);
        seriesColors.add(new Color(  0,   0, 255));

        // Set the default settings to an industrial audiogram
        setType(INDUSTRIAL_AUDIOGRAM);
    }
private static final ColorModel rgbModel=ColorModel.getRGBdefault();
公共void setPixels(int x、int y、int w、int h、ColorModel model、int[]像素、int off、int scansize)
{
如果(模型==rgbModel){
试一试{
编码像素捕捉器(x、y、w、h、像素、关闭、扫描大小);
}
捕获(IOE异常){
iox=e;
停止();
返回;
}
}
否则{
int[]rgbPixels=新的int[w];
对于(int行=0;行

在这两个代码中,哪一个有严重的缺陷?

为什么要为同一个问题写两篇帖子?至于您的问题,一般来说,静态成员变量如果处理不当,可能会导致内存泄漏。正确地说,我的意思是,这些变量的寿命与应用程序的寿命一样长,您必须注意,例如,arraylist会删除不再需要的项。

使用弱引用的集合通常是第一个示例中此类问题的解决方案


请参阅:

静态变量在类的所有实例之间共享。(使用“新建”操作符创建实例。)

在这些例子中;使用静态(实例变量)存储颜色可能不是一个好主意,因为实例会相互干扰。该变量应更改为“普通”实例变量

第二个示例中的最终静态颜色模型非常好;它是一个不可变的对象(至少接口是不可变的),并且这些方法很可能是线程安全的,可以同时被许多实例使用

请注意,第一个问题不是“内存泄漏”。您可能会说hte实例无意中泄漏了它们之间的数据,但这并不是一个典型的内存泄漏,活动对象无意中保留了对“死”对象的引用


如果由于某种原因,SerieColor应该为创建的每个实例包含一种颜色。(这可能是一个愚蠢的设计)必须以某种方式同步对arraylist的访问。但是我认为这超出了范围…

关于你的第一个问题,如果不了解更多关于程序其余部分的工作原理,很难说seriesColors是否会产生实质性的内存问题。例如,是否从序列颜色中删除过对象?新的听力图多久制作一次?在程序的运行期内,将创建多少听力图?等等。

“这是我关于同一问题的第二篇帖子。”lol@John-您是否尝试过使用OptimizeIt之类的工具进行检查?为什么需要不断向这样的静态列表中添加相同的
Color
值?我可以理解java的惯例,即将大括号作为其控制流元素放在同一行上,但不是缩进右大括号的惯例(请注意,
getRGBdefault
中的两个右大括号如何出现在同一行上,这使得阅读起来非常困难)。你的教练会强迫你像这样缩进闭合括号吗?如果是这样的话,请代表我直截了当地问他。事实上,我应该正确地阅读这个问题。弱引用在这种情况下是完全无用的,因为颜色一旦超出范围就会从集合中删除。它们当然是一个很好的解决方案,您需要一个用于访问某些缓存对象的集合,但不想延长它们的生命周期,即它们只在其他对象持有引用时才在缓存中存在。
private static final ColorModel  rgbModel  = ColorModel.getRGBdefault();

public void setPixels(int x, int y, int w, int h, ColorModel model, int[] pixels, int off, int scansize )
    {
        if ( model == rgbModel ) {
            try {
                encodePixelsWrapper( x, y, w, h, pixels, off, scansize );
                }
            catch ( IOException e ) {
                iox = e;
                stop();
                return;
                }
            }
            else {
                int[] rgbPixels = new int[w];
                for ( int row = 0; row < h; ++row ) {
                    int rowOff = off + row * scansize;
                    for ( int col = 0; col < w; ++col ) {
                        rgbPixels[col] = model.getRGB( pixels[rowOff + col] );
                        }
                    try {
                        encodePixelsWrapper( x, y + row, w, 1, rgbPixels, 0, w );
                        }
                    catch ( IOException e ) {
                        iox = e;
                        stop();
                        return;
                        }
                    }
                }
    }

 public static ColorModel getRGBdefault() {
    if (RGBdefault == null) {
        RGBdefault = new DirectColorModel(32,
                          0x00ff0000,   // Red
                          0x0000ff00,   // Green
                          0x000000ff,   // Blue
                          0xff000000    // Alpha
                          );
    }
    return RGBdefault;
    }