2010-10-06 5 views
0

J'ai des problèmes lorsque je fais des captures d'écran. Ceci est mon code de test.Bug Apple JVM possible: java.lang.OutOfMemoryError: espace de tas Java sur apple.awt.CRobot.getRGBPixels (CRobot.java:204)

import java.awt.Robot; 
import java.awt.AWTException; 
import java.awt.image.BufferedImage; 
import java.awt.Rectangle; 
import java.awt.Toolkit; 
import java.awt.Dimension; 

public class Test { 
     public static void main(String[] args) throws AWTException { 
      Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
      int[] pixels = new int[(int) (screenSize.getWidth() * screenSize.getHeight()) * 3]; 
      Robot robot = new Robot(); 
      int i = 0; 

      while (true) { 
       robot.createScreenCapture(new Rectangle(screenSize)) 
        .getRaster().getPixels(0, 0, (int) screenSize.getWidth(), (int) screenSize.getHeight(), pixels); 
       System.out.println(++i); 
      } 
     } 
} 

Sur mon Mac * s * avec OS X 10.6.4 et Java 1.6.0_20-b02-279-10M3065 il échoue après deux itérations. Il semble fonctionner correctement sur Windows. Pouvez-vous reproduire ce comportement?

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at apple.awt.CRobot.getRGBPixels(CRobot.java:204) at java.awt.Robot.createScreenCapture(Robot.java:329) at Test.main(Test.java:16)

Répondre

3

OutOfMemory signifie que vous devez give the program more memory. Cela a tendance à se produire sur les Mac plus souvent ces jours-ci, puisque Java est maintenant en 64 bits, et a besoin d'un plus gros tas.

+0

Mais pourquoi cela arrive-t-il? Comme je ne stocke aucune nouvelle référence dans la boucle while, le GC devrait libérer la mémoire que la classe Robot utilise en interne, n'est-ce pas? Lorsque je crée une nouvelle instance de Robot dans la boucle, la même chose se produit. – BlueDog

+0

Quelque chose, où que ce soit, s'accroche à lui. Jetez un oeil avec le profileur de la mémoire dans "jvisualvm" de Terminal.app. –

Questions connexes