簡體   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