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

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

[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 求解 yolo算法问题
  • ¥15 虚拟机打包apk出现错误
  • ¥30 最小化遗憾贪心算法上界
  • ¥15 用visual studi code完成html页面
  • ¥15 聚类分析或者python进行数据分析
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝