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

Локация на то и локация.
Не помогло, может утечка может происходить из-за того, что игрок вышел с сервера будучи в данном мире, а объект игрока не отгрузился и держит локацию из этого мира. Если так, то как выгрузить объект игрока?
 
А как-то сделать дамп и поискать в нём?
 
Не помогло, может утечка может происходить из-за того, что игрок вышел с сервера будучи в данном мире, а объект игрока не отгрузился и держит локацию из этого мира. Если так, то как выгрузить объект игрока?
Bukkit.getPlayers() возвращает массив, если он не клонирует массив, то можно попробовать обнулить объект в этом массиве.
 
А как-то сделать дамп и поискать в нём?
Что нужно в дампе искать? Мне показывает, что большую часть памяти занимает массивы char, еще немного меньше память массивы byte, и все остальное немного занимает.
И вот только что нашел, что в памяти восемь объектов CraftWorld.
 
В issue на который висит ссылка в посте есть исходник который подчищает оставшиеся ссылки.
В 1.7 ты этого скорее всего не видел потому что часть была запатчена (та которая внутри сервера), а также ты использовал Carbon который убивал ссылки на реальный объект после выхода игрока и выгрузки мира.
 
Короче, мир не выгружался потому что не выгружался игрок, сейчас пофиксил выгрузку игрока и все заработало. Т.е. косяк был у меня, а не в ведре(((
Пока потестирую фикс в своем плагине. Если не получится, буду юзать код из этого коммита.
 
Короче, мир не выгружался потому что не выгружался игрок, сейчас пофиксил выгрузку игрока и все заработало. Т.е. косяк был у меня, а не в ведре(((
Чаще всего, если что-то не работает, это твой косяк, а не используемого...
 
Всем спасибо за помощь, разобрался со всей этой штукой. Теперь я вышел на новый уровень дебага)))
P.S. Если хотите отгружать миры и не засорять ОЗУ, то не храните объекты Player, Location, World и т.д.


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

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

Вложения

  • Снимок.PNG
    Снимок.PNG
    7,4 КБ · Просмотры: 77
Полностью дамп показывай, нихера не понятно. Но скорее всего ссылки висят где-нибудь в lastCraftView или как-то так.
 
Полностью дамп показывай, нихера не понятно. Но скорее всего ссылки висят где-нибудь в lastCraftView или как-то так.
А как сохранить дамп в файл? В visualvm нет такой кнопки(
Up!
@Shevchik , как отправить тебе дамп, чтобы ты посмотрел?
Up
Up
 
Неа, сорри, не было необходимости копать в ту сторону.
 
Такая штука не помогает:
Java:
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();
                    }
                }
            }
        }
 
По-моему, проще перезагрузить ссервер и провелать все нужные операции в Shutdown JVM Hook.
При перезагрузке сервера на процессор идет очень большая нагрузка, следовательно будут страдать рядом стоящие сервера, а если у меня их 70 на одной машине? Если сразу несколько уйдут в рестарт?
 
Назад
Верх