Як Java зберігає дані в пам'яті?
Інформація в пості приведена на основі книги Еккель Б. Філософія Java (4-е видання)
Кожна мова програмування має свої засоби для роботи з даними в пам'яті. В Java ви звертаєтеся з усіма даними як з об'єктом. Ідентифікатор, яким ви маніпулюєте, насправді являє собою посилання на об'єкт.
Коли ви визначаєте посилання, бажано приєднати її до нового об'єкту. Зазвичай це робиться за допомогою ключового слова new. Фактично воно означає: "Створіть мені новий об'єкт". наприклад
Корисно чітко уявляти, що відбувається під час роботи програми, і зокрема, як дані розміщуються в пам'яті. Існує п'ять різних місць для зберігання даних
Регістри. Це найшвидше сховище, тому що дані зберігаються прямо всередині процесора. Однак кількість регістрів жорстко обмежена, тому регістри використовуються компілятором в міру необхідності. У вас, як програміста, немає прямого доступу до регістрів, ви не знайдете і найменших слідів їх підтримки в мові.
Стек. Ця область зберігання даних знаходиться в загальній оперативної пам'яті (RAM), але процесор надає прямий доступ до неї з використанням покажчика стека. Покажчик стека переміщається вниз для виділення пам'яті або вгору, щоб вона вийшла. Це надзвичайно швидкий і ефективний спосіб розміщення даних, по швидкості поступається тільки регістрів. Під час обробки програми компілятор Java повинен знати життєвий цикл даних, що розміщуються в стек. Це обмеження зменшує гнучкість ваших програм, тому, хоча деякі дані Java зберігаються в стеку (особливо посилання на об'єкти), самі об'єкти Java не поміщаються в стек.
Купа. Пул пам'яті загального призначення (знаходиться також в RAM), в якому розміщуються всі об'єкти Java. Перевага купи полягає в тому, що компілятору не обов'язково знати, як довго проіснують знаходяться там об'єкти. Таким чином, робота з купою дає значну перевагу в гнучкості. Коли вам потрібно створити об'єкт, ви пишете код з використанням new. і пам'ять виділяється з купи під час виконання програми. Звичайно, за гнучкість доводиться розплачуватися: виділення пам'яті з купи займає більше часу, ніж в стеці.
Постійне сховище. Значення констант часто вбудовуються прямо в код програми, так як вони незмінні. Іноді такі дані можуть розміщуватися в постійній пам'яті (ROM), якщо мова йде про "вбудованих" системах.
Зовнішнє сховище. Якщо дані зберігаються поза програмою, вони можуть існувати і тоді, коли вона не виконується. Два основних приклади: потокові об'єкти (streamed objects), в яких об'єкти представлені у вигляді потоку байтів, зазвичай використовуються для передачі на інші машини, і довгоживучі (persistent) об'єкти, які запам'ятовуються на диску і зберігають свій стан навіть після закінчення роботи програми. Особливістю цих видів зберігання даних є можливість переведення об'єктів в щось, що може бути збережено на іншому носії інформації, а потім відновлено у вигляді звичайного об'єкта, що зберігається в оперативній пам'яті. В Java організована підтримка легкого (lightweight) збереження стану, а такі механізми, як JDBC і Hibernate, надають більш досконалу підтримку збереження та вибірки інформації про об'єкти з баз даних.