Luxoft Flashcards
как устроена память в java
Итак, память процесса различается на heap (куча) и non-heap (стек) память, и состоит из 5 областей.
- Eden Space (heap) –объекты. Когда данная область заполняется GC выполняет быструю (minor collection) сборку мусора. По сравнению с полной сборкой мусора она занимает мало времени, и затрагивает только эту область памяти — перемещает выжившие объекты в следующую область.
- Survivor Space (heap) –объекты пережили хотя бы одну сборку мусора
- Tenured (Old) Generation (heap) — Здесь скапливаются долгоживущие объекты (крупные высокоуровневые объекты, синглтоны, менеджеры ресурсов и проч.). Когда заполняется эта область, выполняется полная сборка мусора (full, major collection), которая обрабатывает все созданные JVM объекты.
- Permanent Generation (non-heap) – Здесь хранится метаинформация, используемая JVM (используемые классы, методы и т.п.). В частноси
- Code Cache (non-heap) — эта область используется JVM, когда включена JIT-компиляция, в ней кешируется скомпилированный платформенно — зависимый код.
как устроен сборщик мусора и как работает
главная идея поиска мусора состоит в мысли: “Живые объект - те до которых мы можем добраться с корневых точек (GC Root), все остальные - мусор. Все что доступно с живого объекта - также живое”.
(GC Root) это Локальные переменные и параметры методов
Java Потоки
Статические переменные
Ссылки из JNI.
А работает просто = запускается StopTheWorkd и происходит чистка
Как работает Java машина (JVM)
e) это среда для запуска Java приложений. При запуске Java программы вызывается метод main, который реализован в java коде. JVM это часть JRE (Java Runtime Environment).
Когда мы компилируем .java файл, создается .class файл (java byte code) с таким же названием, этот файл генерируется Java компилятором.
Загрузчик классов (Class loader) считывает .class файл, генерирует соответсвующие бинарные данные и сохраняет это в области методов. JVM создает объекты класса в области Heap памяти.
Три основные загрузчика классов (cloass loaders):Bootstrap class loader: Каждая реализация JVM должна иметь bootstrap class loader, способная загружать проверенные классы. Загружается основное API Java классов, которое находится в директории JAVA_HOME/jre/lib. Этот путь так же называют bootstrap path. Загрузчик реализован на языках C, C++.
Extension class loader: Это дочерний загрзчик bootstrap class loader. Он загружает классы, которые представлены в дирекотрии JAVA_HOME/jre/lib/ext(Extension path) или в любой другой директории, которая описана в системной переменной java.ext.dirs. Это функция реализована с помощью Java sun.misc.Launcher$ExtClassLoader class
System/Application class loader: В свою очередь это дочерний загрузчик extension class loader. Загружает классы из области приложения (application classpath). Так же реализован с помощью Java sun.misc.Launcher$ExtClassLoader class.
Движок выполнения (Execution Engine)
Execution engine выполняет байткод .class файла. Он считывает байткод последовательно, строчка за строчкой, использует информацию, которая находится в разных областях памяти JVM и выполняет инструкции кода. Можно разделить на три составляющих:
Интерпретатор (Interpreter): Интерпретирует байт код в команды и выполняет их.
Just-In-Time Compiler(JIT): преобразует в нативный код, всякий раз когда встречает повторяющиеся вызовы методов. JIT поставляет нативный код и повторная интерпретация не нужна, поэтому увеличивается эффективность.
Сборщик мусора (Garbage Collector): Уничтожает не используемые объекты.
Java Native Interface (JNI)Это интерфейс для взаимодействия с нативными методами системных библиотек, которые могут быть написаны на C, C++. Для вызова методов из системных библиотек (например .dll или .so) необходимо указать где именно это библиотека находится, чтобы JVM знала об этой библиотеке.
Jconsole
контроль производительности приложения - сбор статистики и создание дампов
Обход деревьев
последовательная обработка (просмотр, изменение и т.п.) всех узлов дерева, при котором каждый узел обрабатывается строго один раз. При этом получается линейная расстановка узлов дерева.
В зависимости от траекторий выделяют два типа обхода:
— горизонтальный (в ширину); и
— вертикальный (в глубину).
Горизонтальный обход подразумевает обход дерева по уровням (level-ordered) – вначале обрабатываются все узлы текущего уровня, после чего осуществляется переход на нижний уровень.
При вертикальном обходе порядок обработки текущего узла и узлов его правого и левого поддеревьев варьирует и по этому признаку выделяют три варианта вертикального обхода:
— прямой (префиксный, pre-ordered): вершина – левое поддерево – правое поддерево;
— обратный (инфиксный, in-ordered): левое поддерево – вершина – правое поддерево; и
— концевой (постфиксный, post-ordered): левое поддерево – правое поддерево – вершина.
Бинарное дерево поиска — это бинарное дерево, обладающее дополнительными свойствами: значение левого потомка меньше значения родителя, а значение правого потомка больше значения родителя для каждого узла дерева. То есть, данные в бинарном дереве поиска хранятся в отсортированном виде. При каждой операции вставки нового или удаления существующего узла отсортированный порядок дерева сохраняется. При поиске элемента сравнивается искомое значение с корнем. Если искомое больше корня, то поиск продолжается в правом потомке корня, если меньше, то в левом, если равно, то значение найдено и поиск прекращается.
Сблансированное дерево - это кода с обоих сторон одинаковое колличество элементов…