a97263047 2012-10-17 16:59
浏览 397
已采纳

为什么下面的代码会报内存溢出呢

[code="java"]
Robot ro = new Robot();
Rectangle rec = ScreenPanel.select;
BufferedImage img = ro.createScreenCapture(rec);
Image image = img.getScaledInstance(w, h, Image.SCALE_DEFAULT);
BufferedImage bufImg = new BufferedImage(w,h,Image.SCALE_DEFAULT);
bufImg.getGraphics().drawImage(image, 0, 0, null);
q.push(bufImg);
[/code]
上面的代码在定时器里面50毫秒执行一次,执行几次之后就会报错:
Exception in thread "Timer-2" java.lang.OutOfMemoryError: Java heap space
at java.awt.image.DataBufferInt.(DataBufferInt.java:75)
at java.awt.image.Raster.createPackedRaster(Raster.java:470)
at java.awt.image.DirectColorModel.createCompatibleWritableRaster(DirectColorModel.java:1032)
at sun.awt.image.ImageRepresentation.createBufferedImage(ImageRepresentation.java:253)
at sun.awt.image.ImageRepresentation.setPixels(ImageRepresentation.java:554)
at java.awt.image.ReplicateScaleFilter.setPixels(ReplicateScaleFilter.java:250)
at sun.awt.image.OffScreenImageSource.sendPixels(OffScreenImageSource.java:137)
at sun.awt.image.OffScreenImageSource.produce(OffScreenImageSource.java:187)
at sun.awt.image.OffScreenImageSource.addConsumer(OffScreenImageSource.java:66)
at sun.awt.image.OffScreenImageSource.startProduction(OffScreenImageSource.java:80)
at java.awt.image.FilteredImageSource.startProduction(FilteredImageSource.java:183)
at sun.awt.image.ImageRepresentation.startProduction(ImageRepresentation.java:727)
at sun.awt.image.ImageRepresentation.drawToBufImage(ImageRepresentation.java:802)
at sun.java2d.pipe.DrawImage.copyImage(DrawImage.java:1018)
at sun.java2d.pipe.ValidatePipe.copyImage(ValidatePipe.java:186)
at sun.java2d.SunGraphics2D.drawImage(SunGraphics2D.java:3084)
at sun.java2d.SunGraphics2D.drawImage(SunGraphics2D.java:3069)
at ideamoment.Recorde.queue.CutScreen.run(CutScreen.java:31)
at java.util.TimerThread.mainLoop(Timer.java:555)
at java.util.TimerThread.run(Timer.java:505)
我是想不停的截图,然后缩放,然后放进一个list中,这个list是队列,我会1毫秒检查一次读取第一个然后remove第一个,理论上应该没问题啊......

  • 写回答

3条回答 默认 最新

  • jinnianshilongnian 2012-10-17 20:41
    关注

    溢出后 建议打印堆栈检查(jmap)

    bufImg.getGraphics() 用完后考虑dispose
    JDK描述
    [quote]dispose()释放此图形的上下文以及它使用的所有系统资源。调用 dispose 之后,就不能再使用 Graphics 对象。
    Java 程序运行时,可以在一个短时间帧内创建大量的 Graphics 对象。尽管垃圾回收器的终止进程也能够进行相同的系统资源释放,但是最好通过调用此方法来手工释放相关资源,而不是依靠终止进程,因为终止进程需要很长时间才能结束运行。 [/quote]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog