Ваш колега поняття не має, про що вони говорять.
Вашою найдорожчою операцією було б їх прослуховування . Вони витратили ваш час неправильно націливши вас на інформацію, яка застаріла більше десятиліття (станом на початкову дату була опублікована ця відповідь) , а також вам доведеться витрачати час на публікацію тут та дослідження правдивості в Інтернеті.
Сподіваємось, вони просто необізнано регенерують щось, що вони чули чи читали більше десяти років тому і не знають нічого кращого. Я б взяв все, що вони кажуть, як підозрюваного, це повинно бути добре відомим помилкою кожного, хто в будь-якому випадку не в курсі.
Все є об'єктом (крім primitives
)
Все, окрім примітивів ( int, long, double
тощо), є об'єктами на Java. Не можна уникнути створення об’єктів на Java.
Створення об’єктів у Java завдяки стратегіям розподілу пам'яті у більшості випадків швидше, ніж C ++, і для всіх практичних цілей порівняно з усім іншим у JVM можна вважати "безкоштовним" .
Ще наприкінці 1990-х на початку 2000-х років впровадження JVM мало певні результати у фактичному розподілі Об'єктів. Так не було принаймні з 2005 року.
Якщо ви налаштовуєтеся -Xms
на підтримку всієї пам'яті, необхідної для правильної роботи вашої програми, GC, можливо, ніколи не доведеться запускати та підмітати більшість сміття в сучасних реалізаціях GC, короткотривалі програми можуть взагалі ніколи не GC.
Він не намагається і максимізує вільний простір, який так чи інакше є червоною оселедець, але максимально збільшує продуктивність виконання. Якщо це означає, що JVM Heap майже 100% виділяється весь час, так і нехай буде. Безкоштовна купа пам’яті JVM нічого не дає тобі просто сидіти там.
Існує помилкова думка, що GC звільнить пам'ять до решти системи корисним способом, це абсолютно помилково!
Купа JVM не росте і не зменшується, так що на решту системи позитивно впливає вільна пам'ять у купі JVM . -Xms
виділяє ВСЕ, що зазначено при запуску, і його евристичністю є те, що ніколи реально не випускати будь-яку з цієї пам'яті назад в ОС для спільного використання з будь-якими іншими процесами ОС до тих пір, поки цей примірник JVM не завершиться повністю. -Xms=1GB -Xmx=1GB
виділяє 1 Гб оперативної пам’яті незалежно від того, скільки об’єктів фактично створено в даний момент часу. Є деякі параметри, які дозволяють звільнити відсотки пам'яті купи, але для всіх практичних цілей JVM ніколи не в змозі звільнити достатню кількість цієї пам'яті, щоб це коли-небудь відбулосятому жоден з інших процесів не може повернути цю пам'ять, тому решта системи не виграє і від того, щоб JVM Heap не був безкоштовним. RFE для цього було "прийнято" 29-НОВ-2006, але з цього приводу нічого не робилося. Така поведінка не вважається занепокоєнням нікого з авторитетів.
Існує помилкова думка, що створення багатьох невеликих короткотривалих об'єктів змушує JVM робити паузи протягом тривалих періодів часу, це також помилково
Поточні алгоритми ГК фактично оптимізовані для створення багатьох безлічі невеликих об'єктів, які є короткочасними, тобто в основному це 99% евристики для об'єктів Java у кожній програмі. Спроби об’єднання об'єднань фактично зроблять JVM ефективнішим у більшості випадків.
Єдині об'єкти, які сьогодні потребують об'єднання, - це об'єкти, які посилаються на обмежені ресурси, які є зовнішніми для спільного використання; Сокети, файли, підключення до бази даних тощо, і їх можна повторно використовувати. Регулярні об'єкти не можна об'єднати в тому ж сенсі, що і в мовах, які дозволяють вам отримати прямий доступ до місць пам'яті. Кешування об'єктів - це інша концепція, і це може бути, а може і не бути тим, що деякі люди наївно називають об'єднанням , ці два поняття - це не одне і те ж і не слід їх поєднувати.
Сучасні алгоритми GC не мають такої проблеми, оскільки вони не розміщуються за графіком, вони розміщують, коли потрібна вільна пам'ять певного покоління. Якщо купа досить велика, то ніякі угоди не відбуваються досить довго, щоб викликати паузи.
Динамічні мови, орієнтовані на об'єкти, навіть зараз днями б'ють С на обчислювальних тестах.