1. Первый вопрос для аргументов -Xms20m и -Xss2M (первый для размера кучи, а второй для размера стека потока), имеют ли m и M одинаковое значение и означают ли они MB?
Да, m и M имеют одинаковое значение и все означают МБ.
2. Второй вопрос, у меня есть следующий фрагмент кода, который, как я ожидаю, оченьбыстро, так как размер стека был установлен на 512M, но код заставляет мою ОС зависать и никогда не выдает ошибку времени выполнения, кто-нибудь знает, почему это так?
Прежде всего, Java не использует только память Heap,В некоторых случаях JVM использует память без кучи (Call Tack, Metaspace и т. Д.). Этот вопрос отвечает на эту ситуацию.Поэтому в стеке потоков используется память без кучи.
Доказательство:
Запустите приложение XX: NativeMemoryTracking = summary и проверьте используемую память с помощью jcmd VM.native_memory команда.Связанный javadoc здесь .
Сначала запустите приложение с параметрами -XX: NativeMemoryTracking = summary -Xms20m -Xss2M и результатом:
Отслеживание собственной памяти:
Всего: зарезервировано = 4581409 КБ, зафиксировано = 171605 КБ
Куча Java (зарезервировано = 3121152 КБ, зафиксировано = 20480 КБ) (карта: зарезервировано = 3121152 КБ,совершено = 20480 КБ)
Тема (зарезервировано = 21567 КБ, зафиксировано = 21567 КБ) (поток № 16) (стек: зарезервировано = 21504 КБ, зафиксировано = 21504 КБ) (malloc = 45 КБ # 82) (arena = 18KB # 27)
А затем запустите то же приложение с java -XX: NativeMemoryTracking = summary -Xms20m -Xss512M параметрами и результатом:
Отслеживание собственной памяти:
Всего: зарезервировано = 7714849 КБ, зафиксировано = 3305045 КБ
Куча Java (зарезервировано = 3121152 КБ, зафиксировано = 20480 КБ)(карта: зарезервировано = 3121152 КБ, зафиксировано = 20480 КБ)
Тема (зарезервировано = 3155007 КБ, зафиксировано = 3155007 КБ) (поток # 16) (стек: зарезервировано = 3154944KB, зафиксировано = 3154944KB) (malloc = 45KB # 82) (arena = 18KB # 27)
Как видите, кучапамять не изменилась в обоих случаях, но собственная память потока увеличивается с последним случаем.Потому что мы увеличиваем размер каждого стека.Таким образом, приложение никогда не выдает ошибку времени выполнения, так как в стеке не используется куча памяти.
Примечание. Зарезервированная память представляет собой общий объем памяти, который наше приложение может потенциально использовать.И наоборот, выделенная память равна объему памяти, используемому нашим приложением прямо сейчас.
Примечание 2. Для каждого потока JVM создает один стек времени выполнения, который хранится здесь.Каждый блок этого стека называется активационной записью / кадром стека, в котором хранятся вызовы методов.Все локальные переменные этого метода хранятся в соответствующем кадре.После завершения потока его стек во время выполнения будет уничтожен JVM.Это не общий ресурс.