Skip to content

gcimpl#1234

Open
Kiriche wants to merge 5 commits into
Broscorp-net:masterfrom
Kiriche:gcimpl
Open

gcimpl#1234
Kiriche wants to merge 5 commits into
Broscorp-net:masterfrom
Kiriche:gcimpl

Conversation

@Kiriche

@Kiriche Kiriche commented Mar 29, 2022

Copy link
Copy Markdown

Мое понимание работы сборщика:
Каждый объект - экземпляр класса. Все данные об объекте, включая сигнатуры и описание методов, хранят в куче. Куча, насколько я помню, подразделена на разделы. Эти разделы фактически отвечают за отделение объектов-долгожителей от объектов которые пригодятся приложению непродолжительное количество времени. Если объект не вызывался какое-то количество времени после вызова сборщика мусора - он будет флагнут на сборку и собран при следующей сборке.
Стек - это принцип по которому работает память в случае с методами. В начале и в ходе работы приложения методы могут помещаться на вершину стека. Каждый метод вызывается по очереди, по принципу "последний вошел - первым вышел". По мере того как методы выполняются - также уменьшается и счетчик ссылок на каждый конкретный объект. Таким образом, на основании ссылок, а также статусе объекта в куче, JVM может делать вывод о том, необходимо ли отправлять его на сборку мусора при следующем вызове сборщика.
Сам сборщик работает автоматически и, насколько я знаю, в явную его почти никогда не вызывают. Автоматизм осуществляется за счет достижения верхнего предела памяти, который JVM выделяет тому сегменту кучи, который предназначен для новых объектов.

@pesua pesua left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

В коментарии написано много лишнего, но нет ответа на вопрос что такое достижимость.

}

private List<ApplicationBean> getChildren(ApplicationBean bean,
ArrayList<ApplicationBean> distinctions) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Различия? Не понял названия, теперь сложно понять что происходит.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Это мое решение проблемы кросс-референса. Я оч долго об неё бился и разбился на несколько вложенных циклов, тонну ифчиков и бесполезный счетчик указателей который можно было не делать.

В итоге переписал практически с нуля (ну, по коммитам кстати видно) и получилось вот это. Щас сяду и порефакторю код с комментами, чтобы было понятнее.

}
}

garbage = garbage.stream().filter(entry -> !(alive.contains(entry)))

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Есть метод removeAll =)


private List<ApplicationBean> getChildren(ApplicationBean bean,
ArrayList<ApplicationBean> distinctions) {
List<ApplicationBean> garbage = new ArrayList<>();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Разве это мусор? Как я понял по коду - наоборот сюда достижимые объекты попадают.

@pesua pesua added the changes requested Something isn't working label Mar 29, 2022
@Kiriche

Kiriche commented Mar 30, 2022

Copy link
Copy Markdown
Author

Достижимым считается объект, к которому есть обращения. То есть если на него есть ссылки (например методы загруженные в стек обращаются к этому объекту) - объект достижим и удалять его не следует.

@Kiriche Kiriche added ready for review Extra attention is needed and removed changes requested Something isn't working labels Mar 30, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ready for review Extra attention is needed

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants