VM/платформа
- VM отжирает гору памяти. Nuff said. Причем делает это не объектами, которые нужны, а просто незанятыми областями чтобы сборщику мусора было где разогнаться. Для десктопных приложений это значит что запускать более 1 или 2 java приложений лучше не надо.
- VM любит оптимизировать код на лету на основе PGO в составе кажется более 100 оптимизаций. Но нафейхоа делать это заново при каждом запуске? Силушки богатырской сделать кеш бинарей не хватило? Или возможно второй запуск будет иметь совершенно другие паттерны работы?
- Generics через стирание. Пихаешь в список int's и получаешь гору объектов по 16 байт, в идеале рядом в памяти, но не факт. Потом их все периодически пережевывает сборщик мусора.
- Отсутствие беззнаковых типов. Хочешь беззнаковые 32 бита, юзай 64. Бакланопоцит создателей. Причин вменяемых нет, просто упоролись и все.
- Гуи фреймворки overengineered и не угадали с концепцией. AWT и SWT в мусорку, апи отвратительное. Swing заставляет делать много телодвижений, нехило жрет память и ненависть к JTable.
- В 90-е создатели страдали графоманией, манией величия, корпоративизмом и waterfallом, видно в любой технологии типо EJB
Язык
- Нет лямбд. Добавь их и все приложения станут меньше в 2 раза и чище в 8. Лямбды уже добавили в паскаль, но не в Java
- Нет traits
- Генерить getters/setters тупняк, вполне можна было сделать universal access
Хорошие стороны Java перевешивает плохие, но ты спрашивал только поругать.