куча и стек
Что касается проблемы кучи и стека, студенты, знакомые с C++, могут понять ее более четко, но, поскольку все объекты в Java находятся в куче, это может иногда сбивать с толку, например:
Зачем разделять кучу и стек?
В чем разница между кучей и стеком?
Почему куча совместно используется потоками, а не стеком?
Многие люди, немного знающие Java или хотя бы немного программирующие, знают, что память вообще делится на кучу и стек, стек связан системой, а кучей управляет сам программист,... балабала, в принципе любой базовый язык книга будет упоминать эти функции, но вы когда-нибудь задумывались, почему?
Зачем разделять кучу и стек
Причина различия между кучей и стеком определяется тем фактом, что программам требуются две разные характеристики памяти. В C++ есть два способа создать новый объект:статическое размещениеа такжединамическое размещение,
статическое размещение
Как правило, статическое размещение используется при инициализации объектов известного размера, таких какint a[10];
Если мы можем быть уверены, что массив равен 10, мы можем использовать его таким образом. Память, необходимая таким образом, существуетво время компиляцииможно определить, поэтому операционная система можетпредопределенныйПамять указанного размера предоставляется переменной и может быть автоматически освобождена после окончания жизненного цикла переменной.
динамическое размещение
Тем не менее, в некоторых сценариях может быть необходимо применить для памяти в соответствии с определенными условиями, такими какint* a =new int[count];
в то время как переменнаяcount
Это может быть файл конфигурации или значение, введенное пользователем вручную. В настоящее время операционная система больше не можетпредопределенныйразмер памяти и не выполняется до тех пор, покаnew int[count]
При использовании этой строки кода невозможно узнать размер выделяемой памяти, поэтому операционная система выделяет часть памяти для динамического выделения. И оговорено, что динамически выделяемой памятью должен управлять сам клиент.
Куча в Java
Как указано в спецификации JVM, все объекты в JVM хранятся в куче (кроме побегов памяти). Поэтому в Java нет статического выделения объектов, поэтому источник кучи и стека кажется очень естественным. Но вы должны понимать, что в операционной системе причина появления кучи и стека.
Разница между кучей и стеком
Теперь, когда вы знаете, почему нужно различать кучи и стеки, давайте рассмотрим различия между кучами и стеками.
-
Куча определяет размер памяти во время выполнения, а стек определяет размер памяти во время компиляции.
Причина упоминается в первом разделе, что является первоначальным намерением различать кучу и стек.
-
Память кучи управляется пользователем (управляется JVM в Java), а память стека будет автоматически освобождена.
-
Метод реализации стека принимает реализацию стека в структуре данных, которая имеет характеристики последовательности (LIFO), а куча представляет собой часть памяти.
-
Из-за того, как он реализован, стек намного быстрее, чем куча, с точки зрения скорости выделения. Выделение блока стековой памяти — это просто перемещение указателя
-
В JVM стек напрямую не используется программистом, и программист обычно работает с кучей.
-
Стек является потокоприватным, а куча совместно используется потоком.
Несмотря на то, что между кучей и стеком так много различий, эти различия определяются операционной системой, аппаратно они практически одинаковы.RAM
Почему куча совместно используется потоками, а не стеком?
В последнем пункте выше упоминалось, что стек является частным потоком, а куча - разделяемым потоком. Почему это? ? ?
На самом деле, это очень просто, чтобы решить проблему: связь между потоками.
Для достижения межпоточной связи в настоящее время существует два метода:
- обмен сообщениями
- Общая память
Общая памятьЭто то, что мы называем настройкой кучи для совместного использования между потоками, чтобы мы могли обмениваться данными через объекты в куче, чтобы другие потоки могли знать, что поток изменил определенные данные. Однако проблемы, вызванные этим, могут включать проблемы с безопасностью потоков и т. д., но преимущество этого заключается в том, чтоБыстрееа такжесохранить память, Java, C# и т. д. используют этот способ
обмен сообщениямиУ каждого потока есть собственное личное пространство данных. Когда требуется обмен потоками, один поток должен отображать определенное сообщение для другого потока. Это может сделать многопоточность более безопасной, но личное пространство потока и передача сообщений приводят к необходимости копировать одни и те же объекты. , переменные и т. д. для всех потоков и могут вызвать проблемы с эффективностью. Erlang и JoCaml взаимодействуют с помощью потоков передачи сообщений.
Уважайте успехи труда, перепечатывайте и указывайте оригинал
Справочная статья:
Why do threads share the heap space?
В чем разница между стеком и кучей?
What and where are the stack and heap?
Если вы считаете, что текст хороший, добро пожаловать в общедоступную учетную запись WeChat: Yiyou Java, время от времени публикуйте несколько статей о продвинутых Java, каждый день, спасибо за внимание.
![](https://s3.timeweb.com/newworld58-e1e8f297-7d39-4eff-9f5d-42281e40a914/UnderSkyWeb-ea8275ec1da4e724ee0055b021652ae6dbfbd84f109c63eda02db36952009ac566ba8909.png)