このJavaプログラムがメモリを大量に消費するのはなぜですか?

ジョー:

5分ごとにデスクトップのスクリーンショットを撮る小さなコードがあります。ただし、使用するメモリの量に少し混乱しています。多くの場合、200 MBのRAMにまで達しますが、これは多すぎると思います...誰かに教えてもらえますか。 b)なぜそれがまったく上向くのですか?

/**
 * Code modified from code given in http://whileonefork.blogspot.co.uk/2011/02/java-multi-monitor-screenshots.html following a SE question at  
 * http://stackoverflow.com/questions/10042086/screen-capture-in-java-not-capturing-whole-screen and then modified by a code review at http://codereview.stackexchange.com/questions/10783/java-screengrab
 */
package com.tmc.personal;

import java.awt.AWTException;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import java.util.concurrent.TimeUnit;

import javax.imageio.ImageIO;

class ScreenCapture {

    static int minsBetweenScreenshots = 5;

    public static void main(String args[]) {
        int indexOfPicture = 1000;// should be only used for naming file...
        while (true) {
            takeScreenshot("ScreenCapture" + indexOfPicture++);
            try {
                TimeUnit.MINUTES.sleep(minsBetweenScreenshots);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    //from http://www.coderanch.com/t/409980/java/java/append-file-timestamp
    private  final static String getDateTime()
    {
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd_hh:mm:ss");
        df.setTimeZone(TimeZone.getTimeZone("PST"));
        return df.format(new Date());
    }

    public static void takeScreenshot(String filename) {
        Rectangle allScreenBounds = getAllScreenBounds();
        Robot robot;
        try {
            robot = new Robot();
            BufferedImage screenShot = robot.createScreenCapture(allScreenBounds);
            ImageIO.write(screenShot, "jpg", new File(filename + getDateTime()+ ".jpg"));
        } catch (AWTException e) {
            System.err.println("Something went wrong starting the robot");
            e.printStackTrace();
        } catch (IOException e) {
            System.err.println("Something went wrong writing files");
            e.printStackTrace();
        }
    }

    /**
     * Okay so all we have to do here is find the screen with the lowest x, the
     * screen with the lowest y, the screen with the higtest value of X+ width
     * and the screen with the highest value of Y+height
     * 
     * @return A rectangle that covers the all screens that might be nearby...
     */
    private static Rectangle getAllScreenBounds() {
        Rectangle allScreenBounds = new Rectangle();
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice[] screens = ge.getScreenDevices();

        int farx = 0;
        int fary = 0;
        for (GraphicsDevice screen : screens) {
            Rectangle screenBounds = screen.getDefaultConfiguration().getBounds();
            // finding the one corner
            if (allScreenBounds.x > screenBounds.x) {
                allScreenBounds.x = screenBounds.x;
            }
            if (allScreenBounds.y > screenBounds.y) {
                allScreenBounds.y = screenBounds.y;
            }
            // finding the other corner
            if (farx < (screenBounds.x + screenBounds.width)) {
                farx = screenBounds.x + screenBounds.width;
            }
            if (fary < (screenBounds.y + screenBounds.height)) {
                fary = screenBounds.y + screenBounds.height;
            }
            allScreenBounds.width = farx - allScreenBounds.x;
            allScreenBounds.height = fary - allScreenBounds.y;
        }
        return allScreenBounds;
    }
}
マイクワッソン:

他の答えは正解です。Javaは可能な限り多くのメモリを使用し、その時点でガベージコレクションが行われます。これを回避するために、JVM設定でより小さい最大ヒープサイズを指定できます。これは-Xmx設定で行います。たとえば、32MBしか必要ないと思われる場合は、次のように実行します。

java -Xmx32M [your main class or jar here]

プログラムのヒープ(非スタックメモリ)が32MBを超えることは決してありませんが、一度にそれ以上必要な場合はクラッシュします(この場合、プロファイルを作成する必要があります)。ただし、プログラムに明らかなリークは見られません(ImageIOがクリーンアップを必要としない場合)。したがって、問題ないと思います。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

空のJavaプログラムがメモリを消費するのはなぜですか?

分類Dev

DockerがVIRTメモリを大量に消費するのはなぜですか?

分類Dev

UIImageが大量のメモリを消費するのはなぜですか?

分類Dev

ADユーザー削除スクリプトがこのようなメモリを大量に消費するのはなぜですか?

分類Dev

メモリを大量に消費するPythonプログラム

分類Dev

この単純な GTK3 アプリケーションが大量のメモリを消費するのはなぜですか?

分類Dev

Haskellの「何もしない」関数idが大量のメモリを消費するのはなぜですか?

分類Dev

この単純なシェルループが停止し、大量のメモリを消費し始めるのはなぜですか?

分類Dev

プログラムが大量のメモリを使用して実行されるのはなぜですか?

分類Dev

メモリを大量に消費する再帰関数の実行がエラーなしで抑制されるのはなぜですか?

分類Dev

QML Imageがメモリを大量に消費するのはなぜですか?アプリケーションの速度を低下させる

分類Dev

なぜGNUはそのようなメモリを大量に消費するのですか?

分類Dev

ページテーブルが大量のメモリを消費するのはなぜですか?

分類Dev

日食でJavaプログラムのメモリ消費をテストする

分類Dev

この関数が時間外に多くのメモリを消費するのはなぜですか

分類Dev

大きなJava配列を作成すると、メモリが大量に消費されるのはなぜですか?

分類Dev

select()がプログラムでCPU時間を多く消費するのはなぜですか?

分類Dev

CentOS:「cma」プロセスがRAMを大量に消費するのはなぜですか?

分類Dev

私のubuntuは、メモリを大量に消費するプロセスを強制終了できませんか?

分類Dev

このプログラムが必要以上のメモリを割り当てるのはなぜですか?

分類Dev

参照がメモリを消費するのはなぜですか?

分類Dev

MySQLがこれほど多くのメモリを消費するのはなぜですか?

分類Dev

このメソッドはなぜ大量のメモリを消費するのですか? というか、GC がメモリを解放しないのはなぜですか?

分類Dev

POPデスクトップ:メモリとCPUを大量に消費するこの「gjs」プロセスとは何ですか?

分類Dev

IEがCPUを大量に消費するのはなぜですか?

分類Dev

私のC ++プログラムはCPUを大量に消費しますか?

分類Dev

プログラムが継続的にメモリを消費することを拒否する

分類Dev

文字列によるJavaメモリリーク?なぜこれが消費されてクラッシュするのですか

分類Dev

ファイルから読み取られたnumpynarrayが大量のメモリを消費するのはなぜですか?

Related 関連記事

  1. 1

    空のJavaプログラムがメモリを消費するのはなぜですか?

  2. 2

    DockerがVIRTメモリを大量に消費するのはなぜですか?

  3. 3

    UIImageが大量のメモリを消費するのはなぜですか?

  4. 4

    ADユーザー削除スクリプトがこのようなメモリを大量に消費するのはなぜですか?

  5. 5

    メモリを大量に消費するPythonプログラム

  6. 6

    この単純な GTK3 アプリケーションが大量のメモリを消費するのはなぜですか?

  7. 7

    Haskellの「何もしない」関数idが大量のメモリを消費するのはなぜですか?

  8. 8

    この単純なシェルループが停止し、大量のメモリを消費し始めるのはなぜですか?

  9. 9

    プログラムが大量のメモリを使用して実行されるのはなぜですか?

  10. 10

    メモリを大量に消費する再帰関数の実行がエラーなしで抑制されるのはなぜですか?

  11. 11

    QML Imageがメモリを大量に消費するのはなぜですか?アプリケーションの速度を低下させる

  12. 12

    なぜGNUはそのようなメモリを大量に消費するのですか?

  13. 13

    ページテーブルが大量のメモリを消費するのはなぜですか?

  14. 14

    日食でJavaプログラムのメモリ消費をテストする

  15. 15

    この関数が時間外に多くのメモリを消費するのはなぜですか

  16. 16

    大きなJava配列を作成すると、メモリが大量に消費されるのはなぜですか?

  17. 17

    select()がプログラムでCPU時間を多く消費するのはなぜですか?

  18. 18

    CentOS:「cma」プロセスがRAMを大量に消費するのはなぜですか?

  19. 19

    私のubuntuは、メモリを大量に消費するプロセスを強制終了できませんか?

  20. 20

    このプログラムが必要以上のメモリを割り当てるのはなぜですか?

  21. 21

    参照がメモリを消費するのはなぜですか?

  22. 22

    MySQLがこれほど多くのメモリを消費するのはなぜですか?

  23. 23

    このメソッドはなぜ大量のメモリを消費するのですか? というか、GC がメモリを解放しないのはなぜですか?

  24. 24

    POPデスクトップ:メモリとCPUを大量に消費するこの「gjs」プロセスとは何ですか?

  25. 25

    IEがCPUを大量に消費するのはなぜですか?

  26. 26

    私のC ++プログラムはCPUを大量に消費しますか?

  27. 27

    プログラムが継続的にメモリを消費することを拒否する

  28. 28

    文字列によるJavaメモリリーク?なぜこれが消費されてクラッシュするのですか

  29. 29

    ファイルから読み取られたnumpynarrayが大量のメモリを消費するのはなぜですか?

ホットタグ

アーカイブ