Подтвердить что ты не робот

JAR файлы, разве они просто не раздуваются и не замедляют работу Java?

Хорошо, вопрос может казаться глупым, но я все равно спрашиваю его.

После долгих часов работы над запуском проекта Spring + BlazeDS я обнаружил, что у меня возникли проблемы с моим проектом в результате отсутствия правильных зависимостей для Spring и т.д. Были потеряны .jars из моей папки WEB-INF/lib, да, глупо меня.

Через некоторое время мне удалось получить все файлы .jar, где они принадлежат, и на них приходит колоссальный 12,5 МБ, и там их больше 30! Что касается меня, но это, вероятно, и, надеюсь, не стоит беспокоиться.

Как работает Java с точки зрения этих JAR файлов, они занимают довольно много места на жестком диске, принимая во внимание, что он сжал и скомпилировал исходный код. Таким образом, на самом деле можно быстро заполнить много оперативной памяти и в одно мгновение.

Мои вопросы:

Является ли Java загружать весь файл .jar в память, если скажем, например, что класс в том, что .jar создается? Что о вещах, которые в .jar никогда не используются.

Делать .jars как-то кэшировать, для оптимизации производительности приложений?

Когда загружается один .jar, я понимаю, что эта вещь сидит в памяти и доступна в нескольких HTTP-запросах (т.е. для срока службы экземпляра сервера), в отличие от PHP, где объекты создаются "на лету" с каждым запросом, верно ли это предположение?

При использовании Spring, я думаю, мне пришлось включить все эти fiddly.jars, разве мне не лучше просто использовать родную Java, скажем, по крайней мере, и решение ORM, такое как Hibernate?

До сих пор Spring просто занимал дополнительную настройку времени, дополнительное пространство на жестком диске, дополнительную память, потребление процессора, поэтому я обеспокоен тем, что инфраструктура будет стоить слишком большой производительности приложения, чтобы получить, например, IoC с моим сервером BlazeDS.

По-прежнему должен прийти ORM, модульная тестовая среда и биты и куски здесь и там. Это просто так легко раздуть проект быстро и безответственно легко.

Где я рисую линию?

4b9b3361

Ответ 1

"Загружает ли Java весь файл .jar в память, например, например, класс в том, что .jar создается экземпляр? Что относительно того, что в .jar который никогда не используется".

Нет, загрузчик классов загружает каждый файл .class по мере необходимости.

"Делаем .jars как-то кэшироваться, для оптимизированная производительность приложения?"

JAR - это как DLL (за исключением деталей о привязке к загрузке классов): они просто сжатые библиотеки .class файлов. Они не кэшируются: файлы .class загружаются в пермское пространство по мере необходимости.

"Когда загружается один .jar, я понимайте, что вещь сидит в памяти и доступно через несколько HTTP-запросов (т.е. для время жизни экземпляра сервера работает), в отличие от PHP, где объекты созданный" на лету "с каждым запросом, это предположение верно?"

Когда ваш сервер приложений загружает .class в perm perm, он доступен до тех пор, пока сервер работает и работает.

"При использовании Spring, я думаю, я должен был включать в себя все эти странные слова, не лучше ли мне просто с использованием родной Java, причем, по крайней мере, и решение ORM, такое как Hibernate?"

Нет, если вы думаете, что с помощью Spring вы что-то покупаете. Если вы не считаете, что анализ затрат/выгод вас одобряет, непременно используйте Spring. Но это не похоже на то, что вы делаете хороший анализ, если зависимости сдерживают вас.

"До сих пор Spring просто заняло дополнительное время конфигурирование, дополнительное пространство на жестком диске, дополнительная память, потребление процессора, поэтому я обеспокоен тем, что структура стоить слишком много приложений производительность, чтобы получить, например, IoC реализована с помощью моего BlazeDS сервер".

Вы не представляете, какова эффективность за использование Spring. Измерьте это, если вы считаете, что это проблема. Моя ставка заключается в том, что самая сложная проблема будет представлять код приложения или схема базы данных.

"До сих пор должен прийти ORM, подразделение испытательная рама и кусочки здесь и там. Это так просто быстро раздуть проект и безответственно легко".

Почему безответственно?

"Где я рисую линию?"

Во что бы то ни стало, напишите свое. Делайте все с нуля. У вас будет лучшее представление о том, что платформа покупает для вас и каковы реальные затраты, когда вы закончите.

Я добавлю следующее: люди в Spring напишут один из лучших кодов. Лучше всего, что вы или я напишем. Вы выбираете какую-либо структуру, потому что считаете, что получите лифтинг от использования кода, который был строго спроектирован, имеет более широкую аудиторию, был протестирован более тщательно. и лучше практически по всем меркам, чем то, что вы напишете сами. Я бы не позволил (по общему признанию) большому числу зависимостей удержать меня от его использования. Когда я развертываю на сервере приложений и выделяю 256 МБ ОЗУ на эту JVM, мне, конечно, все равно, если пространство вместимости потребляет 10% от этой суммы - пока не буду измерять, что это проблема.

Я думаю, что на самом деле происходит то, что вы предпочитаете писать PHP вместо Java. Это справедливая мысль, потому что многие думают, что использование динамических языков может предложить ценность над Java. Большинство сайтов все еще написаны на PHP, поэтому ваш скептицизм оправдан.

Я бы рекомендовал прототипировать вариант использования или два с Spring и без него и используя PHP. У вас будет лучшее представление о том, что сработает для вас после этого.

Ответ 2

Погрузчик классов должен загружать только те классы, которые ему нужны, и они остаются резидентными. Не беспокойтесь о 12 МБ. ОЗУ дешево. Объекты, которые вы создаете (в большом приложении), будут использовать гораздо больше памяти, чем загружаемые классы.

Короче говоря, не беспокойтесь об этом.:)

В IBM DeveloperWorks есть хорошая статья с заголовком "Демистификация проблем загрузки классов, часть 1: введение в инструменты загрузки и отладки классов"

Дополнительная точка. Когда дело доходит до стоимости, время разработки стоит намного больше, чем аппаратное обеспечение, поэтому, если Spring/Hibernate/WhateverTool помогает разработчику быстрее и проще создавать приложение, это стоит того какой бы ОЗУ не использовался.

Ответ 3

Если у вас возникли проблемы с управлением зависимостями, такой инструмент, как Maven или Ivy может помочь, хотя они имеют свои собственные кривые обучения. Они оба позволяют вам указать прямые зависимости и позволить инструменту вычислять и разрешать транзитивные зависимости.

Ответ 4

Несмотря на то, что загрузчик классов загружает классы по требованию, метаданные JAR, вероятно, будут loaaded загрузчиком классов, так как он должен иметь информацию о полностью классифицированных именах классов, которые являются частью JAR (требования к минимальному пространству). Когда требуемый classloader может быстро загрузить класс из этой информации.

Добавление большего количества JAR, вероятно, займет несколько КБ (<) дополнительного пространства (JAR-информация), но на самом деле не увеличит ваше PermGenSpace, если класс не требуется (требуется прямо или косвенно)

Таким образом, вы можете добавить дополнительные библиотеки, пока не будете ссылаться/загружать все ненужные классы (посредством использования: прямо или косвенно, включая статическое выполнение кода в классах).

Также PermGenSpace изолировано от памяти кучи (с точки зрения распределения физической памяти), хотя они работают вместе.

Ответ 5

Для некоторых из этих вопросов вам, вероятно, лучше всего смотреть исходный код в java.util.jar. Файлы JAR рассматриваются как тип ZIP файла (что имеет смысл, поскольку файлы JAR в основном представляют собой ZIP файлы с файлом манифеста), поэтому весь файл не загружается сразу.