[Решено]Отгрузка мира с помощью Bukkit.unloadWorld

Эм, зачем? Программные потоки и процессорные потоки это разные вещи...
Вещи то разные, но только чем больше соотношение прогрмммные потоки/ядра, тем хуже производительность.
 
Вещи то разные, но только чем больше соотношение прогрмммные потоки/ядра, тем хуже производительность.
На данный момент это практически не заметно, а вот утечка памяти очень мешает.
 
WeakReference и WeakHashMap в помощь.
О них знаю, написал небольшое "weak-обертку" для всех опасных объектов и все вроде бы работает. Но проблема в том, что остаются какие-то еще ссылки, которые не связаны с моим кодом.
Так а что делать с зависимостями транзакций инвентарей?
Up!
Up!
 
Все работало, но недавно все опять сломалось, причем теперь проблема еще глубже:
Посмотреть вложение 40266 Посмотреть вложение 40267
Как видно, все ссылки на объект мира циклические и среди них нет Location и т.п., но я не уверен, что WorldServer тоже, т.к. там слишком много полей, чтобы их просмотреть, поэтому проблема скорее всего в нем, иначе даже не могу предположить.
Вопрос: как решить? как убедится в предположении?
Можно ли отгружать мир c помощью nms?
 
Все работало, но недавно все опять сломалось, причем теперь проблема еще глубже:
Посмотреть вложение 40266 Посмотреть вложение 40267
Как видно, все ссылки на объект мира циклические и среди них нет Location и т.п., но я не уверен, что WorldServer тоже, т.к. там слишком много полей, чтобы их просмотреть, поэтому проблема скорее всего в нем, иначе даже не могу предположить.
Вопрос: как решить? как убедится в предположении?
Можно ли отгружать мир c помощью nms?
Вполне.
http://www.programcreek.com/java-ap.../org/royaldev/royalcommands/WorldManager.java
Вот тут и без NMS справились.
 
Проблема в том, что из игры мир отгружается, но в оперативной памяти остаётся...
Смотрите исходники мультиворлда и Multiverse-Core. У последнего, кстати, исходный код общедоступен. Там такой проблемы нет.
 
Смотрите исходники мультиворлда и Multiverse-Core. У последнего, кстати, исходный код общедоступен. Там такой проблемы нет.
Есть, только что проверил. Создал новый мир, отгрузил с помощью mv unload, но он все равно остался в памяти.
 
Последнее редактирование:
Есть, только что проверил. Создал новый мир, отгрузил с помощью mv unload, но он все равно остался в памяти.
а что за сборщик используешь? может он просто в old gen засел, а major gc еще не произошел
 
а что за сборщик используешь? может он просто в old gen засел, а major gc еще не произошел
Пробовал вызывать GC вручную через visualvm, но это не помогает.
Как я и предполагал, WorldServer во всем виноват. Из-за недостатка опыта в рефлексии и разборе дампов, угробил на это немало времени, но теперь мир выгружается из памяти. Решение:
После всех необходимых манипуляций с баккит объектом нужно удалить ссылку на мир из WorldServer:
Java:
        try
        {
            WorldServer w = ((CraftWorld) world).getHandle();
            Field f = UtilReflection.getField(w.getClass().getSuperclass(), "world");
            f.setAccessible(true);
            f.set(w, null);
            f.setAccessible(false);
        } catch (Exception e)
        {
            //shutdown
        }
 
Последнее редактирование:
Назад
Верх