Переписано, поскольку все, кажется, отвечают на другой вопрос:
Как узнать, выполнила ли JVM сборку мусора? Возможно, слушатель System
?
Вы можете получить статистику сбора мусора через 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}
System.gc();
Java использует управляемую память, хотя я бы не рекомендовал использовать этот метод.
Из документов Java
Вызов метода gc предполагает, что виртуальная машина Java тратит усилия на повторное использование неиспользуемых объектов, чтобы сделать память, которую они в настоящее время занимают, для быстрого повторного использования. Когда управление возвращается из вызова метода, виртуальная машина Java приложила все усилия, чтобы освободить место от всех отброшенных объектов.
GC вряд ли повлияет на производительность вашей игры, потому что она продолжается, она собирает все, что больше не используется, и делает это во время работы кода. Вы можете заставить GC работать, а затем установить экран загрузки, но это не рекомендуется.
PS: Если бы GC сильно повлиял на производительность игры, Minecraft стал бы катастрофой, и Android-приложения и игры не были бы построены на Java! Подумай об этом ;)