Отличаются ли куча / стек JVM от кучи / стек виртуального адресного пространства? - PullRequest
0 голосов
/ 16 января 2020

Память разделена на «сегменты», называемые кучей, стеком, bss, данными и текстом. Тем не менее, JVM также имеет эти концепции стека и кучи. Так как же эти двое примирились?

Являются ли они различными уровнями абстракции, где основная память находится на один или два уровня ниже JVM, и чьи «сегменты» естественным образом отображаются на «сегменты» JVM? Поскольку предполагается, что JVM - это виртуальный компьютер, мне кажется, что они эмулируют то, что происходит внизу, но на более высоком уровне абстракции.

1 Ответ

0 голосов
/ 16 января 2020

Похоже, вы читали учебник или что-то подобное. Все эти термины, как правило, имеют очень точные определения в книгах / лекциях, но гораздо менее точные определения в реальности. Поэтому то, что люди имеют в виду, когда говорят «куча», не обязательно совпадает с тем, что говорится в книге и др. говорит.

Память разделена на «сегменты», называемые кучей, стеком, bss, данными и текстом.

Это верно только для типичного процесса в пространстве пользователя. Другими словами, это будет верно для повседневной программы, написанной в c или аналогичной, однако это не так для всех программ и определенно не верно для всего пространства памяти.

Когда программа выполняется ОС выделяет память для различных перечисленных сегментов, кроме кучи. Программа может запрашивать память у ОС во время ее выполнения. Это позволяет программе использовать различное количество памяти в зависимости от ее потребностей. Куча относится к памяти, запрошенной программой, обычно с помощью функции, подобной mallo c. Для уточнения кучи обычно ссылаются на управляемую область памяти, обычно управляемую с помощью malloc / free. Также возможно запрашивать память непосредственно из ОС, неуправляемым способом. Большинство людей (Imo) сказали бы, что это не будет считаться частью кучи.

Стек - это структура данных / сегмент, которая отслеживает локальные переменные и вызовы функций. Он хранит важную информацию, например, куда вернуться после вызова функции. В c или других «родных» языках стек создается ОС и может при необходимости увеличиваться или уменьшаться.

Java позволяет программе запрашивать память во время выполнения, используя new. Память, выделенная для java программы с использованием new, называется памятью в куче java. Можно представить, что если вы внедряете Jvm, вы будете использовать mallo c за кулисами нового. Это приведет к куче java в обычной куче. На самом деле «серьезные» jvms не делают этого и напрямую взаимодействуют с ОС для памяти.

В Java стек создается Jvm. Можно предположить, что это выделяется mallo c, но, как и в случае с кучей, скорее всего, это не так, как это делают jvms в реальном мире.

Редактировать: Jvm-подобная точка доступа. Скорее всего выделит память напрямую из ОС. Затем эта память будет помещена в некоторый пул, из которого она будет удалена по мере необходимости. Причины, по которым потребуется необходимая память, включают новые или стек, который должен расти.

...