这些代码有内存泄漏吗?

时间:2010-10-19 12:58:34

标签: java

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);
    }

我有五种这样的方法,但是想知道上面这段代码是否会导致内存泄漏,因为seriesColors是静态的。

如果存在内存泄漏,那么解决方案是什么?

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;
    }

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

4 个答案:

答案 0 :(得分:1)

为什么你会为同一个问题做两个帖子?至于你的问题一般静态成员变量如果处理不当会导致内存泄漏。正确的意思是,只要应用程序存在,这些变量就会存在,并且您必须注意,例如,arraylist会删除不再需要的项目。

答案 1 :(得分:1)

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

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

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

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

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

答案 2 :(得分:0)

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

请参阅:http://download.oracle.com/javase/1.4.2/docs/api/java/lang/ref/WeakReference.html

答案 3 :(得分:0)

关于你的第一个问题,很难说seriesColors是否会在不了解其他程序如何工作的情况下创建大量内存问题。例如,对象是否已从seriesColors中删除?一个新的听力图创建的频率是多少?在程序的运行时间内将创建多少个听力图?等