IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API standards et tierces Java Discussion :

Compiler du java en natif & Optimisation serveur socket


Sujet :

API standards et tierces Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 46
    Points : 24
    Points
    24
    Par défaut Compiler du java en natif & Optimisation serveur socket
    Bonjour

    Pour des raisons d'optimisation (processus et ram), j'aimerais pouvoir compiler mon serveur xmlsocket en executable pour linux (red hat) pour l'executer directement par la suite sans avoir besoin de la JVM.
    Je le dis pour certain : ne riez pas, j'ai très bien réussi à le faire sous Windows avec Excelsior JET. (mais celui-ci est payant et je n'ai pas réussi à l'installer sous linux).

    Si vous savez comment faire merci de me le faire savoir ;-)

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    509
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 509
    Points : 568
    Points
    568
    Par défaut
    Moi perso j'ai jamais généré d'exe , mais tout les commentaires que j'ai pu lire sur ce sujet disent que sans JVM l'exe ne fonctionne pas !!

    Ceci dit optimiser en generant un exe n'est peut etre pas la meilleur solution:
    Voici des arguments difficilement discutable :
    http://blog.developpez.com/index.php...&c=1&tb=1&pb=1

    A+

  3. #3
    Rédacteur
    Avatar de lunatix
    Homme Profil pro
    Architecte technique
    Inscrit en
    Novembre 2002
    Messages
    1 960
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 960
    Points : 3 736
    Points
    3 736
    Par défaut
    sous linux, tu peux essayer GCJ/gnu-classpath, mais ca ne supporte pas tout

  4. #4
    Membre du Club
    Inscrit en
    Août 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 49
    Points : 50
    Points
    50
    Par défaut
    moi je dis "attention", pour deux raisons :

    - tu casses la logique java (compile once, run everywhere) (je suis un puriste java )
    - rien ne te dis que ton executable sera plus performant qu'en JIT. les performances de ton executable vont dependre de la facon dont ton compilateur linux convertit les fonctionnalités critique java (garbage collection, threads, exceptions) en code natif executable linux.

    si ca t'amuse de comparer du bytecode et du native executable, voila quelques compileurs natifs :

    http://gcc.gnu.org/java/
    (Free) The Java GNU Compiler (GCJ) is part of GCC. GCJ can compile Java source or Java bytecodes to either native code or Java class files.

    http://www.excelsior-usa.com/jet.html
    (Commercial) JET is an optimizing Java to native code compiler that statically compiles Java bytecodes directly into native code, just like traditional C, C++ compilers.

    http://www.naturalbridge.com/bullettrain.html
    (Commercial) NaturalBridge BulletTrain Java to native code compiler

    http://www.windriver.com/products/html/fastj_compiler.html
    (Commercial) Wind River Systems Diab FastJ Java to native code compiler

    http://www.metrowerks.com/desktop/java/?features
    (Commercial) Metroworks Codewarrior for Java, Java to native code compiler.

    http://www.cs.vu.nl/manta/
    (Free) Manta compiler with Fast RMI.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 46
    Points : 24
    Points
    24
    Par défaut
    Merci
    Bon c'est vrai que c'est peut-être pas très utile que je compile en natif ^^''
    Et pour éviter de relancer un nouveau topic, je relance une question en rapport avec mon serveur :
    J'ai en moyenne dans les 90 connectés sur le serveur xmlsocket, et au bout de quelques heures (5 à 10 heures) il plante : les utilisateurs connectés restent connnectés mais ne peuvent plus ni recevoir ni envoyer de données, et personne ne peux plus se connecter ni se déconnecter.
    Je l'ai fais avec pour code de départ celui de Blablaserv ( http://defaut.developpez.com/tutorie...r/multithread/ ), que j'ai beaucoup enrichi (connexion mysql, requêtes perso...).
    De plus quand je lance le serveur, il utilise une dizaine de processus, je ne sais pas pourquoi, et à chaque fois qu'un utilisateur se connecte ça créé un nouveau processus. Donc 100 processus pour un serveur c'est ptètre pas top... surtout que le tout prend pas mal de ram : dans les 55 Mo (en ce moment même chaque processus indique 448172 kB !!)

    Si quelqu'un pouvait m'aider sur au moins un de ces problème ça serait super car je suis obligé de le surveiller en permanence ...

  6. #6
    Membre du Club
    Inscrit en
    Août 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 49
    Points : 50
    Points
    50
    Par défaut
    c'est une nouvelle question que tu poses, et ca n'a rien à voir avec le sujet "Compiler du java en natif". ca ne serait pas mieux de faire un autre tropic ? :

  7. #7
    Membre du Club
    Inscrit en
    Août 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 49
    Points : 50
    Points
    50
    Par défaut
    est-ce que ces Mo ne sont vraiment pas utilisés par ton appli ? ce sont peut etre des données utilisées par ton appli, non ?

    - quand un client se deconnecte, tu kill bien sa thread coté serveur ? (ou tu reutilises ce thread pour une nouvelle connection cliente ?)
    - tu fermes bien le statement/preparedstatement apres chaque usage ?
    - tu utilises un pool de connection sql ou non ?
    - tu fais des trucs genre String tata="machin"+"toto"+"bidule"? tu utilises les + pour concatener les chaines de caracteres ?

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 46
    Points : 24
    Points
    24
    Par défaut
    Alors...
    - le thread se termine comme dans Blablaserv avec la fermeture du socket (je sais pas si c'est idéal
    - J'utilise une seule connection mysql continue avec un seul Statement jamais fermé et pas de Preparedstatement
    - un pool ? c'est quoi ? ^^''''
    - oui je fais des trucs genre String tata="machin"+"toto"+"bidule"
    c'est pas top je sais ^^

    Comment je pourrais optimisé tout ça ?

  9. #9
    Membre du Club
    Inscrit en
    Août 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 49
    Points : 50
    Points
    50
    Par défaut
    - il faut fermer, apres chaque utilisation, ton statement

    - un pool de connections, c'est un ensemble de connections pretes à etre utilisées. quand tu as besoin d'une connection, tu en prends une dans ce tas de connections, et tu le remets, apres son utilisation, dans ce tas.
    http://webdevelopersjournal.com/columns/connection_pool.html
    http://www.javaworld.com/jw-06-1998/jw-06-object-pool.html
    http://www.theserverside.com/articles/article.tss?l=Prepared-Statments

    - ton augmentation de mémoire utilisée pourrait s'expliquer par le fait que tu utilises des "machin"+"bidule". il faudrait que tu remplaces ca par un stringbuffer.

    si tu as des questions n'hesite pas

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 46
    Points : 24
    Points
    24
    Par défaut
    Merci ^^
    comment on fait exactement avec un stringbuffer et en quoi c'est mieux pour la mémoire ?
    Je vais essayer de voir les pool de connexion mysql.

    Et sinon les threads correspondant à chaque client finissent comme ça (dans la fonction run):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    }finally {
          try {
          	System.out.println("Le client no "+_numClient+" s'est deconnecte");
            _serv.delClient(_numClient); // on supprime le client de la liste
            _s.close(); // fermeture du socket si il ne l'a pas déjà été
          }catch (IOException e){ }
    }
    Je ne sais pas si ça kill bien le thread

  11. #11
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    pour moi: une seule réponse

    refais tout en utilisant java.nio et 1 seul thread, ce sera bien plus performant. Ici, tu auras de quoi débuter dans cette techno: http://www.onjava.com/pub/a/onjava/2002/09/04/nio.html?page=2

    pour la mémoire: utilise des StringBuffer/StringBuilder si tu dois faire de gros et fréquents traitements de chaînes, sinon laisse tomber ce genre de petites optimisations... surtout que le compilo java en fait certaines automatiquement sans te demander ton avis

    et en dernier recours: affecte "null" à tes références dès qu'elles ne sont plus utilisées, pour forcer la libération d'un maximum de mémoire par le GC à chacun de ses passages

    ps: 448172 KB c'est plus proche de 500Mo que de 55

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 46
    Points : 24
    Points
    24
    Par défaut
    Ok je vais voir ça merci ^^
    avec un seul thread on peux faire du multi-utilisateur ?

    PS : je sais pas si c'est en kilobits ou kilobytes... mais sous windows ça me prend moins de 10 Mo le serveur donc ....

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 66
    Points : 85
    Points
    85
    Par défaut
    Citation Envoyé par Skreo
    avec un seul thread on peux faire du multi-utilisateur ?
    Oui.
    Je te conseil d'ailleurs de jeter un oeil sur Mina qui est plus pratique à utiliser que le package java.nio directement.

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 46
    Points : 24
    Points
    24
    Par défaut
    J'ai essayer le truc avec java.nio mais j'ai un problème : je ne vois pas comment :
    - envoyer un message d'un utilisateur à un autre
    - avoir une liste des utilisateurs et pouvoir accéder au socket de chacun d'entre eux par cette liste (avec un id pour chaque)
    - gérer les déconnexion des utilisateurs

  15. #15
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Hello,

    je pense pouvoir répondre à tes questions:

    Citation Envoyé par Skreo
    envoyer un message d'un utilisateur à un autre
    tu peux faire comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ((SocketChannel) aSelectionKey.channel()).write("Salut toto".getBytes());
    Citation Envoyé par Skreo
    avoir une liste des utilisateurs et pouvoir accéder au socket de chacun d'entre eux par cette liste (avec un id pour chaque)
    il suffit de stocker les "SelectionKey" associée à chacun des clients (le "Selector" doit normalement permettre de récupérer des ensembles de SelectionKey, avec "selector.keys()" )

    Citation Envoyé par Skreo
    gérer les déconnexion des utilisateurs
    tout simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    aSelectionKey.cancel();
    il sera supprimé du selector lors de la prochaine sélection

  16. #16
    Membre chevronné Avatar de Mister Nono
    Homme Profil pro
    Ingénieur Mathématiques et Informatique
    Inscrit en
    Septembre 2002
    Messages
    2 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur Mathématiques et Informatique
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 232
    Points : 1 898
    Points
    1 898
    Par défaut
    J'ai eu le même genre de problèmes pour une appli qui devait rester toujours en fonctionnement.

    La mémoire se remplissait lentement mais sûrement.

    Après de multiples recherches et tests :

    Fermeture des sockets dès qu'ils ne servaient plus (ou à intervalles réguliers avec ré-initialisation), déconnexion de la base de donnée dès qu'une requête était réalisée, vidage ou destruction des buffers in et out régulièrement.

    Depuis, l'appli fonctionne très bien.

    Salut.

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 46
    Points : 24
    Points
    24
    Par défaut
    oki
    Mais quand je dit gérer les déconnection des utilisateurs, c'est pas les faire se déconnecter ^^, c'est plutôt savoir quand ils se déconnectent et executer une fonction pour sauvegarder leurs données (c'est pour un jeu : http://www.murties.com)
    Pour la liste des utilisateurs et les envois entre utilisateurs, je pense faire un ArrayList contenant les références des SocketChannel des utilisateurs, et les clés de ce tableau sera leurs id.

    Pour l'instant voici la boucle (je ne sais pas si c'est bien) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    server = ServerSocketChannel.open();
    server.configureBlocking(false);
    server.socket().bind(new java.net.InetSocketAddress(port));
    Selector selector = Selector.open();
    SelectionKey acceptKey = server.register(selector, SelectionKey.OP_ACCEPT);
     
    while (it.hasNext( )) {
    	SelectionKey key = (SelectionKey) it.next();
    	it.remove();
     
    	if (key.isAcceptable()) {
    		SocketChannel client = server.accept();
    		client.configureBlocking(false);
    		client.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE);
    		System.out.println("Client Connected Successfully!");
    		continue;
    	}
     
    	if (key.isReadable()) {
    		SocketChannel client = (SocketChannel) key.channel();
    		readMessage(client); // Fonction qui lit le buffer du client
    	}
    }
    Une ptite question finale ^^ : quand on fait flush() sur un buffer, ça libère sa mémoire ?

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 46
    Points : 24
    Points
    24
    Par défaut
    up

  19. #19
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Citation Envoyé par Skreo
    gérer les déconnection des utilisateurs, c'est pas les faire se déconnecter ^^, c'est plutôt savoir quand ils se déconnectent et executer une fonction pour sauvegarder leurs données
    je viens de tomber la dessus:

    http://javaalmanac.com/egs/java.nio/DetectClosed.html?l=rel


  20. #20
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 46
    Points : 24
    Points
    24
    Par défaut
    Merci ^^

    Hum je viens de reprogrammer mon serveur, mais j'ai l'impression que c'est pire : avant avec 100 connectés le serveur prennait moins de 1% du processeur, et là, même avec aucun connecté, ça prend entre 25 et 50% du processeur !! (avec 1 connecté c'est pareil)

    Comment faire SVP ??

    Voici le code de la fonction de démarrage du ServerSocketChannel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    public static void startServer() throws Exception {
            logErreur("Démarrage serveur");
            // Create the server socket channel
            server = ServerSocketChannel.open();
            // nonblocking I/O
            server.configureBlocking(false);
            server.socket().bind(new java.net.InetSocketAddress(port));
            // Create the selector
            Selector selector = Selector.open();
            SelectionKey acceptKey = server.register(selector, SelectionKey.OP_ACCEPT);
     
            while (true) {
                try {
                    // Wait for an event
                    selector.select();
                } catch (IOException e) {
                    // Handle error with selector
                    break;
                }
                // Get keys
                Set readyKeys = selector.selectedKeys();
                // iterate over the set of selected keys:
                Iterator it = readyKeys.iterator();
     
                // Look at each key in the selected set:
                while (it.hasNext()) {
                    SelectionKey key = (SelectionKey) it.next();
                    it.remove();
     
                    if (key.isAcceptable()) {
                        SocketChannel client = server.accept();// get client socket channel
                        client.configureBlocking(false); // Non Blocking I/O
                        client.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE); // recording to the selector (reading & writing)
                        int idClient=addClient(client, key);
                        continue;
                    }
     
                    if (key.isReadable()) {
                        SocketChannel client = (SocketChannel) key.channel();
                        try {
                            readMessage(client);
                        }catch(Exception e){
                            System.out.println("ERROR in Server readMessage() " + e);
                        }
                    }
                }
            }
        }

Discussions similaires

  1. [Compilation]Compilateur Java
    Par gurv4n dans le forum Général Java
    Réponses: 4
    Dernier message: 09/01/2008, 21h31
  2. compiler java en natif
    Par darkbob dans le forum API standards et tierces
    Réponses: 8
    Dernier message: 01/10/2007, 11h59
  3. Réponses: 2
    Dernier message: 31/10/2005, 18h30
  4. [Java] Communication entre client et serveur
    Par danje dans le forum CORBA
    Réponses: 1
    Dernier message: 14/12/2004, 18h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo