Ce ne serait pas plutôt grâce au pattern 'copy on write'. Je suis pas un utilisateur de Java mais même si tout est référence il y a bien des copies à un moment donné non ?
Je viens de terminer un projet de session où on devait coder en java sur un système embarqué (Debian sur ARM) et j'ai détesté mon expérience java. J'ai commencé à coder en C, puis C++, et je n'ai pas trouvé que java était beaucoup plus facile que C++; par contre, j'ai remarqué une bonne perte de performances.
De plus, nous sommes tombés sur un bug de la machine virtuelle java: la plupart des opérations sur des double ou des float retournaient des valeurs louches comme ":58.254:24::24" ou encore "0.0P". Nous avons perdu un bon trois heures avant de se rendre compte de ce bug, et on a finalement adopté une solution pas trop propre: on multiplie la valeur recue par 1000, puis on caste en int aussitot qu'on peut. On fait alors nos opérations en int, puis on recaste en double juste avant de retourner.
Bref, j'espère pouvoir me tenir aussi loin que possible de java à l'avenir...
On dit "Java: code once, run everywhere"... Je dirais plutôt "Java: code once, debug everywhere"
De plus, dire que java est meilleur parce qu'il marche sur toutes les plateformes c'est comme dire que le sexe anal est meilleur parce qu'il marche sur les deux sexes...
Je me souviens
Ad mari usque ad mare
GENERATION 23: The first time you see this, copy it into your sig on any forum and add 1 to the generation. Social experiment.
Si on garde l'analogie, Java ça sent la merde !
Kochise

Si Dieu m'a de nouveau fait homme, cette fois il m'a pas raté : marcher sur l'eau et dupliquer les pains, ça marche p'us :/
en effet.
N'oubliez pas javacard en plus.
CA c'est du java embarqué. j2me c'est de la gnognotte ^^
Par construction, en faisant l'hypothese du "meilleur codeur possible", les langages compiles sont forcement strictement plus rapides que les langages interpretes/bytecode/JIT. Tout simplement parce qu'on peut toujours coder un programme qui a le meme comportement qu'un interpreteur/une VM/un compilateur JIT avec un langage compile alors que l'inverse n'est pas vrai.

I'm on a boat motherfucker, don't you ever forget
onur Le 11/12/2009 à 02:00 Ce que tu dis est mathématiquement vrai. Maintenant, si c'est pour coder un truc en C++ qui soit capable de JIT le reste de ton programme bytecodé, l'interet de ne pas utiliser un langage fait pour ca devient tres faible.
Tout ce qui passe pas par le port 80, c'est de la triche.
bien sur qu'en pratique c'est pas realiste de faire ca. maintenant si on ne prend pas betement cette affirmation theorique au pied de la lettre et qu'on lit un peu entre les lignes, ce que ca veut dire, fondamentalement, c'est que si les compilateurs JIT utilisent des astuces pour rendre l'execution plus rapide, il n'y a aucune raison pour que les compilateurs normaux ne puissent pas adapter et integrer ces memes astuces.

I'm on a boat motherfucker, don't you ever forget
L'optimisation virtual call est inutile dans un langage bien conçu comme le C++ parce qu'on ne déclare tout simplement pas les fonctions comme virtual si elles n'ont pas besoin de l'être!
La remarque de Kevin me semble pertinente. Pourquoi déclarer une méthode virtuelle alors que cela est inutile quand on n'utilise pas le polymorphisme !
La remarque est d'autant vraie pour d'autres optimisations (que ça soit en C++ ou en Java !).
Cette optimisation n'est utile en Java que parce que toutes les méthodes sont virtuelles (sauf si on interdit carrément la surcharge avec final). En C++, on ne déclare tout simplement pas les méthodes virtual dans les cas où cette optimisation serait utile en Java.
Oui mais en l'occurence dans énormément de cas tu auras des méthodes "virtuelles parce que c'est utile" sans t'en servir. Prends à peu près n'importe quel framework/librairie, et tu comprendras où je veux en venir.
Sinon je parlais des interfaces (par exemple en (D)COM(+) sur windows) comme on en trouve en C# ou Java, et dont les équivalents les plus proches (directs avec certaines contraintes) en C++ sont les classes abstraites, et où tu as _nécéssairement_ besoin que les méthodes soient virtuelles. Pour les classes normales, java est obligé de se démerder au mieux (ce n'est pas le cas en C# car tout comme en C++, les méthodes ne sont pas virtuelles par défaut) et d'utiliser le fait que les méthodes ou classes soient sealed dès que possible, mais au final quel que soit le langage, tous sont confrontés au même cas...
Quand tu (=ton porgramme) n'a aucune idée du code qui va t'être branché au cul, tu ne pourras jamais t'en tirer avec une optimisation statique, il faudra nécéssairement que tu utilises une optimisation dynamique. Qui dit dynamique dit JIT, c'est aussi simple que ça (en l'occurence les appels d'interface ne nécéssitent pas un vrai JIT super complexe avec de la vraie génération de code (quoi que...) mais c'est quand même du code qui ne fait pas vraiment partie de ton programme bien qu'il soit embarqué dedans)

Mais c'est source de bugs et autres problèmes incompréhensibles etc. etc. etc.
[Edit] cross