[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-java-core-chto-takoe-heap-i-stack-pamyat-v-java-kakaya-raznitsa-mezhdu-nimi":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":18,"progress":19,"seo":20},53,"chto-takoe-heap-i-stack-pamyat-v-java-kakaya-raznitsa-mezhdu-nimi",2,"java-core","Java Core","☕","Что такое Heap и Stack память в Java? Какая разница между ними?","Heap (куча) используется Java Runtime для выделения памяти под объекты и классы. Создание нового объекта также происходит в куче. Это же является областью работы сборщика мусора. Любой объект, созданный в куче, имеет глобальный доступ и на него могут ссылаться из любой части приложения.\n\nStack (стек) это область хранения данных также находящееся в общей оперативной памяти (RAM). Всякий раз, когда вызывается метод, в памяти стека создается новый блок, который содержит примитивы и ссылки на другие объекты в методе. Как только метод заканчивает работу, блок также перестает использоваться, тем самым предоставляя доступ для следующего метода.\nРазмер стековой памяти намного меньше объема памяти в куче. Стек в Java работает по схеме LIFO (Последний-зашел-Первый-вышел)\n\nРазличия между Heap и Stack памятью:\n+ Куча используется всеми частями приложения, в то время как стек используется только одним потоком исполнения программы.\n+ Всякий раз, когда создается объект, он всегда хранится в куче, а в памяти стека содержится лишь ссылка на него. Память стека содержит только локальные переменные примитивных типов и ссылки на объекты в куче.\n+ Объекты в куче доступны с любой точки программы, в то время как стековая память не может быть доступна для других потоков.\n+ Стековая память существует лишь какое-то время работы программы, а память в куче живет с самого начала до конца работы программы.\n+ Если память стека полностью занята, то Java Runtime бросает исключение `java.lang.StackOverflowError`. Если заполнена память кучи, то бросается исключение `java.lang.OutOfMemoryError: Java Heap Space`.\n+ Размер памяти стека намного меньше памяти в куче.\n+ Из-за простоты распределения памяти, стековая память работает намного быстрее кучи.\n\nДля определения начального и максимального размера памяти в куче используются `-Xms` и `-Xmx` опции JVM. Для стека определить размер памяти можно с помощью опции `-Xss`.","","junior",[15,16,17],"jvm","core","memory",[],null,{"title":21,"description":22,"ogTitle":21,"ogDescription":23,"keywords":24,"schemaAnswer":33,"featuredSnippetReady":34},"Heap и Stack память в Java: разница и особенности — Gymterview","Что такое Heap (куча) и Stack (стек) в Java, чем они отличаются. Хранение объектов, примитивов, ссылок. StackOverflowError и OutOfMemoryError.","Куча хранит объекты и доступна всему приложению, стек содержит локальные переменные и ссылки, работает по LIFO.",[25,26,27,28,29,30,31,32],"Heap","Stack","куча","стек","память Java","StackOverflowError","OutOfMemoryError","JVM","Heap (куча) используется для выделения памяти под объекты и классы, доступна всем частям приложения. Stack (стек) содержит локальные переменные примитивных типов и ссылки на объекты, работает по схеме LIFO и используется только одним потоком. Стек значительно меньше кучи и работает быстрее. При переполнении стека выбрасывается StackOverflowError, кучи — OutOfMemoryError.",true]