/p>
} exception_table [exception_table_length];
u2 attributes_count;
attribute_info attributes [attributes_count] ;
}
Тут:
В· attribute_name_index, attribute_length - стандартні для будь-якого атрибуту поля, що описують його тип і розмір;
В· max_stack - граничний розмір стека операндов для методу;
В· max_locals - гранична кількість локальних змінних методу (включаючи формальні параметри);
В· code_length - розмір байт-коду метода в байтах;
В· code - власне кажучи, байт-код;
В· exception_table_length - кількість захищених блоків;
В· exception_table - таблиця захищених блоків (Обробників виключень). Кожна її запис має такі поля:
o start_pc - індекс початку захищеного блоку в масиві байт-коду,
o end_pc - індекс кінця захищеного блоку,
o handler_pc - індекс початку обробника,
o catch_type - тип оброблюваного винятку (Індекс у Constant Pool) або 0 для блоку try ... finally;
В· attributes_count - Число атрибутів;
В· attributes - атрибути коду методу. Можуть використовуватися стандартні атрибути LineNumberTable і LocalVariableTable, містять зневадження. br/>В
Робота JVM
При запуску JVM в якості параметрів їй передаються ім'я класу, з методу main якого буде розпочато виконання програми, а також аргументи командного рядка програми. Спочатку завантажується вказаний клас. Інші класи, використовувані в програмі, завантажуються під час першого звернення до них. Процес завантаження класу складається з декількох етапів:
В· власне завантаження файлу класу (loading). Типово здійснюється за допомогою класу ClassLoader із стандартної бібліотеки Java, проте можна використовувати користувальницький завантажувач для зміни способу пошуку файлу;
В· зв'язування (Linking). Складається з трьох стадій:
o перевірка (Verification) на правильність формату файлу класу і коректність байт-коду (наприклад, на відсутність переходів на середину інструкції),
o підготовка (Preparation) - виділення пам'яті для статичних полів класу і заповнення їх нульовими значеннями,
o дозвіл імен (resolution);
В· ініціалізація (Initialization) статичних даних початковими значеннями. Включає виклик методу , якщо він присутній у класі. p> Програма, виконувана JVM, може мати кілька потоків виконання. Реалізація багатопоточності залежить від використовуваного апаратного забезпечення і може бути різною - різні потоки можуть виконуватися на різних процесорах або їм можуть виділятися кванти часу на одному процесорі. JVM має ряд засобів для синхронізації роботи потоків і захисту поділюваних ними даних. Найважливішим з них є механізм блокувань (locks), підтримуваний на рівні системи команд JVM. Кожен об'єкт має асоційований з ним В«замокВ» (lock). Якщо один з потоків В«закривВ» цей В«ЗамокВ», то жоден інший потік не зможе також його В«закритиВ» до тих пір, поки перший потік його не "відкриєВ».
JVM визначає кілька віртуальних областей пам'яті, які вона використовує при своїй роботі:
В· регістр PC (program counter), який вказує на поточну позицію виконання в методі. Кожен потік програми має свій регістр PC;
В· стек. Кожен потік має свій власний стек. При вході в метод на вершині стека створюється фрейм, що містить локальні змінні методу і його стек операндів. Розмір саме цих областей вказується полями max_locals і max_stack атрибуту методу Code;
В· купа - область пам'яті, в якій динамічно розміщаються об'єкти класів і масиви. Пам'ять-під не використовуваних більше об'єктів (на що немає посилань) автоматично звільняється так званим складальником сміття;
В· область методів. До неї при завантаженні класів поміщаються байт-код методів, різна інформація про методи і полях. Область методів також містить області констант часу виконання, які зберігають вміст constant pool із завантажених класів;
В· стеки для native-методів.
Розміщення і представлення цих областей у фізичній пам'яті може бути різним у різних реалізаціях JVM.
JVM є стекової машиною. Більшість з команд JVM виконують одну з таких дій:
В· зчитують значення з змінної або поля і поміщають його на вершину стека,
В· зберігають значення з вершини стека в змінній або поле,
В· виконують ті чи інші дії над значеннями, взятими з вершини стека, і записують результуюче значення (якщо воно є) на вершину стека,
В· виконують перехід на команду з заданим зсувом щодо поточного значення регістра PC безумовно або залежно від значень, прочитаних з вершини стека.
Будь-яке читання з стека операндов призводить до видалення з нього прочитаного значення. Розмір стека операндів, що указується як max_stack, розраховується наступним чином: зн...