【问题标题】:How to use Java BufferedImage and Robot in the ideal way for memory management?如何以理想的方式使用 Java BufferedImage 和 Robot 进行内存管理?
【发布时间】:2011-12-11 08:11:28
【问题描述】:

我是面向对象编程的新手。我用静态方法创建了一个类,该方法以不同的时间间隔捕获屏幕上各种不同大小的矩形。使用静态 Robot 实例将捕获存储在静态 BufferedImage 中:

myStaticBufferedImage = myStaticRobot.createScreenCapture(arbitrarySizeRectangle);

对数据执行一些操作(包括偶尔将图像写入 bmp 文件)。在下一次捕获时,不需要上一次捕获的图像数据。

由于 bufferedImage 将包含可变大小的数据,最高可达我的屏幕分辨率的全尺寸,我应该在我的应用程序开始使用它之前声明它吗?

private static BufferedImage myStaticBufferedImage = new BufferedImage(RESOLUTION_X, RESOLUTION_Y, APPROPRIATE_IMAGE_TYPE);

当我重复捕获图像时,这是否会在内存中分配一个可重复使用的块而没有任何泄漏或效率低下?还是每次我使用 createScreenCapture 方法时都会填充越来越多的内存并简单地为 myStaticBufferedImage 分配一个新指针?

我在 OSX Lion 上运行这个应用程序以及一些 CPU 密集型软件。内存管理的最佳实践是什么?谢谢!

【问题讨论】:

    标签: java memory-management bufferedimage awtrobot


    【解决方案1】:

    您不应将myStaticBufferedImage 初始化为最大分辨率。 createScreenCapture() 将在内存中创建自己的BufferedImage,然后myStaticBufferedImage 将被引用。在任何情况下,createScreenCapture() 都不会使用来自myStaticBufferedImage 的缓冲区。

    也就是说,如果您只创建几个BufferedImages,它可能不会对 CPU 密集型(内存密集型?)软件产生影响。

    【讨论】:

    • 我刚刚找到了 createScreenCapture 的源代码并得到了相同的实现。在应用程序终止之前的几个小时内,我将捕获不止几个 - 更像是每分钟几个。我担心内存问题,但也许 Java 6 垃圾收集器会为我处理好一切。
    • 啊,我明白了。但是,据我了解,您一次只有一个 BufferedImage,因此您应该不会耗尽内存。您可以使用 JVM 参数 -XX:NewRatio=10 微调 gc - 较大的数字本质上会更快地在瞬态对象上调用 gc。你也可以直接调用它:Runtime r = Runtime.getRuntime(); r.gc();
    猜你喜欢
    • 2011-10-30
    • 1970-01-01
    • 2013-06-21
    • 2012-04-02
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多