Classloader подгружает классы по мере необходимости. Когда в контейнере происходит undeploy, classloader и подгруженные классы должны быть собраны GC.
Память JVM состоит из Heap и Permanent Generation. Heap делится на Young Generation (Eden + Survivor) и Old Generation.

PermGen - Permanent Generation - область памяти под управлением VM, которая хранит объекты классов (Class) и interned sttrings (уникальные строки, скажем так). OutOfMemory: PermGenSpace может возникать, если что-то держит Classloader.
Когда стартует Tomcat, он создает иерархию classloader'ов:
1) Каждый объект держит линк на его Class
2) Каждый объект типа Class держит линк на ClassLoader и наоборот (за исключением загруженных Bootstrap loader'ом)
GC вызывает finalize(), когда считает, что объект можно уничтожить. Такой объект добавляется в очередь Finalizer.register(object). Если finalize() работает долго, это затормозит очередь, но не подвесит GC. Объекты с непереопределенным finalize() будут удаляться и дальше (они не добавляются в очередь), остальные будут ждать своей очереди для finalize().
Один из алгоритмов сборки мусора (это какой??) помечает все объекты. Затем проходя по дереву ссылок, стирает метки с "еще живых". Выкидывает из памяти помеченные, сдвигает поплотнее оставшиеся.
Память JVM состоит из Heap и Permanent Generation. Heap делится на Young Generation (Eden + Survivor) и Old Generation.

PermGen - Permanent Generation - область памяти под управлением VM, которая хранит объекты классов (Class) и interned sttrings (уникальные строки, скажем так). OutOfMemory: PermGenSpace может возникать, если что-то держит Classloader.
Когда стартует Tomcat, он создает иерархию classloader'ов:
Bootstrap | System | Common / \ Webapp1 Webapp2 ...
1) Каждый объект держит линк на его Class
2) Каждый объект типа Class держит линк на ClassLoader и наоборот (за исключением загруженных Bootstrap loader'ом)
holds -------> Servlet1 / | / v / Servlet1.class / | ^ / holds v | Container -----> AppClassLoader
GC вызывает finalize(), когда считает, что объект можно уничтожить. Такой объект добавляется в очередь Finalizer.register(object). Если finalize() работает долго, это затормозит очередь, но не подвесит GC. Объекты с непереопределенным finalize() будут удаляться и дальше (они не добавляются в очередь), остальные будут ждать своей очереди для finalize().
Один из алгоритмов сборки мусора (это какой??) помечает все объекты. Затем проходя по дереву ссылок, стирает метки с "еще живых". Выкидывает из памяти помеченные, сдвигает поплотнее оставшиеся.
Comments
Post a Comment