[英]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.