J'ai un problème concernant un projet réel utilisant Java, Kinect (OpenNI) et Processing.
Si j'utilise seulement Processing et Java tout fonctionne bien rien ne trébuche et je ne reçois aucune exception.
Mais si je prison le traitement Applet dans un JFrame (pour résoudre certains problèmes avec l'Applet Style traitement) Je suis le problème suivant:Kinect + Processing + JFrame java.lang.OutOfMemoryError
- Toutes les 3 secondes les images kinect pend peu (ressemble à Java déblaie quoi que ce soit de la mémoire en utilisant le garbage collector)
au bout de 20 secondes, l'application se arrête et je reçois l'erreur suivante:
Exception in thread "Animation Thread" java.lang.OutOfMemoryError: Java heap space at java.awt.image.DataBufferInt.<init>(Unknown Source) at java.awt.image.Raster.createPackedRaster(Unknown Source) at java.awt.image.DirectColorModel.createCompatibleWritableRaster(Unknown Source) at java.awt.image.BufferedImage.<init>(Unknown Source)
Voici mon code pertinentes relatives à la visualisation:
public boolean drawGrayscaleImage(){
//init PApplet and build JFrame
GrayscalePApplet grayscalePApplet = new GrayscalePApplet();
grayscalePApplet.init();
this.grayscaleJFrame = this.initFrame(grayscalePApplet);
//Set Uplink for PApplet and begin drawing
grayscalePApplet.setGraphicP(this);
return false;
}
Ici, la fonction de dessin de la classe traitement PApplet
public void draw(){
if(graphicP != null){
//creat the relevant image Buffers for java and Processing
BufferedImage image = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_BYTE_GRAY);
PImage pimage = new PImage(image.getWidth(),image.getHeight(),PConstants.ARGB);
//fill up the databuffer using a converted Kinect Grayscale Image
DataBufferByte dataBuffer = new DataBufferByte(graphicP.getImage(ImageType.GRAYSCALE), this.imageWidth * this.imageHeight);
Raster raster = Raster.createPackedRaster(dataBuffer,imageWidth, imageHeight, 8, null);
image.setData(raster);
//draw image to Processing
image.getRGB(0, 0, pimage.width, pimage.height, pimage.pixels, 0, pimage.width);
pimage.updatePixels();
image(pimage, 0, 0);
// null everything to get Garbagecollection to work (?)
image = null;
pimage = null;
dataBuffer = null;
}
}
Comment puis-je éviter que OutOfMemory Exception?
Qu'est-ce qui peut provoquer cette exception?
augmenter la taille de segment http://wiki.eclipse.org/FAQ_How_do_I_increase_the_heap_size_available_to_Eclipse%3F –
I augmenté la taille de heps (-vmargs -Xms512m -Xmx730m) mais cela n'a eu aucun effet sur mon problème. Eclipse me montre l'espace du tas mais il ne déborde pas. – Rubberducker
L'exception est levée car votre machine virtuelle Java n'a plus de mémoire de tas. --- Puisque votre GC bloque le programme, puis manque de mémoire, je suppose que vous avez des problèmes de fuite de mémoire. --- Dans ce cas, augmenter simplement la taille du tas comme le suggère @Bhavik_Shan ne fera que masquer et retarder votre problème, et non le résoudre. Vous devriez plutôt déboguer votre programme, en vous concentrant principalement sur l'optimisation de l'utilisation de la mémoire. La chose la plus importante à faire est de vérifier si toute la mémoire temporaire est libérée, de préférence immédiatement dès qu'elle n'est plus utilisée. – XenoRo