项目是用swing做的客户端程序,不停的从一个Dialog点击按钮弹出另一个Dialog,前二十次还算正常,内存在50M以内,每次弹出窗口占用几十到几百K。但是超过50M以后,每次弹出窗口时明显的占用内存不断的增长,从1M到4M,最后就内存溢出了,报异常如下:Exception occurred during event dispatching:
java.lang.OutOfMemoryError: Java heap space
at java.awt.image.DataBufferInt.<init>(Unknown Source)
at java.awt.image.Raster.createPackedRaster(Unknown Source)
at java.awt.image.DirectColorModel.createCompatibleWritableRaster(Unknown Source)
at sun.awt.image.SunVolatileImage.getBackupImage(Unknown Source)
at sun.awt.image.VolatileSurfaceManager.getBackupSurface(Unknown Source)
at sun.awt.image.VolatileSurfaceManager.initialize(Unknown Source)
at sun.awt.image.SunVolatileImage.<init>(Unknown Source)
at sun.awt.image.SunVolatileImage.<init>(Unknown Source)
at sun.awt.image.SunVolatileImage.<init>(Unknown Source)
at sun.awt.image.SunVolatileImage.<init>(Unknown Source)
at sun.awt.windows.WComponentPeer.createVolatileImage(Unknown Source)
at java.awt.Component.createVolatileImage(Unknown Source)
at java.awt.Component$BltBufferStrategy.createBackBuffers(Unknown Source)
at java.awt.Component$BltBufferStrategy.<init>(Unknown Source)
at java.awt.Component$BltSubRegionBufferStrategy.<init>(Unknown Source)
at java.awt.Component.createBufferStrategy(Unknown Source)
at java.awt.Window.createBufferStrategy(Unknown Source)
at javax.swing.BufferStrategyPaintManager$BufferInfo.createBufferStrategy(Unknown Source)
at javax.swing.BufferStrategyPaintManager$BufferInfo.createBufferStrategy(Unknown Source)
at javax.swing.BufferStrategyPaintManager$BufferInfo.getBufferStrategy(Unknown Source)
at javax.swing.BufferStrategyPaintManager.prepare(Unknown Source)
at javax.swing.BufferStrategyPaintManager.paint(Unknown Source)
at javax.swing.RepaintManager.paint(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at java.awt.GraphicsCallback$PaintCallback.run(Unknown Source)
at sun.awt.SunGraphicsCallback.runOneComponent(Unknown Source)
at sun.awt.SunGraphicsCallback.runComponents(Unknown Source)
at java.awt.Container.paint(Unknown Source)
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.seqPaintDirtyRegions(Unknown Source)
at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source)

解决方案 »

  1.   

    我用Eclipse Memory Analyzer工具分析的结果如下,大家帮忙分析一下
    Class Name                                                                        | Shallow Heap | Retained Heap 
    -----------------------------------------------------------------------------------------------------------------
    edoc.ui.userWork.GroupUserWork @ 0x26711c08                                       |          448 |        17,360 
    |- target sun.awt.windows.WDialogPeer @ 0x26710888 Native Stack                   |          152 |           400 
    |- [124] java.lang.Object[200] @ 0x26713330                                       |          816 |           816 
    |  '- elementData sun.awt.util.IdentityArrayList @ 0x22ed0fa8                     |           24 |           840 
    |     '- allWindows class java.awt.Window @ 0x2b7ae798 System Class               |           40 |           896 
    |- awtFocussedComponent, clientComponent sun.awt.windows.WInputMethod @ 0x2671a868|           48 |            80 
    |  '- referent java.lang.ref.Finalizer @ 0x26749060                               |           32 |        17,568 
    |     '- next java.lang.ref.Finalizer @ 0x26749040                                |           32 |        17,600 
    |        '- next java.lang.ref.Finalizer @ 0x26749020                             |           32 |        17,632 
    |           '- next java.lang.ref.Finalizer @ 0x26749000                          |           32 |        17,664 
    |              '- next java.lang.ref.Finalizer @ 0x26748fe0                       |           32 |        17,696 
    |                 '- next java.lang.ref.Finalizer @ 0x26748fc0                    |           32 |        17,728 
    -----------------------------------------------------------------------------------------------------------------
      

  2.   

    回gentalguo:
    实际用户不是这么做的,但是操作也比较频繁,我这测试3分钟左右就不行了,用户那有时10几分钟回xiesisi3:
    关闭弹出窗口后在事件中把弹出窗口设置为null了
      

  3.   

    这个你最好查一下,如果你的策略是每次打开的时候new一个窗口出来,那么,每次dispose一下。这个提得是很正确的。如果你使用一个静态实例,那么,注意每次打开关闭的时候里面的数据是否有及时释放。
    其他的不敢乱说,建议继续跟踪一下,具体到步骤,是什么地方,那个函数造成的。如果是由于数据量巨大而缓存造成的,就要换一个策略了~~