Yoda писал(а):
Вы забываете, что ручное освобождение памяти не затрачивает никаких лишних ресурсов свыше необходимого - ни памяти, ни времени.
А что такое "необходимое" ? Это изменение данных в некой системной структуре в режиме монопольного доступа к ней. То есть пока операция не завершена некая часть памяти недоступна для операций и потоки, выделяющие или освобождающие память в этом регионе просто ждут. Вот это и есть те потери, которые вы почему-то не считаете важными. Собственно именно эти же потери присутствуют и в случае ОС на Java.
Yoda писал(а):
В то же время, ни один автоматический сборщик не может даже приблизится по эффективности к ручному освобождению и требует периодической полной остановки полезной работы.
Ручное освобождение требует периодической полной остановки работы на период этого самого освобождения. Правда в ручном режиме освобождение размазано по программе и потому не так заметно. В случае со сборщиком мусора работа выполняется просто немного большими порциями. А необходимость обходить граф объектов на рантайме высвобождает программистам кучу времени во время разработки. Или вы не делаете ошибок при работе с памятью ? И при этом ещё и выдаёте кода не меньше, чем Java-разработчик ?
Yoda писал(а):
Но я чувствую, что вы не владеете конкретными цифрами и объяснять разницу бессмысленно.
Мне видится другое слово - неохота. Ну да это ваше право, конечно.
Yoda писал(а):
Как вы будете планировать время CPU?
Реализовано при помощи таймера. И проблем не обнаружил.
Yoda писал(а):
Как вы запустите выделение страницы памяти приложению, если не можете гарантировать, что в этот момент в самом ядре не запуститься сборщик и не затребует сотни новых страниц? Кто и как их будет выделять??
Коллектором можно управлять. Удивлён, что такая мысль многим не приходит в голову (вы, к сожалению, не первый). Теперь давайте попробуем объяснить это чудо. Для начала можно вспомнить о концепции прерываний. Эти штуки встречаются в том числе в ОС, написанных на С, и их возникновение совершенно не мешает работе системы. То есть если наши читатели понимают принцип работы прерываний, они отлично поймут, почему же прерывания не заставляют систему падать, запускать сборщики мусора и т.д. Вот примерно так же всё происходит и при запросе на выделение памяти - просто предпринимается ряд мер для предотвращения печальных последствий. В описании архитектуры (
по ссылке "description") приведены подробности по типам используемых коллекторов и их реализации, там всё довольно просто. Но самое главное - коллектор можно тривиально выключить, если нужно. Ещё используемый вариант - просто закэшировать необходимые объекты заранее и не использовать дополнительную память (и её выделение с освобождением) вообще. То есть это всё давно решённые многими способами проблемы.
Yoda писал(а):
Тот факт, что Андроид написан не на Джаве (и более того, опирается на ядро Линукс, написанное на ненавистном С), совершенно не мешает эффективно работать на нём джава-приложениям.
То есть вы согласны, что эффективность Java не хуже ненавистного С ?
Ну а на самом деле андроидная джава есть весьма убогая поделка. Оно работает, даже некоторые системные фичи из Java можно дёргать, но тем не менее постоянно упираешься в стену, которую сгородили архитекторы системы. Поэтому под Андроид весьма популярен NDK (native development kit).
Yoda писал(а):
Многие сравнительные тесты Java лукавят, т.к. не учитывают амортизированного времени и памяти, т.е. с учётом накладных расходов. Тесты не показывают фундаментального преимущества Java, а там где оно есть, оно находится в пределах погрешности.
В принципе, что бы сделать качественный и удовлетворяющий всех сравнительный тест, нужно начать с операционной системы на Java. Иначе сторонники С всегда будут возражать - Java использует сишные системные вызовы, так не честно ! Хотя бы с этой точки зрения я уже вижу пользу от 100% Java операционной системы