Главная страница
Навигация по странице:

  • 11.Что такое сборщик мусора (Garbage collector)

  • 12.Что такое Heap и Stack память в Java Чем они отличаются

  • [3*Процедурная JAVA] 1.Какие примитивные типы данных есть в Java

  • 3.Сколько памяти занимает boolean

  • 4.Что такое классы-обертки

  • 5.Что такое автоупаковка и автораспаковка

  • 6.Что такое явное и неявное приведение типов В каких случаях в java нужно использовать явное приведение

  • 8.Какие нюансы у строк в Java

  • 10.Почему не рекомендуется изменять строки в цикле Что рекомендуется использовать

  • 11.Почему строки не рекомендуется использовать для хранения паролей

  • 12.Почему String неизменяемый и финализированный класс

  • 13.Почему строка является популярным ключом в HashMap в Java

  • _Конспект CORE-1. Core1 1ооп Что такое ооп


    Скачать 73.05 Kb.
    НазваниеCore1 1ооп Что такое ооп
    Анкор_Конспект CORE-1
    Дата12.12.2020
    Размер73.05 Kb.
    Формат файлаdocx
    Имя файла_Конспект CORE-1.docx
    ТипПрограмма
    #159790
    страница2 из 5
    1   2   3   4   5

    9.Что такое загрузчик классов (classloader)?

    Стандартный java-класс java.lang.ClassLoader, он абстрактный. Предназначен для загрузки классов в память JVM и помещения их в собственный кэш. Но сам, непосредственно, их не загружает, это делают его наследники.

    Используется для поставки в JVM скомпилированного байт-кода, который, как правило, хранится в файлах с расширением .class, но может быть также получен из других источников, например, загружен по сети или же сгенерирован самим приложением.
    Для того, чтобы получить работающий в JVM код, необходимо выполнить три этапа:

    - Загрузка байт-кода из ресурсов и создание экземпляра класса Class.

    сюда входит поиск запрошенного класса среди загруженных ранее, получение байт-кода для загрузки и проверка его корректности, создание экземпляра класса Class (для работы с ним в runtime), загрузка родительских классов. Если родительские классы и интерфейсы не были загружены, то и рассматриваемый класс считается не загруженным.

    - Связывание (или линковка). по спецификации этот этап разбивается еще на три стадии:

    Verification, происходит проверка корректности полученного байт-кода.

    Preparation, выделение оперативной памяти под статические поля и инициализация их значениями по умолчанию (при этом явная инициализация, если она есть, происходит уже на этапе инициализации).

    Resolution, разрешение символьных ссылок типов, полей и методов.

    - Инициализация полученного объекта.
    - Класс должен быть полностью загружен прежде, чем слинкован.

    - Класс должен быть полностью проверен и подготовлен прежде, чем проинициализирован.

    - Ошибки разрешения ссылок происходят во время выполнения программы, даже если были обнаружены на этапе линковки.
    Системный ClassLoader - наследник абстрактного, создается JVM по умолчанию.

    CLASSPATH - это переменная хранит полные имена (название пакета и имя класса) классов (с расширением .class), которые нужно загрузить. Системный ClassLoader, когда ему передается управление, читает этот файл и загружает соответствующие классы.

    Class.forName(ИмяКласса, вашClassLoader);

    JVM загружает System ClassLoader,

    System ClassLoader загружает главный класс,

    возникает необходимость загрузить следующий класс,

    JVM находит текущий загрузчик о котором помнит текущий класс,

    текущий ClassLoader загружает нужный класс в JVM,

    загрузившийся класс запоминает этот загрузчик как текущий

    помещает класс себе в кэш
    В Java существует три стандартных загрузчика, каждый из которых осуществляет загрузку класса из определенного места:

    - Bootstrap – базовый загрузчик, также называется Primordial ClassLoader.

    загружает стандартные классы JDK из архива rt.jar

    - Extension ClassLoader – загрузчик расширений.

    загружает классы расширений, которые по умолчанию находятся в каталоге jre/lib/ext, но могут быть заданы системным свойством java.ext.dirs

    - System ClassLoader – системный загрузчик.

    загружает классы приложения, определенные в переменной среды окружения CLASSPATH
    В Java используется иерархия загрузчиков классов, где корневым, разумеется, является базовый. Далее следует загрузчик расширений, а за ним уже системный. Естественно, каждый загрузчик хранит указатель на родительский для того, чтобы смочь делегировать ему загрузку в том случае, если сам будет не в состоянии этого сделать.

    Расширяя класс ClassLoader и переопределяя его методы, пользовательский загрузчик может осуществлять свою логику поставки байт-кода в виртуальную машину.

    Три принципа загрузки классов- Делегирование, Видимость, Уникальность.
    10.Что такое JIT?

    Динамическая компиляция. в JVM существует возможность компилировать часто вызываемые блоки программы в машинный код в рантайме. Эта технология называется Jast-in-time (JIT). Это не значит, что машинный код сохранится в файл программы, он будет существовать только во время её выполнения в оперативной памяти.

    Достигается высокая скорость выполнения по сравнению с интерпретируемым байт-кодом за счёт увеличения потребления памяти (для хранения результатов компиляции) и затрат времени на компиляцию. Позволяет применять такие технологии, как адаптивная оптимизация.
    11.Что такое сборщик мусора? (Garbage collector)

    Сборщик мусора — процесс, который запускается JVM периодически и освобождает память, использованную объектами, которые больше не нужны. JVM обычно запускает сборщик мусора при низком уровне свободной памяти. Если памяти недостаточно даже после восстановления, JVM генерирует исключение OutOfMemoryError.

    System.gc(), Runtime.getRuntime().gc()
    Объект подлежит утилизации, когда он недоступен живому потоку.

    - Если переменная ссылочного типа, которая ссылается на объект, установлена в положение "0", объект подлежит утилизации, в том случае, если на него нет других ссылок.

    - Если переменная ссылочного типа, которая ссылается на объект, создана для ссылки на другой объект, объект подлежит утилизации, в том случае, если на него нет других ссылок.

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

    - Объекты, которые ссылаются друг на друга, могут подлежать утилизации, если ни один из них не доступен живому потоку.

    Java позволяет использовать метод finalize() (финализировать), чтобы произвести необходимую очистку перед тем, как сборщик мусора извлекает объект из памяти. Этот метод вызывается для объекта сборщиком мусора, когда сборщик мусора вычисляет, что ссылок к объекту больше нет. Это описано в классе Object, а значит, это наследуется всеми классами.
    Разделение объектов на младшее поколение (young generation) и старшее поколение (old generation). В соответствии с этим разделением и процессы сборки мусора разделяются на малую сборку (minor GC), затрагивающую только младшее поколение, и полную сборку (full GC), которая может затрагивать оба поколения. Малые сборки выполняются достаточно часто и удаляют основную часть мертвых объектов. Полные сборки выполняются тогда, когда текущий объем выделенной программе памяти близок к исчерпанию и малой сборкой уже не обойтись.
    Java HotSpot VM предоставляет разработчикам на выбор четыре различных сборщика мусора:

    - Serial (последовательный) — самый простой вариант для приложений с небольшим объемом данных и не требовательных к задержкам. Редко когда используется, но на слабых компьютерах может быть выбран виртуальной машиной в качестве сборщика по умолчанию.

    - Parallel (параллельный) — наследует подходы к сборке от последовательного сборщика, но добавляет параллелизм в некоторые операции, а также возможности по автоматической подстройке под требуемые параметры производительности.

    - Concurrent Mark Sweep (CMS) — нацелен на снижение максимальных задержек путем выполнения части работ по сборке мусора параллельно с основными потоками приложения. Подходит для работы с относительно большими объемами данных в памяти.

    - Garbage-First (G1) — создан для постепенной замены CMS, особенно в серверных приложениях, работающих на многопроцессорных серверах и оперирующих большими объемами данных.
    Общая куча, где хранятся все созданные объекты, была разделена на несколько частей.

    Eden (библ. “Райский сад”). Сюда объекты попадают после их создания. Именно в этой части выделяется память для новых объектов. Когда в этой области заканчивается место, начинается первая, “быстрая” сборка мусора.

    Область памяти, куда переносятся все объекты, пережившие хотя бы одну сборку мусора, называется Survival Space.

    Survival Space в свою очередь делится на поколения. Каждый объект относится к своему поколению в зависимости от того, сколько сборок мусора он пережил. Если одну — он относится к “Поколению 1”, если 5 — к “Поколению 5”.

    Вместе Eden и Survival Space образуют область под названием Young Generation (“молодое поколение”).

    Помимо Young Generation в куче существует и другая область памяти — Old Generation (“старое поколение”). Сюда как раз попадают те самые объекты-долгожители, которые пережили много сборок мусора. И только когда область Old Generation заполнена, т.е. даже объектов-долгожителей в программе так много, что памяти не хватает, производится полная уборка мусора. Она обрабатывает не одну область памяти, а вообще все созданные Java-машиной объекты.
    12.Что такое Heap и Stack память в Java? Чем они отличаются?

    JVM разделяет используемую ею память на две области: куча (heap), в которой хранятся данные приложения. И стек, в которой хранится код программы и другие вспомогательные данные.

    Все объекты, которые явно или неявно создаются Java-приложением, размещаются в куче.
    Heap (куча) используется Java Runtime для выделения памяти под объекты и JRE классы. Создание нового объекта также происходит в куче. Здесь работает сборщик мусора: освобождает память путем удаления объектов, на которые нет каких-либо ссылок. Любой объект, созданный в куче, имеет глобальный доступ и на него могут ссылаться с любой части приложения.
    Стековая память в Java работает по схеме LIFO (Последний-зашел-Первый-вышел). Всякий раз, когда вызывается метод, в памяти стека создается новый блок, который содержит примитивы и ссылки на другие объекты в методе. Как только метод заканчивает работу, блок также перестает использоваться, тем самым предоставляя доступ для следующего метода.

    Размер стековой памяти намного меньше объема памяти в куче.
    - Куча используется всеми частями приложения в то время как стек используется только одним потоком исполнения программы.

    - Всякий раз, когда создается объект, он всегда хранится в куче, а в памяти стека содержится ссылка на него. Память стека содержит только локальные переменные примитивных типов и ссылки на объекты в куче.

    - Объекты в куче доступны с любой точки программы, в то время как стековая память не может быть доступна для других потоков.

    - Управление памятью в стеке осуществляется по схеме LIFO.

    - Стековая память существует лишь какое-то время работы программы, а память в куче живет с самого начала до конца работы программы.

    - Размер памяти стека намного меньше памяти в куче. Из-за простоты распределения памяти (LIFO), стековая память работает намного быстрее кучи.
    [3*Процедурная JAVA]
    1.Какие примитивные типы данных есть в Java?

    В Java есть 8 примитивных типов, которые делят на 4 группы, вот они:

    Целые числа – byte(8 128 128), short(16 -32768 до 32767), int(32 -2147483648 до 2147483647), long(64)

    Числа с плавающей точкой (иначе вещественные) - float, double

    Логический - boolean

    Символьный – (16)
    Существует два вида переменных:

    Примитивные типы java, хранят непосредственно значение байтов данных (подробнее типы этих примитивов мы разберем немного ниже);

    Ссылочный тип, хранит байты адреса объекта в Heap, то есть через эти переменные мы получаем доступ непосредственно к самому объекту(такой себе пульт от объекта)

    Производительность: примитивные типы потому и называют примитивными, потому что они лишены многих “тяжеловесных” особенностей объектов.
    2.Что такое char?

    Примитивный тип. Беззнаковое целое число, представляющее собой символ UTF-16 (буквы и цифры). Данные в char занимают 16bit и описывают символ. В Java для char используется кодировка Unicode. Символ можно задать в соответствии с двумя таблицами – Unicode и ASCII

    char, являясь по своей сути всё-таки числом, поддерживает математические действия (сложение).
    3.Сколько памяти занимает boolean?

    булевский (логический тип). Он может принимать значения только true или false, которые являются ключевыми словами.

    Используется в логических операциях, таких как циклы while, и в ветвлении при помощи if, switch.
    Теоретически, нам достаточно 1 бита информации, 0 или 1, то есть true или false. Но на самом деле Boolean будет занимать больше памяти и это будет зависеть от конкретной реализации JVM. Обычно на это тратится столько же, сколько на int.
    4.Что такое классы-обертки?

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

    Классы-обертки позволяют нивелировать недостатки, которые есть у примитивных типов.

    Самый очевидный из них — примитивы не имеют методов. Например, у них нет метода toString()
    Классы-обертки являются immutable (неизменяемыми): это означает, что после создания объекта его состояние — значение поля value — не может быть изменено. Классы-обертки задекларированы как final: объекты, так сказать, read-only.
    java.lang, уже есть реализации классы Boolean, Byte, Short, Character, Integer, Float, Long, Double.

    Эти классы дают возможность сохранять внутри объекта примитив, а сам объект будет вести себя как Object.

    К примеру, такие классы дают нам возможность создать, скажем, List, ведь List должен содержать только объекты, чем примитивы не являются.

    Помимо методов в классах-обертках есть очень удобные для использования статические поля.
    5.Что такое автоупаковка и автораспаковка?

    Java автоматически делает преобразования между примитивными типами и их обертками:

    Процесс преобразования примитивных типов в ссылочные (int->Integer) называется autoboxing (автоупаковкой), а обратный ему — unboxing (автораспаковкой).

    Параметры методов тоже подлежат автоупаковке и автораспаковке.
    - Позволяют не нарушать принцип “все является объектом”, благодаря чему числа, символы и булевы значения true/false не выпадают из этой концепции

    - Расширяют возможности работы с этими значениями, предоставляя удобные методы и поля

    - Необходимы, когда какой-то метод может работать исключительно с объектами
    6.Что такое явное и неявное приведение типов? В каких случаях в java нужно

    использовать явное приведение?

    Существует преобразование с расширением и преобразование сужающее. Если тип данных становится больше (допустим, был int, а стал long), то тип становится шире (из 32 бит становится 64). И в этом случае мы не рискуем потерять данные, т.к. если влезло в int, то в long влезет тем более, поэтому данное приведение мы не замечаем, так как оно осуществляется автоматически. А вот в обратную сторону преобразование требует явного указания от нас, данное приведение типа называется — сужение.
    7.Что такое пул интов?

    Для более эффективного использования памяти. Когда мы создаем Integer объект не используя new, объект помещается в пул, и в последствии, если мы захотим создать такой же объект (не используя new), новый объект создан не будет, а мы просто получим ссылку на наш объект их пула. Integer pool от -128 до 127
    8.Какие нюансы у строк в Java?

    - Любая строка является объектом класса String.

    - Переменные типа String являются ссылками на объекты.

    - В классе String содержаться строки неизменной длины, что позволяет ускорить обработку строк.

    - При каждом изменении строки создается новый объект, а прежний превращается в мусор.

    - Длину строки и содержание можно и нужно изменить в объектах класса StringBuilder и StringBuffer, которые обеспечивают обработку строк в однопоточной и многопоточной среде.

    - Операция сравнения == сопоставляет только ссылки на строки

    - Сравнение содержимого строк выполняет логический метод equals класса String
    9.Что такое пул строк?

    Пул строк (String Pool) — это множество строк в кучи (Java Heap Memory). Мы знаем, что String — особый класс в java, с помощью которого мы можем создавать строковые объекты.

    - Сам строковый пул возможен только потому, что строки в Java неизменные.

    - Если строка будет изменяемой, тогда это станет серьезной угрозой безопасности приложения.

    - Так как строка неизменная, она безопасна для много поточности

    Можем использовать метод intern(), чтобы поместить этот объект в пул строк или обратиться к другому объекту из пула строк, который имеет такое же значение.
    10.Почему не рекомендуется изменять строки в цикле? Что рекомендуется

    использовать?

    Строки не изменяемы (immutable). Каждый раз создается объект строки заново.

    Выполняется целых 3 операции: создается StringBuilder на основе строки s, вызывается метод конкатенации append, после конкатенации вызывается метод toString

    Использовать StringBuilder и StringBuffer.
    11.Почему строки не рекомендуется использовать для хранения паролей?

    В Java строки являются неизменяемыми, поэтому, если вы используете String для хранения пароля, контент не может быть изменен, потому что любое изменение приведет к появлению новой строки. И строка, содержащая пароль, будет доступна в памяти до тех пор, пока не будет собрана сборка мусора. Таким образом, он останется в памяти на долгое время, что может быть угрозой безопасности.
    12.Почему String неизменяемый и финализированный класс?

    Причины неизменяемости String в Java это безопасность и наличие пула строк (String pool):

    - можно передавать строку между потоками не опасаясь, что она будет изменена

    - отсутствуют проблемы с синхронизацией потоков

    - отсутствие проблем с утечкой памяти

    - отсутствие проблем с доступом и безопасностью при использовании строк для передачи параметров авторизации, открытия файлов и т.д.

    - кэширование hashcode

    - Экономия памяти при использовании пула строк для хранения повторяющихся строк.
    13.Почему строка является популярным ключом в HashMap в Java?

    Поскольку строки неизменны, их хэшкод кэшируется в момент создания и не требует повторного пересчета. Это делает строки отличным кандидатом для ключа Map и они обрабатываются быстрее, чем другие объекты-ключи HashMap. Поэтому строки преимущественно используются в качестве ключей HashMap.
    1   2   3   4   5


    написать администратору сайта