C'est vraiment un veau java. Un exemple simple est celui des tableaux. a chaque tab[i] que tu fais, il y a une verification de la borne i du tableau. Dans le genre, bonjour les perfs de merde, il n'y a pas mieux.
Il y a aussi les conversions de Object vers un type precis. Java verifie le type implicitement. C'etait completement critique avant java 1.5 a cause des structures de donnees qui etaient defini sur des Object. Maintenant, les generics permettent de supprimer la verification parceque la coherence de type est assurer a la compilation.
Il y a aussi les fonctions polymorphes. En java toutes les fonctions d'un objet sont polymorphes par defaut. Comme tous les objets ne sont pas connu a priori, il n'est pas possible de savoir si une fonction est redefini dans un objet plus tard. Il est donc imperatif de conserver des tables d'appels virtuel pour tous les objets. Ca implique des dereferencement de pointeurs un peu partout c'est assez gourmand.
Par contre, l'abstraction de la memoire peut permettre d'eviter la fragmentation memoire et d'ameliorer les cache-hits.
Cependant, pour des applications qui ne sont pas CPU intensive, ca marche pas si mal. et c'est assez simple a ecrire.
Il y a un bon article dans linke dans wikipedia sur les perfs de java et de C++ ( http://bruscy.republika.pl/pages/przemek/java_not_really_faster_than_cpp.html ). En bref, ca dit que si tu ne sais pas vraiment ce que tu fais en C++, tu n'auras pas de meilleur perfs qu'en java. Par contre, si tu sais ce que tu fais et que tu y passe un peu de temps, tu vas gagner des facteurs colossaux.