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

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

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

  1. Автор темы
    CraftCoder

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

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    Entity тоже надо чистить?
     
  2. Хостинг MineCraft
    <
  3. Larin

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

    Баллы:
    103
    Если есть метод getWorld, то да.
     
  4. Автор темы
    CraftCoder

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

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    Не помогло, может утечка может происходить из-за того, что игрок вышел с сервера будучи в данном мире, а объект игрока не отгрузился и держит локацию из этого мира. Если так, то как выгрузить объект игрока?
     
  5. Reality_SC

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

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    А как-то сделать дамп и поискать в нём?
     
  6. Автор темы
    CraftCoder

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

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    Дамп сделать не проблема, но проанализировать не получается.
     
  7. Larin

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

    Баллы:
    103
    Bukkit.getPlayers() возвращает массив, если он не клонирует массив, то можно попробовать обнулить объект в этом массиве.
     
  8. Автор темы
    CraftCoder

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

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    Что нужно в дампе искать? Мне показывает, что большую часть памяти занимает массивы char, еще немного меньше память массивы byte, и все остальное немного занимает.[DOUBLEPOST=1452701893,1452701837][/DOUBLEPOST]И вот только что нашел, что в памяти восемь объектов CraftWorld.
     
  9. Shevchik

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

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    В issue на который висит ссылка в посте есть исходник который подчищает оставшиеся ссылки.
    В 1.7 ты этого скорее всего не видел потому что часть была запатчена (та которая внутри сервера), а также ты использовал Carbon который убивал ссылки на реальный объект после выхода игрока и выгрузки мира.
     
  10. Larin

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

    Баллы:
    103
  11. Автор темы
    CraftCoder

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

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    Короче, мир не выгружался потому что не выгружался игрок, сейчас пофиксил выгрузку игрока и все заработало. Т.е. косяк был у меня, а не в ведре((([DOUBLEPOST=1452711974,1452711286][/DOUBLEPOST]Пока потестирую фикс в своем плагине. Если не получится, буду юзать код из этого коммита.
     
  12. Reality_SC

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

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Чаще всего, если что-то не работает, это твой косяк, а не используемого...
     
  13. Автор темы
    CraftCoder

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

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    Всем спасибо за помощь, разобрался со всей этой штукой. Теперь я вышел на новый уровень дебага)))
    P.S. Если хотите отгружать миры и не засорять ОЗУ, то не храните объекты Player, Location, World и т.д.

    [DOUBLEPOST=1453056026][/DOUBLEPOST]В итоге получается, что мир не отгружается из-за того что остается в памяти CraftPlayer. Я исправил все сслыки в своих плагинах и сейчас CraftPlayer не выгружается, т.к. находится в каких-то двух Object[]. И никак не могу понять откуда они.

    P.S. Закрашенные зависимости зациклены и не влияют.
     

    Вложения:

  14. Shevchik

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

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Полностью дамп показывай, нихера не понятно. Но скорее всего ссылки висят где-нибудь в lastCraftView или как-то так.
     
  15. Автор темы
    CraftCoder

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

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    А как сохранить дамп в файл? В visualvm нет такой кнопки([DOUBLEPOST=1453213637,1453105641][/DOUBLEPOST]Up![DOUBLEPOST=1453280698][/DOUBLEPOST]@Shevchik , как отправить тебе дамп, чтобы ты посмотрел?[DOUBLEPOST=1453466230][/DOUBLEPOST]Up[DOUBLEPOST=1453695618][/DOUBLEPOST]Up
     
  16. Reality_SC

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

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Забили на тебя, увы :)
     
  17. Автор темы
    CraftCoder

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

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
  18. Reality_SC

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

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Неа, сорри, не было необходимости копать в ту сторону.
     
  19. Автор темы
    CraftCoder

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

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    Такая штука не помогает:
    Код:
    for (TileEntity tileEntity : ((CraftWorld) world).getHandle().tileEntityList)
            {
                if (tileEntity instanceof IInventory)
                {
                    Iterator<HumanEntity> entityIterator = ((IInventory)tileEntity).
                            getViewers().iterator();
                    while (entityIterator.hasNext())
                    {
                        HumanEntity human = entityIterator.next();
                        if ((human instanceof CraftPlayer) && 
                                !((CraftPlayer) human).isOnline())
                        {
                            entityIterator.remove();
                        }
                    }
                }
            }
    
     
  20. GoodCoder

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

    Баллы:
    76
    По-моему, проще перезагрузить ссервер и провелать все нужные операции в Shutdown JVM Hook.
     
  21. Автор темы
    CraftCoder

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

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    При перезагрузке сервера на процессор идет очень большая нагрузка, следовательно будут страдать рядом стоящие сервера, а если у меня их 70 на одной машине? Если сразу несколько уйдут в рестарт?
     

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