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