1. Основные понятия
Каждая программа Java будет генерировать процесс Java. Каждый процесс Java может содержать один или несколько потоков. Каждый процесс Java соответствует уникальному экземпляру JVM, каждый экземпляр JVM соответствует куче, и каждый поток имеет свой собственный частный стек. Все экземпляры классов (то есть объектов) или массивов (ссылка на сам массив, а не ссылки), созданные процессом, помещаются в кучу и разделяются всеми потоками процесса. Выделенная память кучи в Java автоматически инициализируется, то есть при распределении памяти по объекту переменные в объекте будут инициализированы. Хотя пространство хранения всех объектов в Java выделяется в куче, ссылка на этот объект выделяется в стеке, то есть, когда объект создается, память выделяется в куче и стеке. Память, выделенная в куче, фактически сохраняет сам созданный объект, в то время как память, выделенная в стеке, хранит только ссылки на объект кучи. Когда выйдет новая локальная переменная, пространство выделяется в пространстве стека и в пространстве кучи. Когда локальный жизненный цикл заканчивается, пространство стека сразу же перерабатывается, а область пространства кучи ждет переработки GC.
Конкретная концепция: память о JVM можно разделить на три области: куча, стек и область метода (метод, также называемый статической областью):
Область стека:
1. Все сохраненные являются объектами, и каждый объект содержит информацию, соответствующую ему (цель класса - получить инструкции по работе);
2. JVM имеет только одну область кучи (куча) и разделяется всеми потоками. Куча не хранит основные типы и ссылки на объекты, а только сам объект и сам массив;
Область стека:
1. Каждый поток содержит область стека, которая сохраняет только ссылки на сам тип основных данных и пользовательские объекты;
2. Данные (примитивный тип и ссылка на объект) в каждом стеке являются частными и не могут быть доступны другими стеками;
3. стек разделен на 3 части: базовая область переменной типа, контекст среды выполнения и область инструкции по эксплуатации (хранение инструкции по эксплуатации);
Метод зона (статическая область):
1. Общаясь всеми потоками. Область метода содержит все классы (класс относится к исходному коду класса. Чтобы создать объект класса, код класса должен быть загружен в область метода и инициализированные) и статические переменные.
2. Область метода содержит элементы, которые всегда уникальны во всей программе, такие как классовые и статические переменные.
2. Пример демонстрации
Appmain.java
Public Class Appmain // При запуске JVM помещает весь код Appmain в область метода {public static void main (string [] args) // Сам основной метод помещается в область метода. {Образец Test1 = Новая выборка ("Test 1"); // test1 - это ссылка, поэтому поместите в область стека, образец - это пользовательский объект, который следует размещать в куче. Образец Test2 = Новый образцы («Тест 2»); test1.printname (); test2.printname (); }} Пример открытого класса // При запуске JVM помещает всю информацию AppMain в область метода { /** Пример имени* /Private String name; // После нового экземпляра примера ссылка на имя помещается в область стека, имя соответствующего строкового объекта помещается в Heap/** Constructor*/public Sample (String name) {this .name = name; } /** output* /public void printName () // Когда объект нет, метод печати помещается в область метода вместе с классом образца. {System.out.println (имя); }}При запуске программы сначала запустите процесс виртуальной машины Java. Этот процесс сначала находит файл appmain.class из ClassPath, считывает двоичные данные в файле, а затем хранит информацию класса класса AppMain в области метода области данных времени выполнения. Это процесс загрузки класса Appmain.
Затем виртуальная машина Java обнаруживает байт -код Main () метода класса Appmain в области метода и начинает выполнять его инструкции. Первым утверждением этого метода Main () является:
Кода -копия выглядит следующим образом:
Образец Test1 = Новый образцы ("test1");
Процесс выполнения этого оператора:
1. Виртуальная машина Java обнаружила информацию о типовом классе выборки в области метода, но она не была найдена, поскольку класс выборки не был загружен в область метода (здесь можно увидеть, что внутренние классы в Java существуют отдельно, и в начале его не будут загружены с содержащим классом и не будут загружены до тех пор, пока она не будет использована). Виртуальная машина Java немедленно загружает пример класса и хранит информацию типа образца в области метода.
2. Виртуальная машина Java сначала выделяет память для нового экземпляра образца в области кучи и хранит адрес памяти в области метода, где информация типа пример класса хранится в памяти экземпляра образца.
3. В процессе JVM каждый поток будет иметь стек вызовов метода, который используется для отслеживания ряда процессов вызовов метода во время работы потока. Каждый элемент в стеке называется кадром стека. Всякий раз, когда поток вызывает метод, в стек методов будет выпущен новый кадр. Кадры здесь используются для хранения параметров метода, локальных переменных и временных данных во время операции.
4. test1 до "=" - переменная (ссылка на образцовый объект), определенная в методе Main (), поэтому она будет добавлена в стек вызовов метода Java основного потока, который выполняет метод main (). И «=» укажет на эту переменную Test1 на экземпляр образца в области кучи.
5. JVM продолжает создавать другой экземпляр образца в области кучи и добавляет переменную Test2 в стек вызовов метода основного метода, который указывает на новый экземпляр образца, созданный в области кучи.
6. JVM выполняет свой метод printName () по очереди. Когда виртуальная машина Java выполняет метод test1.printname (), виртуальная машина Java обнаруживает экземпляр образца в области кучи на основе ссылки, содержащейся с помощью локальной переменной Test1, а затем определяет информацию типа выборки в методе, основанную на ссылке, хранящемся с помощью экземпляра образца, тем самым получая Bytecode метода PrintName (), а затем выполняет метод print -method () метод print -print -print-).
Iii. Различать
Разница между кучей и стеком на языке Java:
1. Стептя и куча - это места, используемые Java для хранения данных в оперативной памяти. В отличие от C ++, Java автоматически управляет стеками и кучами, и программисты не могут настроить стеки или кучи напрямую.
2. Преимущество стека состоит в том, что скорость доступа быстрее, чем куча, уступая только регистрам, расположенным непосредственно в процессоре. Но недостатком является то, что размер и срок службы данных в стеке должен быть детерминированным и отсутствовать гибкость. Кроме того, данные стека могут быть переданы (введение ниже). Преимущество кучи состоит в том, что она может динамически распределять размер памяти, и срок службы не нужно сообщать компилятору заранее. Коллекционер мусора Java автоматически собирает данные, которые больше не используются. Но недостаток в том, что память должна быть динамически распределена во время выполнения, скорость доступа медленнее.
2 типа данных в Java:
Одним из них являются примитивные типы, с 8 категориями, а именно int, короткие, длинные, байт, поплавок, двойной, логический, чар (обратите внимание, что нет основного типа строки). Этот тип определения определяется формой, такой как int a = 3; длинный B = 255 л; и называется автоматической переменной. Автоматические переменные имеют буквальные значения, а не случаи классов, то есть они не являются ссылками на классы, и здесь нет класса. Например, int a = 3; Здесь A - это ссылка, указывающая на тип Int, указывающий на буквальное значение 3. Из -за размера и срока службы этих буквальных данных эти буквальные значения фиксируются в программном блоке, и значение поля исчезает после выходов блока программы) и существует в стеке для достижения скорости.
Стек имеет очень важную функцию: данные, которые существуют в стеке, могут быть переданы. Предположим, мы определяем одновременно: int a = 3; int b = 3; Компилятор сначала обрабатывает int a = 3; Сначала он создаст ссылку с переменной a в стеке, а затем выяснит, есть ли адрес с буквальным значением 3. Если он не найден, он откроет адрес с буквальным значением 3, а затем укажет A на адрес 3. Затем Process int b = 3; После создания эталонной переменной B, поскольку в стеке уже есть буквальное значение 3, B напрямую указывает на адрес 3. Таким образом, A и B оба указывают на 3 одновременно.
Эта ссылка на буквальные значения отличается от ссылки на объекты класса. Предполагая, что ссылки двух объектов класса указывают на объект одновременно, если одна ссылка объекта изменяет внутреннее состояние объекта, то другая эталонная переменная объекта немедленно отражает это изменение. Вместо этого изменение его значения с помощью буквальной ссылки не приведет к соответствующему изменению другого значения. Как и в приведенном выше примере, после того, как мы определим значения A и B, пусть A = 4; Затем B не будет равен 4 или равна 3. Внутри компилятора, когда встречается a = 4, он будет повторно поиск, есть ли буквальное значение 4 в стеке. Если нет, повторно откройте адрес для хранения значения 4; Если это уже существует, напрямую укажите А на этот адрес. Следовательно, изменение значения А не повлияет на значение b.
Другим типом являются данные класса упаковки, такие как целое число, строка, двойная и т. Д., Которые завершают соответствующие основные типы данных. Все эти данные класса существуют в куче. Java использует новый () оператор () для отображения компилятора и создает динамически только по мере необходимости во время выполнения, поэтому он более гибкий, но недостаток в том, что это занимает больше времени.
4. Резюме
Структура распределения памяти Java все еще очень ясна. Если вы хотите понять это тщательно, вы можете проверить книги, связанные с JVM. В Java самая проблемная вещь в распределении памяти - это объект String. Благодаря своему особому характеру многие программисты склонны к путанице. Я подробно объясню это в следующей статье.