用swing做界面的内存溢出问题,大家来帮忙看看

alieneagle 2010-04-20 01:45:37
项目是用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)
...全文
528 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
alieneagle 2010-04-21
  • 打赏
  • 举报
回复
感谢大家帮忙,问题已解决
gentalguo 2010-04-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xiesisi3 的回复:]
你点完后那个dialog销毁了吗
[/Quote]
这个你最好查一下,如果你的策略是每次打开的时候new一个窗口出来,那么,每次dispose一下。这个提得是很正确的。如果你使用一个静态实例,那么,注意每次打开关闭的时候里面的数据是否有及时释放。
其他的不敢乱说,建议继续跟踪一下,具体到步骤,是什么地方,那个函数造成的。如果是由于数据量巨大而缓存造成的,就要换一个策略了~~
alieneagle 2010-04-20
  • 打赏
  • 举报
回复
回gentalguo:
实际用户不是这么做的,但是操作也比较频繁,我这测试3分钟左右就不行了,用户那有时10几分钟

回xiesisi3:
关闭弹出窗口后在事件中把弹出窗口设置为null了
whlcy 2010-04-20
  • 打赏
  • 举报
回复
up!!!!!
xiesisi3 2010-04-20
  • 打赏
  • 举报
回复
你点完后那个dialog销毁了吗
gentalguo 2010-04-20
  • 打赏
  • 举报
回复
[Quote=引用楼主 alieneagle 的回复:]
项目是用swing做的客户端程序,不停的从一个Dialog点击按钮弹出另一个Dialog,前二十次还算正常,内存在50M以内,每次弹出窗口占用几十到几百K。
[/Quote]
这是需求要求这样做的吗?
alieneagle 2010-04-20
  • 打赏
  • 举报
回复
我用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
-----------------------------------------------------------------------------------------------------------------

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧