Probleme de java heap space : creation buffered image!
Bonjour j'ai un probleme avec mon client/serveur.
Le client peut afficher des images sur un mobile. Le probleme c'est qu'apres plusieurs images envoyes sur le client j'obtiens cette erreur :
Citation:
Exception in thread "Thread-4" java.lang.OutOfMemoryError: Java heap space
Cela arrive lorsque le client a demande une dizaines d'images. Donc 10 images ont ete crees sur le serveur.
Pour etre precis j'obtiens cette erreur dans ma methode createpicture :
Code:
1 2 3 4 5 6 7
|
public BufferedImage CreatePicture(int wi,int ho,int minX,int minY,int int_slice)
{
try
{
ScanImage=null;
ScanImage = new BufferedImage(wi,ho,BufferedImage.TYPE_INT_RGB); |
Jusque la je n'ai pas de probleme dans son execution. J'ai meme ajoute
ScanImage=null; pour etre sur que Scanimage est null et libere la memoire . Mais est ce bien utile ?
Code:
1 2 3 4 5 6
|
DataInputStream dis = new DataInputStream(new
FileInputStream(str_datasetPath));
dis.skipBytes(24+int_slice*int_nbByteImage);//24 stands for the header 6 short + 3float
byte[] byte_voxel = new byte[int_nbByteImage];
dis.readFully(byte_voxel); |
ce bout de code permet de recuperer les pixels d'une image dans un dataset. C'est dans ce bout de code que apparait l'erreur java heap space.
le reste du code c'est la creation d'une image a partir des pixels extraits mais l'erreur vient du bout precedent
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
for(int y=0; y<ho; y++)
{
int i = (y+minY)*widthInVoxels*2;
for(int x=0; x<wi*2; x+=2)
{
short sht_voxel = (short)((((byte_voxel[i+x+minX]&
0x000000ff) << 8) | (byte_voxel[i+x+1+minX]& 0x000000ff))-minDensityValue&
0x0000ffff);
sht_voxel = (short)(sht_voxel*255/int_ColorRange);
//convert the voxel value into a range from 0 to 255
// System.out.println("Viewer:CreatePicture test at x="+x);
ScanImage.setRGB((x)/2,y, sht_voxel << 16 | sht_voxel
<< 8 | sht_voxel);
}
// System.out.println("Viewer:CreatePicture test at y="+y);
}
}catch(Exception e){System.out.println("Can't display: " +
e);}
// return the image
System.out.println("Viewer:CreatePicture finishing ok");
return ScanImage;
} |
Quelles sont vos suggestions pour eliminer cette erreur qui apparait sur le serveur ? Le client n'affiche pas cette erreur, seulememt le serveur!
A+
MediaTracker et java heap space
A l'aide d'un MediaTracker tu peux controler le chargement de tes images en créant une classe Image:
Code:
1 2 3 4 5 6 7 8 9
| <div style="margin-left:40px">class Image {
<div style="margin-left:40px">MediaTracker mt;
Image() {
mt = new MediaTracker(this);
}
private boolean trackImage(Image img) {
<div style="margin-left:40px"> mt.addImage(img, MediaTracker.LOADING);
try{ mt.waitForID(MediaTracker.LOADING); } catch(InterruptedException e) { return false; } finally {
return true;</div></div> }</div>} |
Malheureusement il y a aussi une limite intrinsèque à la Java Machine qui est parfois ajustée, mais je ne sais pas si tu peux le faire dans le code...
:help:
Java Heap Space => SoftReference
Utiliser des SoftReference c'est utile pour palier le problème d'espace JVM.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
|
try{
/** WeakReferenced HashMap contenant les animations */
WeakHashMap player = new WeakHashMap();
if(!player.containsKey(j))
player.put(j, new _CacheAnimation(frames[0],
frames[1],
resourcesDir + "animation",
".png",
new Dimension(width, height),
mt));
} catch(OutOfMemoryError e) { continue; }
class _CacheAnimation extends WeakReference {
SoftReference listeners = new SoftReference(new HashSet());
/** constructeur de weakreference */
_CacheAnimation (int startingFrame, int endingFrame, String prefix, String suffix, Dimension size, MediaTracker mt) {
super(new Animation(startingFrame, endingFrame, prefix, suffix, size, mt));
addCacheListener(new CacheListener() { public void loadCache(int bytes) { /** chargement des données dans le cache */ return; }});
}
/** retrouver l'animation referencée */
public Animation getAnimation() { return (Animation)get();}
/** gestion d'un cache quelconque */
public void addCacheListener(CacheListener l) {
((HashSet)listeners.get()).add(l);
}
public void removeCacheListener(CacheListener l) {
((HashSet)listeners.get()).remove(l);
}
} |
Ce code ci-dessus est un extrait de code pour gérer de multiples animations dans une applet. Il n'est pas encore tout à fait au point. Le site developpez.com a publié à ce sujet un article sur les références Java. très intéressant...
:recherch: :tutoriel: