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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

    Вложения:

  13. Shevchik

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

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

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

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    А как сохранить дамп в файл? В visualvm нет такой кнопки(
    Up!
    @Shevchik , как отправить тебе дамп, чтобы ты посмотрел?
    Up
    Up
     
  15. Reality_SC

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

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

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

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

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

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Неа, сорри, не было необходимости копать в ту сторону.
     
  18. Автор темы
    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();
                        }
                    }
                }
            }
    
     
  19. Автор темы
    CraftCoder

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

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

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

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

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