Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

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

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

  1. GoodCoder

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

    Баллы:
    76
    Лол. Как на одной машине можно столько держать? Процессор минимум на 70 потоков должен быть.
     
  2. Хостинг MineCraft
    <
  3. Автор темы
    CraftCoder

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

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    Эм, зачем? Программные потоки и процессорные потоки это разные вещи...
     
  4. Shevchik

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

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

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

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

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

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

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

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

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

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

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

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

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Вполне.[DOUBLEPOST=1459668868][/DOUBLEPOST]http://www.programcreek.com/java-ap.../org/royaldev/royalcommands/WorldManager.java
    Вот тут и без NMS справились.
     
  11. Автор темы
    CraftCoder

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

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

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

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

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

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

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

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

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

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    Пробовал вызывать GC вручную через visualvm, но это не помогает.[DOUBLEPOST=1459701618,1459689973][/DOUBLEPOST]Как я и предполагал, 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
  16. Reality_SC

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

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

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