1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем CraftCoder, 8 янв 2016.

  1. Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Вещи то разные, но только чем больше соотношение прогрмммные потоки/ядра, тем хуже производительность.
     
  2. Автор темы
    CraftCoder

    CraftCoder Старожил Пользователь

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    На данный момент это практически не заметно, а вот утечка памяти очень мешает.
     
  3. gamerforEA

    gamerforEA Старожил Пользователь

    Баллы:
    143
    Skype:
    sk2000sk1
    Имя в Minecraft:
    gamerforEA_MCPC
    WeakReference и WeakHashMap в помощь.
     
  4. Автор темы
    CraftCoder

    CraftCoder Старожил Пользователь

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    О них знаю, написал небольшое "weak-обертку" для всех опасных объектов и все вроде бы работает. Но проблема в том, что остаются какие-то еще ссылки, которые не связаны с моим кодом.
    Так а что делать с зависимостями транзакций инвентарей?
    Up!
    Up!
     
  5. Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
  6. Автор темы
    CraftCoder

    CraftCoder Старожил Пользователь

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    Все работало, но недавно все опять сломалось, причем теперь проблема еще глубже:
    Посмотреть вложение 40266 Посмотреть вложение 40267
    Как видно, все ссылки на объект мира циклические и среди них нет Location и т.п., но я не уверен, что WorldServer тоже, т.к. там слишком много полей, чтобы их просмотреть, поэтому проблема скорее всего в нем, иначе даже не могу предположить.
    Вопрос: как решить? как убедится в предположении?
    Можно ли отгружать мир c помощью nms?
     
  7. CoolBoy

    CoolBoy Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    Xezard
    Вполне.
    http://www.programcreek.com/java-ap.../org/royaldev/royalcommands/WorldManager.java
    Вот тут и без NMS справились.
     
  8. Автор темы
    CraftCoder

    CraftCoder Старожил Пользователь

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
  9. CoolBoy

    CoolBoy Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    Xezard
    Смотрите исходники мультиворлда и Multiverse-Core. У последнего, кстати, исходный код общедоступен. Там такой проблемы нет.
     
  10. Автор темы
    CraftCoder

    CraftCoder Старожил Пользователь

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    Есть, только что проверил. Создал новый мир, отгрузил с помощью mv unload, но он все равно остался в памяти.
     
    Последнее редактирование: 3 апр 2016
  11. Code

    Code Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    _Gizmo
    а что за сборщик используешь? может он просто в old gen засел, а major gc еще не произошел
     
  12. Автор темы
    CraftCoder

    CraftCoder Старожил Пользователь

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    Пробовал вызывать GC вручную через visualvm, но это не помогает.
    Как я и предполагал, WorldServer во всем виноват. Из-за недостатка опыта в рефлексии и разборе дампов, угробил на это немало времени, но теперь мир выгружается из памяти. Решение:
    После всех необходимых манипуляций с баккит объектом нужно удалить ссылку на мир из WorldServer:
    Код:
            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
            }
    
     
    Последнее редактирование: 4 апр 2016
  13. Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Молодца :)
     

Поделиться этой страницей