#java
Как в java хранятся статические поля класса? Знаю что был такой вопрос. (JAVA) В какой области памяти хранятся статические поля класса? Но там сказано что они хранятся в Permanent Generation. А в java 8 ведь он заменен на MetaSpace? Хранятся ли они теперь в MetaSpace? Если да, объясните пожалуйста, почему так? Ведь MetaSpace это область, в которой хранятся метаданные? А статические поля не являются же метаданными.
Ответы
Ответ 1
А в java 8 ведь он заменен на MetaSpace? Да, если мы говорим о HotSpot jvm. Хранятся ли они теперь в MetaSpace? Да Если да, объясните пожалуйста, почему так? Ведь MetaSpace это область, в которой хранятся метаданные? MetaSpace - это та же PermGen, только с плюшкой в виде динамического расширения. В Permanent Generation предельный размер зависел от многих факторов: количество классов, методов, размер пула констант и т.п. Теперь размер мета пространства ограничен лишь размеров доступной памяти. Если хотим поменять, то юзаем флаг MaxMetaspaceSize. Таким образом исключили возможность выпадения java.lang.OutOfMemoryError. Ну да, если вы упрётесь в предел RAM, или в предел заданный в MaxMetaspaceSize, то исключение будет. А статические поля не являются же метаданными. Ммм. Если посмотреть книгу Java Data Objects, то там сказано, что статические поля - это мета данные.Ответ 2
Ответ @Suvitruf вообще говоря запутывает. Скажем, вы заводите статическое поле: class MyClass { static ListmyList = new ArrayList<>(); } В этом случае в Metaspace будет храниться только ссылка на объект ArrayList. А сам ArrayList, естественно, будет в обычной куче (как и в предыдущих версиях Java). Не забывайте, что вы можете потом в любой момент сделать хоть обычное нестатическое поле, хоть локальную переменную и присвоить тот же объект: List var = MyClass.myList;. Вообще Metaspace — это off-heap память, а Java-объекты всегда располагаются в куче. Даже если ссылка на них есть из off-heap региона.
Комментариев нет:
Отправить комментарий