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

Débats sur le développement - Le Best Of Discussion :

[Débat] C++ vs Java


Sujet :

Débats sur le développement - Le Best Of

  1. #941
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 681
    Points
    18 681
    Par défaut
    Citation Envoyé par epsilon68 Voir le message
    ... je n'en reviens pas qu'on ose montrer des resultats sur l'occupation memoire de Java avec un programme qui ne fait aucune allocation !!!


    c'est assez surprenant en effet...

    mais même ce programme réalise en fait quelques allocations mémoires, si l'on regarde d'assez près le mécanisme de chargement des classes
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  2. #942
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par epsilon68 Voir le message
    ... je n'en reviens pas qu'on ose montrer des resultats sur l'occupation memoire de Java avec un programme qui ne fait aucune allocation !!!
    Je répondais juste a ton interrogation sur l'utilisation mémoire "réelle" du processus de la JVM par rapport aux options Xms et Xmx.

    Xms est la mémoire utilisée dés le démarrage.
    Xmx est la mémoire allouée mais pas forcement utilisée pour l'instant.

    Les variations de la mémoire utilisée en fonction des allocations du programme Java n'ont rien d'extraordinaire: Plus tu crées des instances d'objets, plus la mémoire utilisée augmente. Quand les objets ne sont plus utilisés, la mémoire est liberée a chaque cycle d'execution du GC. Le démarrage d'un cycle est parametrable par d'autres options de la JVM (cf liens précédants).
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  3. #943
    Inactif  
    Inscrit en
    Avril 2005
    Messages
    750
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 750
    Points : 498
    Points
    498
    Par défaut
    Citation Envoyé par Mat.M Voir le message
    En C/C++ tu n'est pas limité comme cela il y seulement les limites de l'OS..
    en C/C++ tu peux appeler des API natives par exemples celles de Windows qui te permettent d'allouer des gros blocs de mémoires.
    Tu peux gérer la mémoire paginée bref tout ce que tu veux..
    Peut-on faire la même chose avec Java ? Je suis sceptique...
    Non, enfin pas a ma connaissance. Java et C++ sont des langages différents et c'est tant mieux. Si tu créés une appli pour laquelle la gestion de la mémoire est vraiment crucial, alors utilises C++, lol. Maintenant pour la plupart des applications, graphique ou web, java est parfaitement adapté et si ton code est bien fait, cela ne consomera pas plus, ou ne sera pas plus lent que la même appli en C++. Pour moi le seul avantage que je vois à C++ c'est que l'on accés au hardware de la machine, c a d que l'on peut programmer à un bas niveau, et encore pour ce genre de programme je préfererai faire toute les taches de bas niveau en C, et ensuite couplé sa a du JNI.

  4. #944
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    Xmx est la mémoire allouée mais pas forcement utilisée pour l'instant.
    Juste une petite nuance : Xmx correspond à la quantité maximum de mémoire allouable par le programme, mais ce n'est pas pour autant que cette quantité sera utilisé...

    Citation Envoyé par Mat.M Voir le message
    En C/C++ tu n'est pas limité comme cela il y seulement les limites de l'OS..
    Pour une application Java en théorie l'OS c'est la machine virtuelle
    Par contre je suis d'accord que cette notion de taille maximum puisse être problématique dans certain cas puisqu'il faut la définir explicitement. Quoique cela peut dépendre aussi de la JVM (il me semble que par défaut la JVM d'IBM s'adapte au système pour cette valeur).


    Citation Envoyé par Mat.M Voir le message
    en C/C++ tu peux appeler des API natives par exemples celles de Windows qui te permettent d'allouer des gros blocs de mémoires.
    C'est déjà ce que fait le Garbage Collector : il alloue la mémoire d'un bloc

    Citation Envoyé par Mat.M Voir le message
    Tu peux gérer la mémoire paginée bref tout ce que tu veux..
    Peut-on faire la même chose avec Java ? Je suis sceptique...
    Surement pas... mais je dois t'avouer que dans mon domaine (application de gestion & serveur d'application) je n'ai jamais eu à toucher à cela, que ce soit en Java ou en C (concrètement je ne sais même pas quel en est l'utilité).


    Citation Envoyé par epsilon68 Voir le message
    en fait tu ne peux rien configurer a part fixer des bornes pour la memoire de ton appli c'est tout !
    As-tu au moins jeter un coup d'oeil sur les liens qui t'ont été donné ? Xms et Xmx correspondent simplement aux options de base...

    Citation Envoyé par epsilon68 Voir le message
    si tu bornes au maximum de 128 Mo alors ton appli qui en demande 150 Mo va te jeter c'est tout !

    maintenant si tu mets 200 Mo alors ton appli qui pourrait se contenter de 150 Mo va quand meme effectivement en consommer 200 Mo.
    Comme je l'ai dit le Xmx est la valeur maximale, mais si l'application consomme moins de mémoire elle ne sera bien évidemment pas atteinte.
    Bien sur si tu utilises Xms avec 200 Mo alors ton application consommera 200 Mo même si elle n'en a pas besoin, mais c'est une erreur de ta part et non pas du système (ce serait comme si tu allouais 200 Mo de mémoire en C/C++ sans les utiliser).

    Citation Envoyé par epsilon68 Voir le message
    sinon vous avez deja essayé de tuner le GC?
    un cas concret?
    Non je n'ai jamais vraiment eu de besoin si spécifique que cela. Le comportement par défaut du GC est tout à fait correct pour mes besoins.

    Citation Envoyé par epsilon68 Voir le message
    moi j'avais essayé mais ca n'a vraiment rien donné, il a fallu modifier le code pour reutiliser la memoire quand c'etait possible.
    C'est à dire concrètement ? Pourrais-tu donner un exemple du code que tu as modifié ?

    a++

  5. #945
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    le fond du probleme est que à chaque fois qu'on dit que le garbage est embetant car il ne libere pas assez vite la memoire et que le processus se met a consommer de la memoire a fond de 5ieme, alors on nous dit que le GC se parametre !!!

    montrez ou citez moi un exemple concret dans lequel ca a marché !
    et quelles options vous avez utilisées ? et comment le programme a reagit ?

    c'est trop compliqué ?

  6. #946
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Juste une petite nuance : Xmx correspond à la quantité maximum de mémoire allouable par le programme, mais ce n'est pas pour autant que cette quantité sera utilisé...
    Oups. Oui, c'est la mémoire "reservée" (et non pas allouée comme je l'ai dit précédement). Toutes mes confuses....
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  7. #947
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    C'est à dire concrètement ? Pourrais-tu donner un exemple du code que tu as modifié ?
    oui je peux. Je l'avais deja expliqué d'ailleurs.
    j'avais une boucle dans lequel je recreais une String assez grosse.
    Le programme utilisait de la memoire à atteindre les limites (256Mo) et plantait.

    ca parait simple dit comme ca non ? mais imaginez donc que cette string etait enfoui dans la structure de données manipulée...

    c'etait pas facile mais apres de nombreuses tentatives sur le parametrage du GC et de revus de code alors je m'en suis apercu, et j'ai utilisé un StringBuffer que j'ai ensuite propagé dans ma structure. resultat: le programme utilise 40Mo

  8. #948
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par epsilon68 Voir le message
    ce n'est pas du tout une histoire de concetenation de string.
    En l'occurence la string etait le resultat d'un StringBuffer.
    Je dois avouer que ce n'est pas tout à fait clair : tu as le problème lorsque tu utilises un StringBuffer ou lorsque tu utilises l'opérateur + sur les String ?

    a++

  9. #949
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    bon ...
    franchement je pensais avoir été assez clair.

    j'ai une boucle (for ou while) dans laquelle a chaque tour, une String très grosse était créée (le resultat d'un StringBuffer)

    c'est bon jusque la ? je fais donc de l'allocation assez consequente a chaque tour de boucle en gros ...

    Cette allocation etait faite tres enfouite profondemment dans ma structure de données ok ?

    ca faisait exploser le processus ( > 256Mo)

    J'ai du modifier mon code pour creer un stringBuffer avant la boucle puis a chaque tour de boucle, la passer a ma structure de données pour qu'elle puisse reutiliser la StringBuffer plutot que d'en refaire un.

    au final l'appli ne prend plus que 40 Mo



    l'allocation faite a chaque tour de boucle varie en fait...
    ca peut etre 2Ko, 200Ko, 2Mo
    maximum 3Mo

    le nombre de tour de boucle est cependant important (>6000)

    Citation Envoyé par adiGuba Voir le message
    Comme je l'ai dit le Xmx est la valeur maximale, mais si l'application consomme moins de mémoire elle ne sera bien évidemment pas atteinte.
    C'est faux! L'experience montre que Java s'etend tout doucement jusqu'a atteindre la limite fixée (par defaut a 64 Mo).

  10. #950
    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
    euh, ben oui, mais la bon...
    si tu alloue une grosse String dans une boucle.. ben, pas de miracle, tu bouffes de la memoire

    tu peux meme descendre au niveau bytebuffer ou charbuffer en java pour faire des trucs de ce genre avec de hautes performances

  11. #951
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    n'oubliez pas que ce n'est pas si evident que cela, si tout est bien encapsulé ...
    n'oubliez pas que meme une lib que vous utilisez peut faire une allocation de ce type.

    enfin le GC se configure non ?

  12. #952
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par epsilon68 Voir le message
    n'oubliez pas que ce n'est pas si evident que cela, si tout est bien encapsulé ...
    n'oubliez pas que meme une lib que vous utilisez peut faire une allocation de ce type.

    enfin le GC se configure non ?
    Oui. Si tu as utilisé HotSpot (la jvm de sun), ton probleme etait surement que la taille allouée aux "jeunes generations" (YoungGen) n'etait pas suffisante.

    Tracer les OutOfMemoryEx de ce type peut se faire assez facilement en activant le mode "verbose" du GC.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  13. #953
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    335
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 335
    Points : 521
    Points
    521
    Par défaut
    Citation Envoyé par lunatix Voir le message
    euh, ben oui, mais la bon...
    si tu alloue une grosse String dans une boucle.. ben, pas de miracle, tu bouffes de la memoire

    tu peux meme descendre au niveau bytebuffer ou charbuffer en java pour faire des trucs de ce genre avec de hautes performances
    Oui enfin, c'est quand même un piège classique parce que: la string est immutable d'une part, et que les instanciation sont masquées par les opérateurs d'une autre.

    Donc quand on fait un s+=<nimporte quoi> dans une boucle, on a à chaque fois la conversion de String en stringbuffer pour l'ajout (le compilo qui transforme le +=), puis la recréation d'une String.
    on crée plein d'objets destinés à être supprimés ensuite, on fait travailler le GC pour rien.


    Le problème serait le même avec d'autres objets immutable (Double, BigInteger...) dont on veut une valeur modifée à chaque tour de boucle: on crée des objets à tour de bras.

    il faut penser les conceptions en minimisant les créations d'objet temporaire (de même qu'en C++ du reste)

  14. #954
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    parce que tu penses que tu peux toujours penser cela a la conception ?
    ... tu te trompes

    et en C++ cela n'aurait pas été génant, au niveau de la memoire il serait resté à ras le sol

  15. #955
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    335
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 335
    Points : 521
    Points
    521
    Par défaut
    Je parlait de conception de classe immutable type String, il faut prévoir son pendant type StringBuffer mutable à la conception des diagrammes de classe.
    Maintenant, si je me trompe, c'est peut-être parce que tout le monde code avant les conceptions

    Pour l'utilisation des string-stringbuffer, c'est juste une habitude de réalisation. Le problème ne se pose pas sur les String en C++ vu que ça ne fonctionne pas du tout pareil, mais dans n'importe quel langage, allouer-désallouer de la mémoire en permanence dans des boucles, c'est mal.

  16. #956
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par deltree Voir le message
    Je parlait de conception de classe immutable type String, il faut prévoir son pendant type StringBuffer mutable à la conception des diagrammes de classe.
    Maintenant, si je me trompe, c'est peut-être parce que tout le monde code avant les conceptions
    C'est surtout que Sun a décidé que la classe "String" aurait droit a un opérateur "+=". Pourquoi cette classe et pas les autres ? mystere.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  17. #957
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    Citation Envoyé par deltree Voir le message
    Je parlait de conception de classe immutable type String, il faut prévoir son pendant type StringBuffer mutable à la conception des diagrammes de classe.
    Maintenant, si je me trompe, c'est peut-être parce que tout le monde code avant les conceptions
    ou peut-etre que tu oublies les changements de derniere minute, un budget à respecter, les differences entre les programmeurs, et que les details d'implementation sont rarement abordés à la conception.

    en plus, comme j'ai déjà dit, tu pourras utiliser une lib qui elle meme fait une allocation de ce type, et que si tu l'utilises dans une boucle, tu auras le meme probleme.

    montrez moi que ces details d'implementations peuvent etre gommés en configurant le GC, a chaque fois on me le ressort alors j'attends maintenant en fait !

    Aussi arretez de trouver toujours des excuses, un coup c'est la config du GC, un autre coup, c'est la conception... bof !
    l'excuse de la conception, je peux le ressortir a chaque critique.... c'est nul!

  18. #958
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par epsilon68 Voir le message
    montrez moi que ces details d'implementations peuvent etre gommés en configurant le GC, a chaque fois on me le ressort alors j'attends maintenant en fait !
    Montre nous deja le code "minimum" qui genère ton OutOfMemory.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  19. #959
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par epsilon68 Voir le message
    montrez moi que ces details d'implementations peuvent etre gommés en configurant le GC, a chaque fois on me le ressort alors j'attends maintenant en fait !
    Le GC ne permet pas de gommer des problèmes d'implémentations mais seulement de gérer la mémoire...

    Et des problèmes d'implémentations tu peux tout aussi bien en avoir en C++ en gérant la mémoire à la main !



    Citation Envoyé par epsilon68 Voir le message
    Aussi arretez de trouver toujours des excuses, un coup c'est la config du GC, un autre coup, c'est la conception... bof !
    l'excuse de la conception, je peux le ressortir a chaque critique.... c'est nul!
    On ne cherche pas d'excuse : on ignore toujours le code qui est en cause ! Et tu as dit toi même que tu as dû changer l'implémentation donc on en déduit que la première n'était pas bonne...


    C'est toi qui affirme depuis le début que le problème vient du GC !

    a++

  20. #960
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Le GC ne permet pas de gommer des problèmes d'implémentations mais seulement de gérer la mémoire...
    tu confonds probleme d'implementation et detail d'implementation

    avec Java, tu as le GC mais en fait on est quand meme obligé de la gerer a la main, alors oui pour moi le GC n'est pas assez performant.

    ne confond pas non plus avec le C++, un probleme de pointeur n'est pas la meme chose. Dans mon cas le programme Java fonctionnait mais prenait trop de memoire. Desolé tu ne peux pas avoir cela en C++.

    au fait partant de cela, tous les problemes memoires vont finir par nous faire modifier le code puisque la configuration du GC n'y pourra jamais rien

Discussions similaires

  1. [Débat] Technologie .NET vs JAVA
    Par neo.51 dans le forum Débats sur le développement - Le Best Of
    Réponses: 1047
    Dernier message: 14/01/2019, 16h15
  2. [Débat] .NET vs JAVA/J2EE
    Par tssi555 dans le forum VB.NET
    Réponses: 5
    Dernier message: 10/12/2008, 07h54

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