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;
}
这两个代码中哪一个有严重的缺陷?
答案 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中删除?一个新的听力图创建的频率是多少?在程序的运行时间内将创建多少个听力图?等