Как я могу узнать, выполняла ли JVM сборку мусора?

1

Переписано, поскольку все, кажется, отвечают на другой вопрос:

Как узнать, выполнила ли JVM сборку мусора? Возможно, слушатель System?

  • 4
    Современная сборка мусора - это непрерывный процесс, специально разработанный для обеспечения минимального воздействия на приложение. Если вы не столкнулись с проблемой, которая определенно вызвана GC, я бы не беспокоился об этом.
  • 0
    попробуйте это взломать: java.dzone.com/articles/letting-garbage-collector-do-c
Показать ещё 3 комментария
Теги:

3 ответа

0

Вы можете получить статистику сбора мусора через JMX. Вот как jstat получает информацию.

public static void main(String... args) throws IOException {
    for (GarbageCollectorMXBean bean : ManagementFactory.getGarbageCollectorMXBeans()) {
        System.out.println(toMap(bean).toString()
                                      .replace("javax.management.openmbean.SimpleType", "ST")
                                      .replace("java.lang.", ""));
    }
}

public static Map<String, Object> toMap(Object o) {
    LinkedHashMap<String, Object> map = new LinkedHashMap<>();
    BeanInfo beanInfo = null;
    try {
        beanInfo = Introspector.getBeanInfo(o.getClass());
    } catch (IntrospectionException e) {
        throw new RuntimeException(e);
    }
    for (PropertyDescriptor propertyDescriptor : beanInfo.getPropertyDescriptors()) {
        if (propertyDescriptor.getName().equals("class")) continue;
        Object value = null;
        try {
            value = propertyDescriptor.getReadMethod().invoke(o);
        } catch (Exception e) {
            value = e.toString();
        }
        map.put(propertyDescriptor.getName(), value);
    }
    return map;
}

печатает много описательной информации, но скрывается в нем все статистические данные о том, сколько коллекций было выполнено, сколько времени они занимают и размеры регионов до и после коллекций.

В частности, вы можете посмотреть на collectionCount. Когда это увеличивается, происходит сбор.

gement.openmbean.CompositeDataSupport(compositeType = javax.management.openmbean.CompositeType (имя = Карта, элементы = ((ITEMNAME = ключ, ItemType = ST (имя = String)), (ITEMNAME = значение, ItemType = javax.management.openmbean.CompositeType (имя = management.MemoryUsage, элементы = ((ITEMNAME = привержен, ItemType = ST (имя = Long)), (ITEMNAME = первонач ItemType = ST (имя = Long)), (ITEMNAME = макс, ItemType = ST (name = Long)), (itemName = used, itemType = ST (name = Long))))))), contents = {key = Сжатый класс Space, value = javax.management.openmbean.CompositeDataSupport(compositeType = javax. management.openmbean.CompositeType (имя = management.MemoryUsage, элементы = ((ITEMNAME = привержен, ItemType = ST (имя = Long)), (ITEMNAME = первонач ItemType = ST (имя = Long)), (ITEMNAME = макс, itemType = ST (name = Long)), (itemName = used, itemType = ST (name = Long)))), contents = {commit = 524288, init = 0, max = 1073741824, used = 424552})}), [PS Survivor Space] = javax.management.openmbean.CompositeDataSupport(compositeType = javax.management.openmbean.CompositeType(name = Map, items = ((itemName = key, itemType = ST (name = St кольцо)), (ITEMNAME = значение, ItemType = javax.management.openmbean.CompositeType (имя = management.MemoryUsage, детали = ((ITEMNAME = совершено, ItemType = ST (название = Long)), (ITEMNAME = первонач, ItemType = ST (name = Long)), (itemName = max, itemType = ST (name = Long)), (itemName = used, itemType = ST (name = Long))))))), contents = {key = PS Survivor Пробел, value = javax.management.openmbean.CompositeDataSupport(compositeType = javax.management.openmbean.CompositeType(name = management.MemoryUsage, items = ((itemName = commit, itemType = ST (name = Long)), (itemName = init, ItemType = ST (название = Long)), (ITEMNAME = макс, ItemType = ST (название = Long)), (ITEMNAME = используется, ItemType = ST (название = Long)))), content= {совершено = 524288, init = 524288, max = 524288, used = 507920})}), [PS Old Gen] = javax.management.openmbean.CompositeDataSupport(compositeType = javax.management.openmbean.CompositeType(name = Map, items = ((itemName = ключ, ItemType = ST (имя = String)), (ITEMNAME = значение, ItemType = javax.management.openmbean.CompositeType (имя = management.MemoryUsage, элементы = ((ITEMNAME = совершено, ItemType = ST (имя = Long)), ( 904, init = 2555904, max = 251658240, used = 1242560})})}), memoryUsageBeforeGc = javax.management.openmbean.TabularDataSupport(tabularType = javax.management.openmbean.TabularType(name = Map, rowType = javax.management. openmbean.CompositeType (имя = Карта, элементы = ((ITEMNAME = ключ, ItemType = ST (имя = String)), (ITEMNAME = значение, ItemType = javax.management.openmbean.CompositeType (имя = management.MemoryUsage, элементы = ( (ITEMNAME = совершено, ItemType = ST (название = Long)), (ITEMNAME = первонач, ItemType = ST (название = Long)), (ITEMNAME = макс, ItemType = ST (название = Long)), (ITEMNAME = используется, itemType = ST (name = Long))))))), indexNames = (ключ)), содержимое = {[Сжатое пространство класса] = javax.management.openmbean.CompositeDataSupport(compositeType = javax.management.openmbean.CompositeType(name = Карта, элементы = ((ITEMNAME = ключ, ItemType = ST (имя = String)), (ITEMNAME = значение, ItemType = javax.management.openmbean.CompositeType (имя = management.MemoryUsage, элементы = ((ITEMNAME = совершено, ItemType = ST (название = Long)), (ITEMNAME = первонач, ItemType = ST (название = Long)), (ITEMNAME = макс, ItemType = ST (название = Long)), (ITEMNAME = используется, , itemType = ST (name = Long)), (itemName = used, itemType = ST (name = Long)))), contents = {commit = 22544384, init = 22544384, max = 22544384, used = 8192})}), [Metaspace] = javax.management.openmbean.CompositeDataSupport(compositeType = javax.management.openmbean.CompositeType(name = Map, items = ((itemName = key, itemType = ST (name = String)), (itemName = value, ItemType = javax.management.openmbean.CompositeType (имя = management.MemoryUsage, элементы = ((ITEMNAME = совершено, ItemType = ST (имя = Long)), (ITEMNAME = первонач ItemType = ST (имя = Long)), ( itemName = max, itemType = ST (name = Long)), (itemName = used, itemType = ST (name = Long))))))), contents = {key = Metaspace, value = javax.management.openmbean.CompositeDataSupport(compositeType = javax.management.openmbean.CompositeType (имя = management.MemoryUsage, элементы = ((ITEMNAME = привержен, ItemType = ST (имя = Long)), (ITEMNAME = первонач ItemType = ST (имя = Long)), (itemName = max, itemType = ST (name = Long)), (itemName = used, itemType = ST (name = Long)))), contents = {commit = 4980736, init = 0, max = -1, используется = 3648080})}), [PS Eden Space] = javax.man agement.openmbean.CompositeDataSupport(compositeType = javax.management.openmbean.CompositeType (имя = Карта, элементы = ((ITEMNAME = ключ, ItemType = ST (имя = String)), (ITEMNAME = значение, ItemType = javax.management.openmbean.CompositeType (имя = management.MemoryUsage, элементы = ((ITEMNAME = привержен, ItemType = ST (имя = Long)), (ITEMNAME = первонач ItemType = ST (имя = Long)), (ITEMNAME = макс, ItemType = ST (name = Long)), (itemName = used, itemType = ST (name = Long))))))), contents = {key = PS Eden Space, value = javax.management.openmbean.CompositeDataSupport(compositeType = javax. management.openmbean.CompositeType (имя = management.MemoryUsage, элементы = ((ITEMNAME = привержен, ItemType = ST (имя = Long)), (ITEMNAME = первонач ItemType = ST (имя = Long)), (ITEMNAME = макс, itemType = ST (name = Long)), (itemName = used, itemType = ST (name = Long)))), contents = {commit = 524288, init = 524288, max = 9961472, used = 524288})}), [Code Cache] = javax.management.openmbean.CompositeDataSupport(compositeType = javax.management.openmbean.CompositeType(name = Map, items = ((itemName = key, itemType = ST (name = String)), (itemN .Info = [Ljavax.management.MBeanNotificationInfo; @5fd0d5ae, objectName = java.lang: type = GarbageCollector, name = PS MarkSweep, valid = true}

0
System.gc(); 

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

Из документов Java

Вызов метода gc предполагает, что виртуальная машина Java тратит усилия на повторное использование неиспользуемых объектов, чтобы сделать память, которую они в настоящее время занимают, для быстрого повторного использования. Когда управление возвращается из вызова метода, виртуальная машина Java приложила все усилия, чтобы освободить место от всех отброшенных объектов.

  • 2
    Почему отрицательный голос?
  • 0
    Не я, но я не понимаю: я спросил, есть ли способ для JVM сказать мне, произошла ли сборка мусора, но вышеупомянутый метод - только предложение, поэтому я не обязательно буду знать, сделал ли GC работать или нет.
Показать ещё 7 комментариев
-1

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

PS: Если бы GC сильно повлиял на производительность игры, Minecraft стал бы катастрофой, и Android-приложения и игры не были бы построены на Java! Подумай об этом ;)

  • 0
    Я не пытаюсь контролировать сборку мусора! Я просто хочу знать, произошло это или нет.
  • 0
    И что вы подразумеваете под «вы можете заставить его» ? Я думаю, что самое большее, что вы можете сделать, это предложить ему работать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню