Gestion de la memoire, Garbage Collector, tableau statique et ByteArrayOutputStream

Version imprimable

Citation:


en fait j'alloue deux tableau de facon statique dans le constructeur
Code:

1
2
3
 
bytearrayImg = new byte[1024*100];
bytearrayMsg = new byte[1024];

le premier me sert de tampon pour les images, l'autre de tampon pour les messages, je n'utilise plus de ByteArrayOutputStream, à tord ? :roll:
Concernant les variables temporaires, j'ai essayé d'optimiser un max, avec l'instanciation dans le construceur, ou si je ne pouvais pas le faire, je mettais à "null" la variable local avant la fin de la méthode

Citation:

Bref... Il faudrait bien voir l'algo et le code (et ce que cela implique en création d'objet temporaire) avant de se tourner vers le GC !
:arrow: Si l'appli est gourmande c'est surement parce que le GC est déjà en train de allouer/libérer beaucoup d'objet... Donc l'appeler directement n'améliorera pas forcément les perfs (cela peut même avoir l'effet inverse).
Bon courage...
a++
je te mets ci dessous un bout de code qui me sert à lire dans l'InputStream, et à stocker dans mes mon tableau l'image recu, pour les message c'est le meme code mais pas le meme tableau:
Code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
//lecture d'une image ---->
//sizeData est la taille du bloc de données
//in_stream est l'InputStream
int remaingbytes = sizeData;
int read = 0;
boolean arret = false;
int totalread = 0;
while(remaingbytes > 0)
{
read = in_stream.read(bytearrayImg, totalread, remaingbytes);
if (read == -1)
{
arret = true;
}
remaingbytes = remaingbytes - read;  
totalread += read;
}


merci de ton aide
  • 01/03/2007, 12h28
    adiGuba
    Citation:

    Envoyé par nonoRedDevils
    si je connais la taille du fichier que je dois recevoir, en gros je recois un message de 12 octets, qui contient la taille du bloc de donnée qui suit ce message

    Puisque tu connais la taille de l'image, tu peux optimiser ton tableau "bytearrayImg" afin qu'il n'utilise que ce qu'il a besoin :
    Code:

    byte[] bytearrayImg = new byte[sizeData];

    Citation:

    Envoyé par nonoRedDevils
    je n'utilise plus de ByteArrayOutputStream, à tord ? :roll:

    Non : le ByteArrayOutputStream est très bien lorsque tu ne connais pas la taille exact de ce que tu vas lire, car il s'agrandit automatiquement et de manière transparente. Mais si tu connais la taille exacte c'est bien mieux de passer directement par un byte[] ;)



    Sinon : tu fermes bien tes InputStream ? Dans des bloc finally ?

    Code:

    1
    2
    3
    4
    5
    6
    InputStream in_stream = // ouverture du flux
    try {
        // Traitements sur in_stream
    } finally {
        in_stream.close();
    }

    a++
  • 01/03/2007, 12h31
    nonoRedDevils
    Citation:

    Envoyé par adiGuba
    Puisque tu connais la taille de l'image, tu peux optimiser ton tableau "bytearrayImg" afin qu'il n'utilise que ce qu'il a besoin :
    Code:

    byte[] bytearrayImg = new byte[sizeData];
    Non : le ByteArrayOutputStream est très bien lorsque tu ne connais pas la taille exact de ce que tu vas lire, car il s'agrandit automatiquement et de manière transparente. Mais si tu connais la taille exacte c'est bien mieux de passer directement par un byte[] ;)

    en fait, désolé je me suis mal exprimer, je connais certes la taille de l'image qui va arriver, mais les tailles sont toutes differentes!


    Citation:

    Sinon : tu fermes bien tes InputStream ? Dans des bloc finally ?

    Code:

    1
    2
    3
    4
    5
    6
    InputStream in_stream = // ouverture du flux
    try {
        // Traitements sur in_stream
    } finally {
        in_stream.close();
    }

    a++
    non je ne fais pas de close, car mon appli est fait de la video, donc si tu veux j'ai besoin que mon inputStream reste ouvert tant que l'utilisateur est connecté au site