В PermGen виртуальная машина хранит метаданные загруженных классов. Также здесь находятся всё статическое содержимое приложения, переменные примитивных типов и ссылки на статические объекты.
Более того PermGen хранит данные о байткоде и JIT информацию. До Java 7 пул строк также являлся частью PermGen.
По умолчанию, максимальный размер этой области памяти для 32-х битной JVM равен 64 Мб, а для 64-х битной версии – 82 Мб. Однако, вы можете изменять эти значения, используя следующие параметры JVM:
-
-XX:PermSize=[размер] для установки минимального размера PermGen области
-XX:MaxPermSize=[размер] для установки максимального размера
Из-за своего ограниченного размера, PermGen является причиной возникновения ошибки java.lang.OutOfMemoryError: PermGen space. Проще говоря, загрузчики классов не обрабатываются сборщиком мусора должным образом, в результате чего появляются утечки памяти. Чаще всего это происходит при создании новых загрузчиков.
Эта область памяти была полностью удалена в JDK 8.
Что такое Heap и Stack память в Java? Разбор на примере
По умолчанию, Metaspace увеличивается автоматически. Однако и здесь у нас есть возможность управления памятью:
-
При помощи MetaspaceSize и MaxMetaspaceSize можно задать границы Metaspace области
MinMetaspaceFreeRatio – минимальный зарезервированный размер памяти для метаданных классов после сборки мусора. Выражается в процентах от общего размера Metaspace области
В результате появления Metaspace, процесс очистки памяти получил некоторые преимущества. Теперь сборщик мусора автоматически удаляет из памяти ненужные классы, когда емкость, выделенная для хранения метаданных, достигает максимального значения. Вместе с этим, уменьшилась вероятность получения ошибки OutOfMemoryError.
Несмотря на все плюсы, нам все равно необходимо контролировать и, при необходимости, настраивать Metaspace чтобы избежать утечек памяти.
I have a FTB Unleashed 1.1.7 server running and I have been getting the following error as of lately «java.lang.OutOfMemoryError: PermGen space».
-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled along with setting the MaxPermSize -XX:MaxPermSize=128M .
What is the ideal MaxPermSize? Will increasing the MaxPermSize (256mb, 512mb) degrade performance?
While I do agree to some point with the existing answers, increasing to -XX:MaxPermSize=512M will help and even up to -XX:MaxPermSize=1G should not hurt, assuming your server has that amount of physical RAM, a word of advice regarding the total heap size, which is configured by increasing -Xmx=xGB .
In general this will increase the available memory for the program, which is good, since the JVM (Java Virtual Machine, essentially the program running your minecraft server) will have more memory to put ‘stuff’ into. At a certain point, there will however be a great drawback. As you go into the 10s of gigabytes, the JVM becomes more and more inefficient to handle this much memory without advice.
As more and more memory is needed, you need to tell the JVM what exactly the memory is primarily used for (this depends weather your java objects are rather short- or long-lived). I am not sure regarding how Minecraft handles this memory, as I come from another java field (J2EE), but the bigger the total RAM, the more likely you need to tune your server to the specific requirement for the application.
Specifically you will need to tune the garbage collector to rather have minimal stop-the-world pauses (basically where your server completely stands still and seemingly does nothing). Using -XX:+UseConcMarkSweepGC will help that a lot. Using -XX:CMSClassUnloadingEnabled will only help to keep your PermGen ( -XX:MaxPermSize ) clean but not keeping your overall heap clean. For the former case, there are literally dozens of settings that need to be considered.
For a very big server there is a lot more to tune than just the -XX:MaxPermSize . A PermSize of around -XX:MaxPermSize=1G and a heap around -Xmx=4G to -Xmx=6G should still be fairly safe. I would not go much beyond this to keep server performance.
Of course the MaxPermSize + Xmx should never be higher than the RAM installed in your computer. It will start swapping which will reduce performance by some magnitudes.
Российский сервер minecraft GregTech
Собираю клиент на базе TLauncher
Скачиваю версию 1.7.10.
Скачиваю и кидаю в папку с игрой Конфигурация и моды
Скачиваю и устанавливаю forge 10.13.1.1232
Запускаю установленную версию Forge
Ввожу пароль. Пароль верный!
Получаю это:
Что я делаю не так =_=
Не долго я побегал
[18:33:14] [Netty Client IO #1/ERROR] [FML]: NetworkDispatcher exception
java.lang.OutOfMemoryError: PermGen space
[L] Launcher exited.
[L] Minecraft closed with exit code: -805306369
[Crash] Signature «PermGen error» matches!
[Crash] Crash has been recognized!
Источник: minecraft-kak.ru
Проблема с недопустимым максимальным размером кучи на сервере Minecraft (2 способа исправить) (04.03.23)
- Minecraft
сервер minecraft недопустимый максимальный размер кучи
Minecraft позволяет людям наслаждаться игрой самостоятельно или с друзьями и другими онлайн-игроками через выделенные серверы. Некоторые из этих серверов являются собственными официальными серверами игры, а другие создаются игроками. Эти серверы предоставляют совершенно новый опыт для развлечения. Любой игрок может создать сервер в Minecraft или присоединиться к нему. Создатель сервера также может изменять мировые правила и среду по своему желанию, имея при этом доступ к командной строке.
Создать сервер в Minecraft значительно проще, если вы знаете, что вы делает. Однако ошибки иногда могут усложнить задачу, чем обычно. Есть несколько различных возможных проблем, которые могут появиться, когда игрок пытается создать сервер. Эти проблемы могут вызвать некоторые трудности и сделать невозможным настройку вашего сервера. Вот почему игрок должен немедленно попытаться исправить эти проблемы.
Популярные уроки Minecraft
‘Недействительно максимальный размер кучи »- это одна из специфических проблем, с которыми сталкиваются игроки, работая на своем сервере. Эта проблема обычно возникает, когда игрок пытается выделить больше оперативной памяти своему серверу Minecraft. Ошибка затрудняет правильную работу вашего сервера, так как не позволяет вам предоставить вашему серверу больше памяти.
Устранение проблемы «Недопустимый максимальный размер кучи» на сервере Minecraft
Проблема «Недопустимый максимальный размер кучи» довольно распространена и может возникать по разным причинам. Однако вам не о чем беспокоиться, поскольку ошибку легко устранить. Способы исправить ошибку перечислены ниже вместе с причинами, по которым ошибка может возникнуть в первую очередь.
Возможно, вы выделяете больше памяти, чем у вашего сервера Minecraft. Это хорошая причина этой ошибки. Рекомендуется проверить, насколько хорошо ваша оперативная память выделяет память соответственно. Если у вас недостаточно памяти для выделения серверу, рекомендуется установить более качественную оперативную память.
Использование 32-разрядной версии Java является наиболее частой причиной проблемы «Недопустимый максимальный размер кучи». Установка и использование 64-битной Java на вашем компьютере должно быть более чем достаточно для решения проблемы. Если вы хотите установить 64-разрядную версию Java в Microsoft Windows, просто следуйте инструкциям ниже.
- Прежде всего, загрузите 64-разрядную версию Java с официального сайта Java.
- Один раз загрузка завершена, выберите вариант автономной загрузки 64-разрядной версии Windows.
- Выберите желаемое расположение для папки. Рекомендуется выбрать рабочий стол, так как это обеспечит легкий доступ.
- Нажмите кнопку «Сохранить», когда закончите выбирать расположение папки.
- Закройте все приложения без исключения. в настоящее время работает на вашем компьютере. Рекомендуется завершить все процессы с помощью диспетчера задач.
- После выполнения всего вышеперечисленного просто запустите процесс установки, дважды щелкнув значок сохраненного файла.
Выполнение всего этого позволит вам установить 64-битную версию Java на ваш компьютер и исправить ошибку «Недопустимый максимальный размер кучи», с которой вы столкнулись.
YouTube видео: Проблема с недопустимым максимальным размером кучи на сервере Minecraft (2 способа исправить)
Источник: ru.purelysandy.com
Что такое Heap и Stack память в Java?
В Java есть такие понятия как Heap и Stack память. Сегодня мы узнаем разницу между ними и зачем они нужны. Как всегда, сначала в теории и затем на практике разберем эту сложную тему.
Java Heap память
Java Heap (куча) используется Java Runtime для выделения памяти под объекты и JRE классы. Создание нового объекта также происходит в куче. Здесь работает сборщик мусора: освобождает память путем удаления объектов, на которые нет каких-либо ссылок. Любой объект, созданный в куче, имеет глобальный доступ и на него могут ссылаться с любой части приложения.
Stack память в Java
Стековая память в Java работает по схеме LIFO (Последний-зашел-Первый-вышел). Всякий раз, когда вызывается метод, в памяти стека создается новый блок, который содержит примитивы и ссылки на другие объекты в методе. Как только метод заканчивает работу, блок также перестает использоваться, тем самым предоставляя доступ для следующего метода.
Размер стековой памяти намного меньше объема памяти в куче.
Давайте рассмотрим отличия стековой памяти и кучи на примере простой программы.
package ua . com . prologistic ;
public class Memory <
public static void main ( String [ ] args ) < // строка 1
int i = 1 ; // строка 2
Object object = new Object ( ) ; // строка 3
Memory memory = new Memory ( ) ; // строка 4
memory . exMethod ( object ) ; // строка 5
private void exMethod ( Object param ) < // строка 6
String string = param . toString ( ) ; // строка 7
System . out . println ( string ) ;
На картинке ниже представлена память стека и кучи для программы выше
А теперь рассмотри шаги выполнения нашей программы:
- Как только мы запустим программу, загружаются все классы среды выполнения в кучу. Потом метод main() находит строку 1 и Java Runtime создает стековую память для использования методом main().
- Далее в строке 2 создается int’овая переменная, которая хранится в памяти стека метода main() .
- Потом мы создали объект в строке 3 и он тут же появляется в куче, а стековая память содержит ссылку на него. Точно такой же процесс происходит, когда мы создаем объект Memory в строке 4 .
- Теперь в строке 5 мы вызываем метод exMethod() и тут же сразу создается блок на вершине стека, который будет использоваться этим методом. Поскольку в Java объекты и примитивы передаются по значению, то в строке 6 будет создана новая ссылка на объект, созданный в строке 3.
- Строка, созданная в строке 7 , отправляется в Пул строк (String Pool), который находится в куче. На эту строку также создается ссылка в стековой памяти метода exMethod() .
- Метод exMethod() завершается на строке 8 , поэтому блок стековой памяти для этого метода становится свободным.
- В строке 9 метод main() завершается, поэтому стековая память для метода main() будет уничтожена. Также программа заканчивается в этой строке, следовательно, Java Runtime освобождает всю память и завершает программу.
Разница между Stack и Heap памятью в Java
На основании приведенных выше объяснений, мы можем легко подытожить следующие различия между Heap и Stack памятью в Java.
- Куча используется всеми частями приложения в то время как стек используется только одним потоком исполнения программы.
- Всякий раз, когда создается объект, он всегда хранится в куче, а в памяти стека содержится ссылка на него. Память стека содержит только локальные переменные примитивных типов и ссылки на объекты в куче.
- Объекты в куче доступны с любой точки программы, в то время как стековая память не может быть доступна для других потоков.
- Управление памятью в стеке осуществляется по схеме LIFO .
- Стековая память существует лишь какое-то время работы программы, а память в куче живет с самого начала до конца работы программы.
- Мы можем использовать -Xms и -Xmx опции JVM, чтобы определить начальный и максимальный размер памяти в куче. Для стека определить размер памяти можно с помощью опции -Xss .
- Если память стека полностью занята, то Java Runtime бросает java.lang.StackOverflowError , а если память кучи заполнена, то бросается исключение java.lang.OutOfMemoryError: Java Heap Space .
- Размер памяти стека намного меньше памяти в куче. Из-за простоты распределения памяти ( LIFO ), стековая память работает намного быстрее кучи.
Вот и все, что нужно знать о Stack и Heap памяти в Java. Следите за обновлениями в разделе Полезности.
Источник: javadevblog.com