Java — это набор компьютерного программного обеспечения и спецификаций, который предоставляет программную платформу для разработки прикладного программного обеспечения и развертывания его в кроссплатформенной вычислительной среде. Java используется в самых разных вычислительных платформах от встроенных устройств и мобильных телефонов до корпоративных серверов и суперкомпьютеров . Java-апплеты , которые встречаются реже, чем отдельные приложения Java, обычно запускались в защищенных изолированных средах для предоставления многих функций собственных приложений посредством встраивания в HTML- страницы.
Написание на языке программирования Java является основным способом создания кода, который будет развернут как байт-код в виртуальной машине Java (JVM); компиляторы байт-кода также доступны для других языков, включая Ada , JavaScript , Kotlin (предпочтительный язык Android от Google), Python и Ruby . Кроме того, несколько языков были разработаны для работы на JVM, включая Clojure , Groovy и Scala . Синтаксис Java во многом заимствован из C и C++ , но объектно-ориентированные функции смоделированы по образцу Smalltalk и Objective-C . [13] Java избегает определенных низкоуровневых конструкций, таких как указатели , и имеет очень простую модель памяти , в которой объекты размещаются в куче (в то время как некоторые реализации, например, все в настоящее время поддерживаемые Oracle, могут использовать оптимизацию escape-анализа для размещения в стеке ), а все переменные типов объектов являются ссылками . Управление памятью осуществляется с помощью интегрированной автоматической сборки мусора , выполняемой JVM.
Последняя версия — Java 22, выпущенная в марте 2024 года, а последняя версия с долгосрочной поддержкой (LTS) — Java 21, выпущенная в сентябре 2023 года, которая является одной из немногих версий LTS, которые все еще поддерживаются, вплоть до Java 8 LTS. Как платформа с открытым исходным кодом, Java имеет множество дистрибьюторов, включая Amazon , IBM , Azul Systems и AdoptOpenJDK . Дистрибутивы включают Amazon Corretto, Zulu, AdoptOpenJDK и Liberica. Что касается Oracle, она распространяет Java 8, а также делает доступными, например, Java 11, обе также в настоящее время поддерживаемые версии LTS. Oracle (и другие) «настоятельно рекомендуют вам удалить более старые версии Java», чем Java 8, [14] из-за серьезных рисков из-за нерешенных проблем безопасности. [15] [16] [17] Поскольку Java 9 (а также версии 10, 12–16 и 18–20) больше не поддерживаются, Oracle рекомендует своим пользователям «немедленно перейти» на поддерживаемую версию. Oracle выпустила последнее бесплатное для коммерческого использования публичное обновление для устаревшей Java 8 LTS в январе 2019 года и продолжит поддерживать Java 8 с публичными обновлениями для личного использования в течение неопределенного срока. Расширенная поддержка Oracle для Java 6 закончилась в декабре 2018 года. [18]
Платформа Java представляет собой набор программ, которые облегчают разработку и запуск программ, написанных на языке программирования Java . Платформа Java включает в себя механизм выполнения (называемый виртуальной машиной ), компилятор и набор библиотек ; также могут быть дополнительные серверы и альтернативные библиотеки, которые зависят от требований. Платформы Java были реализованы для широкого спектра оборудования и операционных систем с целью обеспечения идентичного запуска программ Java на всех из них.
Платформа Java состоит из нескольких программ, каждая из которых предоставляет часть ее общих возможностей. Например, компилятор Java , который преобразует исходный код Java в байт-код Java (промежуточный язык для JVM), предоставляется как часть Java Development Kit (JDK). Java Runtime Environment (JRE), дополняющая JVM компилятором just-in-time (JIT) , преобразует промежуточный байт-код в машинный код на лету. Платформа Java также включает в себя обширный набор библиотек.
Основными компонентами платформы являются компилятор языка Java, библиотеки и среда выполнения, в которой промежуточный байт-код Java выполняется в соответствии с правилами, изложенными в спецификации виртуальной машины.
Различные платформы ориентированы на различные классы устройств и домены приложений :
Java Platform, Standard Edition (Java SE) — это вычислительная платформа для разработки и развертывания переносимого кода для настольных и серверных сред. [19] Java SE ранее была известна как Java 2 Platform, Standard Edition (J2SE).
Платформа использует язык программирования Java и является частью семейства программных платформ Java. Java SE определяет ряд API общего назначения — таких как API Java для библиотеки классов Java — а также включает спецификацию языка Java и спецификацию виртуальной машины Java . [20] OpenJDK является официальной эталонной реализацией с версии 7. [21] [22] [23]Сердцем платформы Java является «виртуальная машина», которая выполняет программы байт-кода Java . Этот байт-код одинаков независимо от того, на каком оборудовании или операционной системе запущена программа. Однако новые версии, такие как Java 10 (и более ранние), внесли небольшие изменения, что означает, что байт-код в целом совместим только вперед . В виртуальной машине Java , или JVM, есть компилятор JIT (Just In Time) . Компилятор JIT транслирует байт-код Java в собственные инструкции процессора во время выполнения и кэширует собственный код в памяти во время выполнения.
Использование байт-кода в качестве промежуточного языка позволяет программам Java работать на любой платформе, на которой доступна виртуальная машина. Использование JIT-компилятора означает, что приложения Java после небольшой задержки во время загрузки и после того, как они «разогрелись», будучи полностью или в основном JIT-скомпилированными, как правило, работают примерно так же быстро, как и собственные программы. [26] [27] [28] Начиная с версии JRE 1.2, реализация JVM от Sun включает компилятор just-in-time вместо интерпретатора.
Хотя программы Java являются кроссплатформенными или платформенно-независимыми, код виртуальных машин Java (JVM), которые выполняют эти программы, не является таковым. Каждая поддерживаемая операционная платформа имеет свою собственную JVM.
Java Development Kit (JDK) — это дистрибутив технологии Java от Oracle Corporation . Он реализует спецификацию языка Java (JLS) и спецификацию виртуальной машины Java (JVMS) и предоставляет стандартную версию (SE) интерфейса прикладного программирования Java (API). Он является производным от поддерживаемого сообществом OpenJDK , которым управляет Oracle. [29] Он предоставляет программное обеспечение для работы с приложениями Java. Примерами включенного программного обеспечения являются виртуальная машина Java, компилятор, инструменты мониторинга производительности, отладчик и другие утилиты, которые Oracle считает полезными для программистов Java.
Oracle выпускает текущую версию программного обеспечения под лицензией Oracle No-Fee Terms and Conditions (NFTC). Oracle выпускает двоичные файлы для архитектуры x86-64 для операционных систем на базе Windows, macOS и Linux, а также для архитектуры aarch64 для macOS и Linux. Предыдущие версии поддерживали операционную систему Oracle Solaris и архитектуру SPARC .
Основная реализация JVMS от Oracle известна как HotSpot (виртуальная машина) .Java Runtime Environment (JRE), выпущенная Oracle, представляет собой свободно распространяемый дистрибутив программного обеспечения, содержащий автономную JVM (HotSpot), стандартную библиотеку Java ( Java Class Library ), инструмент настройки и — до его прекращения в JDK 9 — подключаемый модуль браузера. Это самая распространенная среда Java, устанавливаемая на персональных компьютерах в форм-факторе ноутбука и настольного компьютера . Мобильные телефоны , включая обычные телефоны и ранние смартфоны , которые поставляются с JVM, скорее всего, будут включать JVM, предназначенную для запуска приложений, ориентированных на Micro Edition платформы Java. Между тем, большинство современных смартфонов, планшетных компьютеров и других карманных ПК, на которых работают приложения Java, скорее всего, будут делать это с помощью поддержки операционной системы Android , которая включает в себя виртуальную машину с открытым исходным кодом, несовместимую со спецификацией JVM. (Вместо этого инструменты разработки Android от Google принимают программы Java в качестве входных данных и выходных байт-кодов Dalvik , которые являются собственным форматом входных данных для виртуальной машины на устройствах Android.) Последняя версия Critical Path Update JRE с соглашением Oracle BCL [30] была 8u201, а последняя версия Patch Set Update с той же лицензией была 8u202. [31] [32] Последняя реализация Oracle JRE, независимо от ее схемы лицензирования, была 9.0.4. [33] Начиная с Java Platform SE 9, вся платформа также была сгруппирована в модули . [34] Модуляризация реализаций Java SE позволяет разработчикам объединять свои приложения вместе со всеми используемыми ими модулями, вместо того, чтобы полагаться исключительно на наличие подходящей реализации Java SE на пользовательском устройстве. [35] [36] [37] [38]
В большинстве современных операционных систем (ОС) предоставляется большой объем повторно используемого кода для упрощения работы программиста. Этот код обычно предоставляется как набор динамически загружаемых библиотек , которые приложения могут вызывать во время выполнения. Поскольку платформа Java не зависит от какой-либо конкретной операционной системы, приложения не могут полагаться ни на одну из уже существующих библиотек ОС. Вместо этого платформа Java предоставляет полный набор собственных стандартных библиотек классов, содержащих многие из тех же повторно используемых функций, которые обычно встречаются в современных операционных системах. Большая часть системной библиотеки также написана на Java. Например, библиотека Swing рисует пользовательский интерфейс и сама обрабатывает события, устраняя множество тонких различий между тем, как разные платформы обрабатывают компоненты.
Библиотеки классов Java служат трем целям в платформе Java. Во-первых, как и другие стандартные библиотеки кода, библиотеки Java предоставляют программисту хорошо известный набор функций для выполнения общих задач, таких как ведение списков элементов или выполнение сложного разбора строк. Во-вторых, библиотеки классов предоставляют абстрактный интерфейс для задач, которые обычно сильно зависят от оборудования и операционной системы. Такие задачи, как сетевой доступ и доступ к файлам, часто тесно переплетены с отличительными реализациями каждой платформы. Библиотеки java.net
и java.io
реализуют уровень абстракции в собственном коде ОС, а затем предоставляют стандартный интерфейс для приложений Java для выполнения этих задач. Наконец, когда какая-либо базовая платформа не поддерживает все функции, ожидаемые приложением Java, библиотеки классов работают над изящной обработкой отсутствующих компонентов, либо путем эмуляции для предоставления замены, либо, по крайней мере, путем предоставления последовательного способа проверки наличия определенной функции.
Слово «Java» само по себе обычно относится к языку программирования Java, который был разработан для использования с платформой Java. Языки программирования обычно выходят за рамки фразы «платформа», хотя язык программирования Java был указан как основная часть платформы Java до Java 7. Поэтому язык и среда выполнения обычно считались единым целым. Однако в спецификации Java 7 была предпринята попытка более четко рассматривать язык Java и виртуальную машину Java как отдельные сущности, так что они больше не считаются единым целым. [39]
Третьи стороны создали много компиляторов или интерпретаторов , ориентированных на JVM. Некоторые из них предназначены для существующих языков, а другие — для расширений языка Java. К ним относятся:
Успех Java и ее концепции write once, run anywhere привел к другим подобным усилиям, в частности, к .NET Framework , появившемуся с 2002 года, который включает в себя многие успешные аспекты Java. .NET был создан с нуля для поддержки нескольких языков программирования, в то время как платформа Java изначально была создана для поддержки только языка Java, хотя с тех пор для JVM было создано много других языков. Как и Java, языки .NET компилируются в байт-код и выполняются Common Language Runtime (CLR), которая по своему назначению похожа на JVM. Как и JVM, CLR обеспечивает управление памятью посредством автоматической сборки мусора и позволяет байт-коду .NET выполняться на нескольких операционных системах.
.NET включал в себя Java-подобный язык, сначала названный J++ , затем названный Visual J# , который был несовместим со спецификацией Java. Он был прекращен в 2007 году, а его поддержка закончилась в 2015 году.
Спецификация JVM дает разработчикам много свободы в отношении деталей реализации. Начиная с Java 1.3, JRE от Oracle содержит JVM под названием HotSpot. Она была разработана как высокопроизводительная JVM.
Для ускорения выполнения кода HotSpot использует компиляцию just-in-time. Для ускорения выделения объектов и сборки мусора HotSpot использует generational heap.
Куча виртуальной машины Java — это область памяти, используемая JVM для динамического распределения памяти . [41]
В HotSpot куча делится на поколения :
Постоянная генерация (или permgen ) использовалась для определений классов и связанных метаданных до Java 8. Постоянная генерация не была частью кучи. [42] [43] Постоянная генерация была удалена из Java 8. [44]
Первоначально не было постоянной генерации, а объекты и классы хранились вместе в одной области. Но поскольку выгрузка классов происходит гораздо реже, чем собираются объекты, перемещение структур классов в определенную область позволило значительно улучшить производительность. [42]
Java JRE установлена на большом количестве компьютеров. Конечные пользователи с устаревшей версией JRE, таким образом, уязвимы для многих известных атак. Это привело к широко распространенному мнению, что Java изначально небезопасна. [45] Начиная с Java 1.7, JRE от Oracle для Windows включает функцию автоматического обновления.
До прекращения поддержки подключаемого модуля браузера Java любая веб-страница могла потенциально запустить апплет Java, который предоставлял легкодоступную поверхность атаки для вредоносных веб-сайтов. В 2013 году Лаборатория Касперского сообщила, что подключаемый модуль Java был методом выбора для компьютерных преступников. Эксплойты Java включены во многие пакеты эксплойтов, которые хакеры развертывают на взломанных веб-сайтах. [46] Апплеты Java были удалены в Java 11, выпущенной 25 сентября 2018 года.
Платформа и язык Java начинались как внутренний проект в Sun Microsystems в декабре 1990 года, предоставляя альтернативу языкам программирования C++/ C . Инженер Патрик Нотон все больше разочаровывался в состоянии интерфейсов прикладного программирования (API) Sun C++ и C, а также в том, как организация управляла проектом NeWS . Нотон сообщил Скотту Макнили о своем плане покинуть Sun и перейти в NeXT ; Макнили попросил его притвориться Богом и отправить ему электронное письмо с объяснением того, как исправить ситуацию в компании. Нотон задумал создать небольшую команду, которая могла бы работать автономно, без бюрократии, которая тормозила другие проекты Sun. Макнили переслал сообщение другим важным людям в Sun, и проект Stealth начался. [47]
Stealth Project вскоре был переименован в Green Project , а к Naughton присоединились Джеймс Гослинг и Майк Шеридан. Вместе с другими инженерами они начали работу в небольшом офисе на Sand Hill Road в Менло-Парке, Калифорния . Они стремились разработать новую технологию для программирования интеллектуальных приборов следующего поколения, которые, как ожидала Sun, предложат новые возможности. [48]
Первоначально команда рассматривала возможность использования C++, но отвергла его по нескольким причинам. Поскольку они разрабатывали встроенную систему с ограниченными ресурсами, они решили, что C++ требует слишком много памяти и что его сложность приводит к ошибкам разработчиков. Отсутствие в языке сборки мусора означало, что программистам приходилось вручную управлять системной памятью, что было сложной и подверженной ошибкам задачей. Команда также беспокоилась об отсутствии в языке C++ переносимых средств для обеспечения безопасности, распределенного программирования и многопоточности . Наконец, они хотели платформу, которая легко переносилась бы на все типы устройств.
Билл Джой задумал новый язык, объединяющий Mesa и C. В статье под названием Further он предложил инженерам Sun создать объектно-ориентированную среду на основе C++. Первоначально Гослинг пытался модифицировать и расширить C++ (предлагаемая разработка, которую он назвал «C++ ++ --»), но вскоре отказался от этого в пользу создания нового языка, который он назвал Oak , в честь дерева, которое росло прямо возле его офиса. [49]
К лету 1992 года команда смогла продемонстрировать части новой платформы, включая Green OS , язык Oak, библиотеки и аппаратное обеспечение. Их первая демонстрация, состоявшаяся 3 сентября 1992 года, была сосредоточена на создании устройства персонального цифрового помощника (PDA) под названием Star7 [1] , которое имело графический интерфейс и интеллектуального агента под названием «Duke» для помощи пользователю. В ноябре того же года Green Project был выделен в Firstperson , дочернюю компанию Sun Microsystems, полностью принадлежащую Sun Microsystems, и команда переехала в Пало-Альто, Калифорния . [50] Команда Firstperson была заинтересована в создании высокоинтерактивных устройств, и когда Time Warner выпустила запрос на предложение (RFP) на приставку , Firstperson изменила свою цель и ответила предложением на платформу приставки. Однако кабельная индустрия посчитала, что их платформа дает слишком много контроля пользователю, поэтому Firstperson проиграла их заявку SGI . Дополнительная сделка с The 3DO Company на приставку также не состоялась. Не сумев вызвать интерес в телевизионной индустрии, компания была возвращена в Sun.
В июне и июле 1994 года — после трех дней мозгового штурма с Джоном Гейджем (директором по науке Sun), Гослингом, Джоем, Нотоном, Уэйном Розингом и Эриком Шмидтом — команда перенацелила платформу на Всемирную паутину . Они чувствовали, что с появлением графических веб-браузеров, таких как Mosaic, Интернет может превратиться в ту же высокоинтерактивную среду, которую они представляли для кабельного телевидения. В качестве прототипа Нотон написал небольшой браузер WebRunner (названный в честь фильма « Бегущий по лезвию» ), переименованный в HotJava [48] в 1995 году.
Sun переименовала язык Oak в Java после того, как поиск по торговой марке показал, что Oak Technology использовала название Oak . [51] Sun установила цены на лицензии Java ниже себестоимости, чтобы завоевать долю рынка. [52] Хотя Java 1.0a стала доступна для загрузки в 1994 году, первый публичный релиз Java, Java 1.0a2 с браузером HotJava, вышел 23 мая 1995 года, о чем Гейдж объявил на конференции SunWorld . Сопровождая объявление Гейджа, Марк Андрессен , исполнительный вице-президент Netscape Communications Corporation , неожиданно объявил, что браузеры Netscape будут включать поддержку Java. 9 января 1996 года Sun Microsystems сформировала группу JavaSoft для разработки технологии. [53]
Хотя так называемые Java-апплеты для веб-браузеров больше не являются самым популярным применением Java (например, они больше используются на стороне сервера) или самым популярным способом запуска кода на стороне клиента (JavaScript стал более популярным), по-прежнему возможно запускать Java (или другие языки JVM, такие как Kotlin) в веб-браузерах, даже после того, как поддержка JVM в них была прекращена, например, с помощью TeaVM .
13 ноября 2006 года компания Sun Microsystems сделала большую часть своей реализации Java доступной под лицензией GNU General Public License (GPL). [54] [55]
Язык Java претерпел несколько изменений с момента выпуска JDK ( Java Development Kit ) 1.0 23 января 1996 года, а также многочисленные дополнения классов и пакетов к стандартной библиотеке . Начиная с J2SE 1.4 Java Community Process (JCP) управлял развитием языка Java. JCP использует запросы спецификации Java (JSR) для предложения и указания дополнений и изменений в платформе Java. Спецификация языка Java (JLS) определяет язык; изменения в JLS управляются в соответствии с JSR 901. [56]
Sun выпустила JDK 1.1 19 февраля 1997 года. Основные дополнения включали обширную переработку модели событий Abstract Window Toolkit (AWT), добавление в язык внутренних классов , JavaBeans и Java Database Connectivity (JDBC).
J2SE 1.2 (8 декабря 1998 г.) — кодовое имя Playground . Этот и последующие выпуски вплоть до J2SE 5.0 были переименованы в Java 2 , а название версии «J2SE» ( Java 2 Platform, Standard Edition ) заменило JDK, чтобы отличать базовую платформу от J2EE ( Java 2 Platform, Enterprise Edition ) и J2ME ( Java 2 Platform, Micro Edition ). Основные дополнения включали рефлексию , фреймворк коллекций , Java IDL ( реализация языка описания интерфейсов для взаимодействия с CORBA ) и интеграцию графического API Swing в основные классы. Был выпущен подключаемый модуль Java , и впервые JVM от Sun была оснащена компилятором JIT .
J2SE 1.3 (8 мая 2000 г.) – Кодовое имя Kestrel . Среди заметных изменений можно отметить объединение HotSpot JVM (HotSpot JVM впервые был выпущен в апреле 1999 г. для J2SE 1.2 JVM), JavaSound, Java Naming and Directory Interface (JNDI) и Java Platform Debugger Architecture (JPDA).
J2SE 1.4 (6 февраля 2002 г.) — кодовое имя Merlin . Это был первый выпуск платформы Java, разработанный в рамках Java Community Process как JSR 59. [57] Основные изменения включали регулярные выражения, смоделированные по образцу Perl , цепочку исключений , интегрированный XML- анализатор и процессор XSLT ( JAXP ), а также Java Web Start .
J2SE 5.0 (30 сентября 2004 г.) – Кодовое имя Tiger . Первоначально он имел номер 1.5, который до сих пор используется в качестве внутреннего номера версии. [58] Разработанный в соответствии с JSR 176, Tiger добавил несколько важных новых языковых функций, включая цикл for-each , generics , autoboxing и var-args . [59]
Java SE 6 (11 декабря 2006 г.) — кодовое имя Mustang . Он был связан с менеджером баз данных и облегчал использование языков сценариев с JVM (например, JavaScript с использованием движка Rhino от Mozilla ). Начиная с этой версии, Sun заменила название «J2SE» на Java SE и убрала «.0» из номера версии. [60] Другие важные изменения включают поддержку подключаемых аннотаций ( JSR 269 ), множество улучшений графического интерфейса , включая собственные улучшения пользовательского интерфейса для поддержки внешнего вида и поведения Windows Vista , а также улучшения архитектуры отладчика платформы Java (JPDA) и интерфейса инструментов JVM для лучшего мониторинга и устранения неполадок.
Java SE 7 (28 июля 2011 г.) – Кодовое имя Dolphin . Эта версия разработана в соответствии с JSR 336. [61] Она добавила много небольших языковых изменений, включая строки в switch, try-with-resources и вывод типа для создания универсального экземпляра. JVM была расширена поддержкой динамических языков, в то время как библиотека классов была расширена, среди прочего, фреймворком join/fork, [62] улучшенной новой библиотекой ввода-вывода файлов и поддержкой новых сетевых протоколов, таких как SCTP . Обновление Java 7 Update 76 было выпущено в январе 2015 г. со сроком действия 14 апреля 2015 г. [63]
В июне 2016 года, после последнего публичного обновления Java 7, [64] было объявлено о « удалённо эксплуатируемых » ошибках безопасности в Java 6, 7 и 8. [16]
Java SE 8 (18 марта 2014 г.) – Кодовое имя Kenai . Среди заметных изменений – поддержка лямбда-выражений ( замыканий ) и методов по умолчанию на уровне языка, среда выполнения JavaScript Project Nashorn, новый API даты и времени, вдохновленный Joda Time, и удаление PermGen. Эта версия официально не поддерживается на платформе Windows XP , [65] но, как известно, работает там. Таким образом, из-за окончания жизненного цикла Java 7 это рекомендуемая версия для пользователей XP. Ранее для Windows XP SP3 был описан только неофициальный метод ручной установки. Он относится к JDK8, платформе разработки для Java, которая также включает полностью функционирующую среду выполнения Java . [66] Java 8 поддерживается в Windows Server 2008 R2 SP1, Windows Vista SP2 и Windows 7 SP1, Ubuntu 12.04 LTS и выше (и некоторых других ОС). [67]
Java SE 9 и 10 имеют более высокие системные требования, то есть Windows 7 или Server 2012 (и минимальный сертифицированный веб-браузер повышен до Internet Explorer 11 или других веб-браузеров), а Oracle отказалась от 32-разрядной совместимости для всех платформ, то есть только « 64-разрядные виртуальные машины Java (JVM)» от Oracle сертифицированы». [68]
Java SE 11 LTS был выпущен в сентябре 2018 года, став первым выпуском LTS с момента принятия модели быстрого выпуска , начиная с версии 9. Впервые OpenJDK 11 представляет собой полный исходный код для платформы Java под лицензией GNU General Public License, и хотя Oracle по-прежнему лицензирует его с помощью дополнительной проприетарной лицензии, нет никаких различий в коде или модулей, уникальных для версии с проприетарной лицензией. [69] Функции Java 11 включают две новые реализации сборщика мусора, Flight Recorder для отладки глубоких проблем, новый HTTP-клиент, включая поддержку WebSocket . [70]
Java SE 12 была выпущена в марте 2019 года. [71]
Java SE 13 была выпущена в сентябре 2019 года. [72]
Java SE 14 была выпущена в марте 2020 года. [73]
Java SE 15 была выпущена в сентябре 2020 года.
Java SE 16 была выпущена в марте 2021 года.
Java SE 17 LTS была выпущена в сентябре 2021 года.
Java SE 18 была выпущена в марте 2022 года.
Java SE 19 вышла в сентябре 2022 года.
Java SE 20 была выпущена в марте 2023 года.
Java SE 21 LTS выпущена в сентябре 2023 года.
Java SE 22 вышла в марте 2024 года.
Помимо языковых изменений, за эти годы были внесены значительные изменения в библиотеку классов Java, которая выросла с нескольких сотен классов в JDK 1.0 до более трех тысяч в J2SE 5.0. Развились совершенно новые API, такие как Swing и Java 2D , и многие из исходных классов и методов JDK 1.0 были объявлены устаревшими (из них некоторые «окончательно устаревшими»), например, связанные с завершением. [74]
По крайней мере один очень редко используемый API (для потоковой обработки) был удален из Java 22. [75] [76]
Текущая Java поддерживается в 64-битной Windows 10 (и Server 2016) и более поздних версиях, 64-битной macOS 13.x и более поздних версиях, а также 64-битной Linux (например, Oracle Enterprise Linux). Другие не поддерживаются Oracle (для сборки, но могут поддерживаться IBM, SAP и т. д.), хотя известно, что они работают, например, AIX, Ubuntu, RHEL и Alphine/ musl . Поддержка 32-битной Windows устарела, начиная с Java 22 (и 32-битная JVM больше не собирается без нестандартных параметров).
По данным Oracle, в 2010 году Java Runtime Environment была обнаружена на более чем 850 миллионах ПК. [ 77] Microsoft не включала Java Runtime Environment (JRE) в свои операционные системы с тех пор, как Sun Microsystems подала в суд на Microsoft за добавление специфичных для Windows классов в связанную Java Runtime Environment и за предоставление новых классов через Visual J++ . [ требуется ссылка ] Apple больше не включает Java Runtime в OS X , начиная с версии 10.7 , но система предлагает пользователю загрузить и установить ее при первом запуске приложения, требующего JRE. [ требуется ссылка ] Многие дистрибутивы Linux включают OpenJDK Runtime в качестве виртуальной машины по умолчанию, что устраняет необходимость загрузки фирменной Oracle JRE. [78]
Некоторые приложения Java довольно широко используются на настольных компьютерах, включая интегрированные среды разработки NetBeans и Eclipse , а также клиенты обмена файлами, такие как LimeWire и Vuze . Java также используется в среде математического программирования MATLAB , как для визуализации пользовательского интерфейса , так и в качестве части базовой системы. Java обеспечивает кроссплатформенный пользовательский интерфейс для некоторых высокопроизводительных приложений для совместной работы, таких как Lotus Notes .
Oracle планирует сначала прекратить поддержку отдельно устанавливаемого плагина браузера Java из Java Runtime Environment в JDK 9, а затем полностью удалить его из будущего выпуска, заставив веб-разработчиков использовать альтернативную технологию. [79]
Дюк — талисман Явы . [80]
Когда Sun объявила, что Java SE и Java ME будут выпущены под лицензией свободного программного обеспечения ( GNU General Public License ), они одновременно выпустили графику Duke под свободной лицензией BSD . [81] Новая личность Duke создается каждый год. [82] Например, в июле 2011 года «Future Tech Duke» включал в себя больший нос, реактивный ранец и синие крылья. [83]
Исходный код реализаций Java от Sun (т. е. фактическая эталонная реализация) был доступен в течение некоторого времени, но до недавнего времени [84] условия лицензии строго ограничивали то, что можно было сделать с ним без подписания (и, как правило, оплаты) контракта с Sun. Таким образом, эти условия не удовлетворяли требованиям ни Open Source Initiative , ни Free Software Foundation , чтобы считаться открытым исходным кодом или свободным программным обеспечением, и Sun Java, следовательно, была проприетарной платформой. [85]
В то время как несколько сторонних проектов (например, GNU Classpath и Apache Harmony ) создали частичные реализации Java свободного программного обеспечения , большой размер библиотек Sun в сочетании с использованием методов чистой комнаты означал, что их реализации библиотек Java (компилятор и виртуальная машина сравнительно малы и хорошо определены) были неполными и не полностью совместимыми. Эти реализации также имели тенденцию быть гораздо менее оптимизированными, чем у Sun. [ необходима цитата ]
На конференции JavaOne 2006 компания Sun объявила , что Java станет бесплатным программным обеспечением с открытым исходным кодом , [86] а 25 октября 2006 года на конференции Oracle OpenWorld Джонатан И. Шварц заявил, что компания собирается объявить о выпуске базовой платформы Java в качестве бесплатного программного обеспечения с открытым исходным кодом в течение 30–60 дней. [87]
Sun выпустила виртуальную машину Java HotSpot и компилятор как свободное программное обеспечение под лицензией GNU General Public License 13 ноября 2006 года, пообещав, что остальная часть JDK (включая JRE) будет размещена под лицензией GPL к марту 2007 года («за исключением нескольких компонентов, которые Sun не имеет права публиковать в форме распространяемого исходного кода под лицензией GPL»). [88] По словам Ричарда Столлмана , это означало бы конец «ловушки Java». [89] Марк Шаттлворт назвал первое пресс-релиз «настоящей вехой для сообщества свободного программного обеспечения ». [90]
Sun опубликовала исходный код библиотеки классов под лицензией GPL 8 мая 2007 года, за исключением некоторых ограниченных частей, которые были лицензированы Sun у третьих лиц, не желавших, чтобы их код был выпущен под лицензией свободного программного обеспечения и открытого исходного кода. [91] Некоторые из обремененных частей оказались довольно ключевыми частями платформы, такими как рендеринг шрифтов и 2D-растеризация, но позже они были опубликованы Sun как открытые исходные коды (см. Библиотека классов OpenJDK ).
Целью Sun было заменить части, которые остаются проприетарными и с закрытым исходным кодом, альтернативными реализациями и сделать библиотеку классов полностью свободной и с открытым исходным кодом. Тем временем сторонний проект под названием IcedTea создал полностью свободный и очень удобный JDK, заменив обремененный код либо заглушками, либо кодом из GNU Classpath . Однако с тех пор OpenJDK стал собираемым без обремененных частей (из OpenJDK 6 b10 [92] ) и стал средой выполнения по умолчанию для большинства дистрибутивов Linux. [93] [94] [95] [96]
В июне 2008 года было объявлено, что IcedTea 6 (как упакованная версия OpenJDK в Fedora 9 ) прошла тесты Technology Compatibility Kit и может претендовать на звание полностью совместимой реализации Java 6. [97]
Поскольку OpenJDK распространяется под лицензией GPL, можно распространять пользовательскую версию JRE непосредственно с программными приложениями [98] [99], вместо того чтобы требовать от конечного пользователя (или его системного администратора) самостоятельной загрузки и установки правильной версии фирменной Oracle JRE на каждую из своих систем.
В большинстве случаев поддержка Java не нужна в веб-браузерах, и эксперты по безопасности рекомендуют не запускать ее в браузере, если это не является абсолютно необходимым. [100] Было высказано предположение [ кем? ] , что если Java требуется для нескольких веб-сайтов, пользователи должны иметь отдельную установку браузера специально для этих сайтов. [ необходима ссылка ]
Когда в Java 5.0 были добавлены дженерики , уже существовал большой фреймворк классов (многие из которых уже устарели ), поэтому дженерики были выбраны для реализации с использованием стирания, чтобы обеспечить совместимость миграции и повторное использование этих существующих классов. Это ограничило возможности, которые могли быть предоставлены этим дополнением по сравнению с некоторыми другими языками. [101] [102] Добавление подстановочных знаков типов сделало Java ненадежной. [103]
В Java отсутствуют собственные типы беззнаковых целых чисел . Беззнаковые данные часто генерируются из программ, написанных на языке C , и отсутствие этих типов препятствует прямому обмену данными между C и Java. Большие беззнаковые числа также используются во многих областях числовой обработки, включая криптографию, что может сделать Java менее удобным для использования в этих задачах. [104] Хотя эту проблему можно частично обойти с помощью кода преобразования и использования более крупных типов данных, это делает использование Java громоздким для обработки беззнаковых данных. В то время как 32-битное целое число со знаком может использоваться для хранения 16-битного беззнакового значения с относительной легкостью, 32-битное беззнаковое значение потребует 64-битного знакового целого числа. Кроме того, 64-битное беззнаковое значение не может быть сохранено с использованием любого целочисленного типа в Java, поскольку в языке Java не существует типа больше 64 бит. Если абстрагироваться с помощью функций, вызовы функций становятся необходимыми для многих операций, которые являются собственными для некоторых других языков. В качестве альтернативы можно использовать целые числа со знаком Java для эмуляции целых чисел без знака того же размера, но это требует детального знания сложных побитовых операций. [105]
Хотя арифметика с плавающей точкой Java в значительной степени основана на IEEE 754 ( Стандарт двоичной арифметики с плавающей точкой ), некоторые функции не поддерживаются даже при использовании strictfp
модификатора, такие как флаги исключений и направленные округления — возможности, предписанные стандартом IEEE 754. Кроме того, типы с плавающей точкой повышенной точности, разрешенные в 754 и присутствующие во многих процессорах, не разрешены в Java. [106] [107]
В ранние дни Java (до того, как HotSpot VM была реализована в Java 1.3 в 2000 году) были некоторые критические замечания по поводу производительности. Тесты производительности обычно показывали, что Java примерно на 50% медленнее, чем C (язык, который компилируется в машинный код). [108] [109] [110]
Производительность Java существенно улучшилась по сравнению с ранними версиями. [26] Производительность JIT-компиляторов по сравнению с собственными компиляторами в некоторых оптимизированных тестах показала себя весьма схожей. [26] [27] [28]
Байт-код Java может быть интерпретирован виртуальной машиной во время выполнения или скомпилирован во время загрузки или выполнения в машинный код, который выполняется непосредственно на оборудовании компьютера. Интерпретация медленнее, чем машинное выполнение, а компиляция во время загрузки или выполнения имеет начальный штраф производительности для компиляции. Современные производительные реализации JVM используют подход компиляции, поэтому после начального времени запуска производительность эквивалентна машинному коду.
Платформа Java предоставляет архитектуру безопасности [111] , которая разработана, чтобы позволить пользователю запускать ненадежный байт-код в «песочнице» для защиты от вредоносного или плохо написанного программного обеспечения. Эта функция «песочницы» предназначена для защиты пользователя путем ограничения доступа к определенным функциям платформы и API, которые могут быть использованы вредоносным ПО , таким как доступ к локальной файловой системе, выполнение произвольных команд или доступ к сетям связи.
В последние годы исследователи обнаружили многочисленные уязвимости безопасности в некоторых широко используемых реализациях Java, включая Oracle, которые позволяют ненадежному коду обходить механизм песочницы, подвергая пользователей вредоносным атакам. Эти уязвимости затрагивают только приложения Java, которые выполняют произвольный ненадежный байт-код, например, подключаемые модули веб-браузеров, которые запускают Java-апплеты, загруженные с общедоступных веб-сайтов. Приложения, которым пользователь доверяет и имеет полный контроль над всем выполняемым кодом, не затрагиваются.
31 августа 2012 года Java 6 и 7 (обе поддерживались тогда) на Microsoft Windows, OS X и Linux были обнаружены с серьезной уязвимостью безопасности, которая позволяла осуществлять удаленную эксплуатацию путем простой загрузки вредоносной веб-страницы. [112] Позже было обнаружено, что Java 5 также имеет уязвимость. [113]
10 января 2013 года три компьютерных специалиста выступили против Java, заявив Reuters , что она небезопасна и что людям следует отключить Java. Хайме Бласко, менеджер лабораторий AlienVault Labs, заявил, что «Java — это беспорядок. Она небезопасна. Вам нужно отключить ее». [114] Эта уязвимость затрагивает Java 7 , и неясно, затрагивает ли она Java 6 , поэтому потребителям предлагается отключить ее. [115] [116] Оповещения безопасности от Oracle сообщают о графиках критических исправлений безопасности для Java. [117]
14 января 2013 года эксперты по безопасности заявили, что обновление все еще не смогло защитить ПК от атак. [118] Эта уязвимость вызвала ответ Министерства внутренней безопасности США, призывающего пользователей отключить или удалить Java. [17] Apple внесла Java в черный список в ограниченном порядке для всех компьютеров под управлением операционной системы OS X с помощью программы защиты от вирусов. [119]
В 2014 году, отвечая на недавние проблемы безопасности и уязвимости Java, блогер по безопасности Брайан Кребс призвал пользователей удалить как минимум плагин Java для браузера, а также все программное обеспечение. «Я с нетерпением жду мира без плагина Java (и не буду напоминать читателям о ежеквартальных обновлениях патчей), но, вероятно, пройдут годы, прежде чем различные версии этого плагина будут в основном удалены из систем конечных пользователей по всему миру». [120] «Когда-то многообещающий, он изжил себя в браузере и стал кошмаром, который радует киберпреступников за счет пользователей компьютеров». [121] «Я думаю, что каждый должен удалить Java со всех своих ПК и Mac, а затем тщательно подумать, нужно ли ему добавлять ее обратно. Если вы типичный домашний пользователь, вы, вероятно, сможете обойтись без него. Если вы корпоративный пользователь, у вас может не быть выбора». [122]
Распространяемая Oracle среда выполнения Java имеет историю объединения спонсируемого программного обеспечения, которое должно быть установлено по умолчанию во время установки и во время обновлений, которые выпускаются примерно раз в месяц. Сюда входит « панель инструментов Ask.com », которая перенаправляет поиск браузера на рекламу, и «McAfee Security Scan Plus». [123] Эти предложения можно заблокировать с помощью настройки в панели управления Java, хотя это не очевидно. Эта настройка находится на вкладке «Дополнительно» в панели управления Java под заголовком «Разное», где опция помечена как опция для подавления «спонсорских предложений».
Java еще не выпустила автоматическое обновление, которое не требует вмешательства пользователя и прав администратора [124] в отличие от Google Chrome [125] и Flash player. [126]
{{cite web}}
: CS1 maint: архивная копия как заголовок ( ссылка ){{cite web}}
: CS1 maint: архивная копия как заголовок ( ссылка )«Юристы сказали нам, что мы не можем использовать название «OAK», потому что [оно уже было зарегистрировано как торговая марка] Oak Technologies», — сказал Фрэнк Йеллин, старший инженер Sun. «Поэтому был проведен мозговой штурм, чтобы придумать идеи для нового названия».
«Цена ниже нашей себестоимости», — говорит Шмидт. «Это приводит к потере денег в лицензионном бизнесе в обозримом будущем. Это стратегическая инвестиция в долю рынка».
Поддерживается только режим X.org.Режим
Wayland
не поддерживается.
Java работает на более чем 850 миллионах персональных компьютеров по всему миру и на миллиардах устройств по всему миру, включая мобильные устройства и телевизоры.