Я хотел бы знать, как самостоятельно вызвать исключение OutOfMemoryError: Metaspace? Можно ли загрузить много классов и заставить их надолго оставаться в памяти.

Комментарии (1)

Что ты пробовал? Не получилось?

05.10.2018 10:48
Здравствуйте и добро пожаловать в мой первый блог.

LeetCode — это популярная онлайн-платформа, которая предлагает большую коллекцию задач и проблем по кодированию, чтобы помочь инженерам-программистам.

Java и TypeScript — два популярных языка программирования, которые имеют свои уникальные сильные и слабые стороны. В этой статье блога я сравню эти.

Абстракция» — это процесс упрощения сложных сущностей или концепций реального мира с целью их применения в форме программирования. В Java класс.

Друзья, прочитавшие предыдущую статью, уже узнали, как создать и запустить проект в IDE IntelliJ IDEA. В этой статье мы рассмотрим типы данных и.

Merge sort — самый популярный алгоритм сортировки, основанный на принципе алгоритма «разделяй и властвуй».

Выделение памяти для java, Tlauncher и Лицензии.

Ответы 3

Просто продолжайте добавлять текст в StringBuilder, пока не получите OutOfMemoryError

StringBuilder s = new StringBuilder(); while (true)

Вы также можете добавить некоторый фиктивный класс в List или Set, но создание новых экземпляров занимает больше времени, и вам придется подождать некоторое время, пока вы не получите OutOfMemoryError.

Также будет иметь значение амортизированная временная стоимость вставки в список массивов.

По умолчанию Java 8 имеет неограниченный максимальный размер для Metaspace, поэтому, пока вы не устанавливаете ограничение с помощью флага MaxMetaspaceSize, ошибка не должна выдаваться.

Но это не приведет к ошибке, связанной с отображением метапространства, верно? Но поскольку метапространство также находится в куче, и этот метод исчерпывает пространство кучи, я не совсем уверен в поведении здесь, может кто-нибудь объяснить это, пожалуйста?

05.10.2018 11:00

Для создания OutOfMemoryError: Metaspace используйте библиотеку javassist.ClassPool. В приведенном ниже примере будет создана ошибка Metaspace.

import javassist.ClassPool; public class OutOfMemoryErrorMetaspace < //ClassPool objects hold all the CtClasses. static ClassPool classPool = ClassPool.getDefault(); public static void main(String[] args) throws Exception < for (int i = 0; i < 1000000; i++) < //makeClass method — Creates a new class (or interface) from the given class file. Class clas = classPool.makeClass( i + » outofmemory.OutOfMemoryErrorMetaspace «).toClass(); //Print name of class loaded System.out.println(clas.getName()); >> >
Комментарии (1)

Читайте также:  Майнкрафт как строить нубик и профессионал

Насколько я понимаю, javaassist — это внешняя библиотека. Есть ли способ сделать это без использования внешних библиотек?

05.10.2018 11:25

Чтобы смоделировать java.lang.OutOfMemoryError: Metaspace, вам нужно загрузить много разных классов.

Прежде всего, необходимо установить следующие параметры метапространства:

-XX:MaxMetaspaceSize=10m -XX:MetaspaceSize=2M -XX:MaxMetaspaceFreeRatio=1 -XX:MaxMetaspaceExpansion=1K -XX:MinMetaspaceFreeRatio=1 -XX:InitialBootClassLoaderMetaspaceSize=2M

Затем следующий код заставляет загрузчик классов загружать множество разных классов. Это достигается путем взятия скомпилированного байт-кода класса mypackage.Myclass0 и настройки для итеративного создания новых классов путем изменения имени класса и настройки длины имени класса:

public static void main(String[] args) throws Exception < String clazzBase64 = «yv66vgAAADcADAEAEm15cGFja2FnZS9NeWNsYXNzMAcAAQEAEGphdmEvbGFuZy9PYmplY3QHAAMBAApTb3VyY2VGaWxlAQANTXljbGFzczAuamF2YQEABjxpbml0PgEAAygpVgwABwAICgAEAAkBAARDb2RlACEAAgAEAAAAAAABAAEABwAIAAEACwAAABEAAQABAAAABSq3AAqxAAAAAAABAAUAAAACAAY = «; byte[] compiledClazz = Base64.getDecoder().decode(clazzBase64); int classNameLength = Integer.valueOf(compiledClazz[12]); MyClassLoader myClassLoader = new MyClassLoader(Thread.currentThread().getContextClassLoader()); for (int i = 0; ; i++) < byte[] bytes = String.valueOf(i).getBytes(); byte[] bytecode = new byte[compiledClazz.length + bytes.length — 1]; System.arraycopy(compiledClazz, 0, bytecode, 0, 30); bytecode[12] = (byte) (classNameLength + bytes.length — 1 System.arraycopy(bytes, 0, bytecode, 30, bytes.length); System.arraycopy(compiledClazz, 31, bytecode, 30 + bytes.length, compiledClazz.length — 31); String classname = «mypackage.Myclass» + i; Class c = myClassLoader.getClass(classname, bytecode); >> public static class MyClassLoader extends ClassLoader < public MyClassLoader(ClassLoader parent) < super(parent); >public Class getClass(String name, byte[] code) < return defineClass(name, code, 0, code.length); >>

Источник: reddeveloper.ru

Переполнение Metaspace

В Java, начиная с 8 версии, появилась новая вариация OutOfMemory error : Metaspace. Происходит это в связи с переполнением этой самой области памяти, которая является по сути эквивалентом Permanent Generation, однако может динамически расширяться. Вопрос опытным товарищам:
Возникали ли у вас подобные ситуации в вашей практике, за исключением случаев, когда использовались сторонние библиотеки?

Отслеживать
задан 3 дек 2018 в 0:32
395 4 4 серебряных знака 16 16 бронзовых знаков

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Вот тут еще в 2013 году описывали работу Metaspace с примером переполнения без использования сторонних библиотек. Попробуйте, может взлетит.

Читайте также:  Как сделать ярлык Майнкрафт

Отслеживать
ответ дан 3 дек 2018 в 7:55
1,507 8 8 серебряных знаков 15 15 бронзовых знаков

    Предстоящие события

заканчиваются через 4 дня

Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Источник: ru.stackoverflow.com

Java 8: от PermGen к MetaSpace

Как уже сообщалось ранее на Java One, в Java 8 версии HotSpot планируется отказаться от PermGen пространства в пользу новой его вариации — Metaspace. Ранний доступ к JDK 8 даёт возможность наблюдать Metaspace в действии, чем и воспользовался автор оригинальной статьи чтоб узнать, какие преимущества даёт MetaSpace в сравнении с PermGen, и убедится во всём непосредственно.

Подробнорсти под катом.

Что такое Metaspace

В рамках мерджа HotSpot с JRockit хранение метаданных о классах будет осуществляться в нативной памяти, по аналогии с JRockit и IBM JVM. Часть нативной памяти, отведённая под эти метаданные, носит название Metaspace.

Итак, Metaspace это замена PermGen, основное отличие которой с точки зрения Java-программистов — возможность динамически расширятся, органиченная по умолчанию только размером нативной памяти. Параметры PermSize и MaxPermSize отныне упразднены (получив эти параметры JVM будет выдавать предупреждение о том, что они более не действуют), и вместо них вводится опциональный параметр MaxMetaspaceSize, посредством которого можно задать ограничение на размер Metaspace.

В результате максимальный Metaspace по умолчанию не ограничен ничем кроме предела объёма нативной памяти. Но его можно по желанию ограничить параметром MaxMetaspaceSize, аналогичным по сути к MaxPermSize.

Читайте также:  Как активировать лицензию Майнкрафт

Предполагается, что таким образом можно будет избежать ошибки «java.lang.OutOfMemoryError: PermGen space» за счёт большей гибкости динамического изменения размера Metaspace. Но, конечно, если размер Metaspace достигнет своей границы — будь то максимум объёма нативной памяти, или лимит заданный в MaxMetaspaceSize — будет выброшено аналогичное исключение: «java.lang.OutOfMemoryError: Metadata space».

Сборка мусора

Логи Garbage Collector-а будут сообщать также и о сборке мусора в Metaspace.

Сама сборка мусора, если верить автору статьи, будет происходить при достижении Metaspace размера, заданного в MaxMetaspaceSize. Но его же эксперименты (см. ниже) показывают, что когда MaxMetaspaceSize не задан, сборка мусора в Metaspace тоже осуществляется перед каждым его динамическим увеличением.

Эксперименты
  • JDK 1.7, MaxPermSize = 128 MB
  • JDK 1.8 (b75), MaxMetaspaceSize не задан
  • JDK 1.8 (b75), MaxMetaspaceSize = 128 MB
  • при MaxPermSize = 128 MB на JDK 1.7 ему удалось загрузить чуть более 30 тысяч классов до выбрасывания исключения «OutOfMemoryError: PermGen space».
  • при отсутствии лимита MaxMetaspaceSize на JDK 1.8 его программа загрузила 50 тысяч классов (больше он не пробовал) без получения исключений
  • при лимите MaxMetaspaceSize в 128 MB на JDK 1.8 результат был аналогичен MaxPermSize = 128 MB на JDK 1.7 — удалось загрузить чуть более 30 тысяч классов до выбрасывания исключения «OutOfMemoryError: Metadata space»

В оригинальной статье автор также приводит графики использования памяти и логи Garbage Collector-а — для тех кому это интересно. Графики и логи должны быть понятны без перевода.

От себя добавлю, что такое нововведение может быть полезно для запуска java кода на клиентских машинах. Например ant/maven билд скриптов, которым ранее иногда приходилось поднимать MaxPermSize для успешного завершения билда. А также будет весьма полезно в тех (пусть и редких) случаях, когда используются десктопные Java приложения, оганичение PermGen для которых никогда не имело особого смысла.

Источник: habr.com