繁体   English   中英

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

[英]does these code has memory leakage?

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

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

你为什么要为同一问题写两个帖子? 至于您的问题,一般来说,静态成员变量如果处理不当会导致内存泄漏。 正确地说,这意味着这些变量将在应用程序有效期内一直存在,并且您必须注意,例如arraylist删除不再需要的项目。

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

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

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

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

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

通常,在第一个示例中,使用弱引用的集合是解决问题类型的方法。

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

关于第一个问题,很难说,如果不进一步了解程序其余部分的工作方式,seriesColors是否会造成实质性的内存问题。 例如,是否从seriesColors中删除了对象? 新听力图多久创建一次? 在程序的运行期内将创建多少个听力图? 等等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM