1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/yangdechao_admin-guage-notes

В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
32-2025-Java知识点总结.md 190 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 24.06.2025 02:12 0782333

1. Реализация элегантного завершения работы приложения Spring Boot

Один. Использование конечной точки Shutdown модуля Spring Boot Actuator

  1. Настройка зависимостей Добавьте зависимость spring-boot-starter-actuator, а также включите конечную точку shutdown в конфигурационном файле:

    management:
      endpoints:
        web:
          exposure:
            include: shutdown
      endpoint:
        shutdown:
          enabled: true
    • Действие: Отправьте POST-запрос на /actuator/shutdown, чтобы запустить процесс завершения работы. Spring Boot сначала прекратит прием новых запросов, а затем завершит работу после завершения всех текущих запросов.
  2. Применимые сценарии Подходит для ситуаций, где требуется управление процессом завершения работы через HTTP-интерфейсы. Важно обеспечить безопасность (например, ограничение доступа).


Два. Настройка server.shutdown=graceful (Spring Boot 2.3+)

  1. Способ настройки Включите элегантное завершение работы и установите время ожидания в файле конфигурации application.yml:

    server:
      shutdown: graceful
    spring:
      lifecycle:
        timeout-per-shutdown-phase: 30s
    • Эффект: При закрытии приложения автоматически прекращается прием новых запросов, и приложение ждет завершения всех текущих запросов (не более 30 секунд).
  2. Поддержка веб-серверов

    • Tomcat: Прекращает новые соединения и ждет завершения всех текущих запросов.
    • Reactor Netty: Неблокирующее завершение, подходящее для реактивных приложений.------

Три. Создание пользовательского Shutdown Hook или использование аннотации @PreDestroy

  1. Регистрация Shutdown Hook В методе main используйте Runtime.getRuntime().addShutdownHook() для регистрации хука, который выполняет логику освобождения ресурсов:

    ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);
    Runtime.getRuntime().addShutdownHook(new Thread(() -> {
        context.close();
        System.out.println("Ресурсы освобождены.");
    }));
  2. Использование аннотации @PreDestroy В методе завершения бина добавьте логику освобождения ресурсов:

    @Component
    public class ResourceCleanup {
        @PreDestroy
        public void cleanup() {
            // Освобождение пула подключений к базе данных, пула потоков и т.д.
        }
    }
    ```------

Четыре. Использование файла PID и команды kill

  1. Создание файла PID При запуске создайте файл PID, используя скрипт для отправки сигнала завершения работы с помощью команды kill:
    SpringApplication application = new SpringApplication(Application.class);
    application.addListeners(new ApplicationPidFileWriter("/path/to/app.pid"));
    application.run();
    • Операция: Выполнение cat /path/to/app.pid | xargs kill (избегайте kill -9) 47.
  2. Приложение Сценарий управления в среде Linux, подходящий для интеграции с процессами DevOps.

    Пять. Активное закрытие программы

    1. Вызов ApplicationContext.close() Запуск закрытия через пользовательский контроллер или задачу по расписанию:
      @RestController
      public class ShutdownController implements ApplicationContextAware {
          private ApplicationContext context;
      
          @PostMapping("/shutdown")
          public void shutdown() {
              ((ConfigurableApplicationContext) context).close();
          }
      }
      47
    2. Использование SpringApplication.exit() Реализация остановки с помощью кода завершения:
      int exitCode = SpringApplication.exit(context, () -> 0);
      System.exit(exitCode);
      47

    Шесть. Интеграция с третьими компонентами (например, Nacos, Kubernetes)

    1. Регистрация и отслеживание сервисов Активное удаление сервиса из центра регистрации (например, Nacos) перед закрытием, чтобы избежать попадания трафика:
      @EventListener(ContextClosedEvent.class)
      public void onShutdown() {
          nacosDiscoveryService.deregister(); // Удаление сервиса
      }
      3 2.Интеграция с Kubernetes Настройка проверки готовности (Readiness Probe) и предварительного хука (PreStop Hook), чтобы гарантировать завершение обработки запросов перед закрытием Pod.

2. Новые возможности JDK 17

1. Улучшение языковых возможностей

  1. Закрытые классы (Sealed Classes)

    • Разрешает разработчикам ограничивать классы, которые могут наследовать или реализовывать текущий класс, с использованием ключевых слов sealed и permits для контроля структуры наследования.
    public abstract sealed class Shape permits Circle, Rectangle, Square { ... }
    • Подклассы должны быть объявлены как final, non-sealed или sealed, что улучшает безопасность и поддерживаемость кода.
  2. Модульное соответствие (Pattern Matching)

    • instanceof модульное соответствие: упрощение проверки типов и преобразования:
    if (obj instanceof String s) {
        System.out.println(s.toUpperCase());
    }
    • switch паттерн матчинга (предварительная функциональность): поддерживает типовое соответствие и условия-гаранты:
    return switch (obj) {
        case Integer i -> "int: " + i;
        case String s && s.length() > 0 -> "строка: " + s;
        default -> "неизвестно";
    };
    ```  3.  **Текстовые блоки (Text Blocks)**:
      - Упрощает запись многострочных строк, поддерживает автоматическое управление отступами и переносами строк:
        java
        Копировать
        ```
       String json = """
           {
               "name": "Java",
               "version": 17
           }
           """;
  3. Записи (Records): - Используется для определения неизменяемых данных классов, автоматически генерирует методы equals(), hashCode() и toString(): java Копировать

    record Person(String name, int age) { }

2. Улучшения API и инструментов

  1. Улучшенные псевдослучайные генераторы (Enhanced Pseudo-Random Number Generators): - Введен интерфейс RandomGenerator и класс-фабрика, поддерживающий более гибкий выбор алгоритмов генерации случайных чисел: java Копировать

    RandomGenerator generator = RandomGeneratorFactory.of("L128X256MixRandom").create();
  2. Фабричные методы для коллекций: - Упрощает инициализацию коллекций, поддерживает быстрое создание неизменяемых коллекций: java Копировать

    List<String> list = List.of("a", "b", "c");
    Set<Integer> set = Set.of(1, 2, 3);
  3. Улучшение API потоков (Stream API): - Добавлены новые методы, такие как toList(), takeWhile() и dropWhile(): java Копировать

    List<Integer> четные_числа = Stream.of(2, 4, 6, 8).takeWhile(n -> n % 2 == 0).toList();
  4. Внешние функции и API памяти (Incubator): - Предоставляет безопасный доступ к внешней памяти и возможность вызова локального кода, заменяет JNI и sun.misc.Unsafe. ### 3. Оптимизация производительности и безопасности

  5. Улучшенные NullPointerException: - Информация об ошибке указывает конкретную переменную или вызов метода, который является null, что упрощает отладку: Копировать

    java.lang.NullPointerException: Невозможно вызвать "String.length()" поскольку "str" равно null
  6. Усиленная защита внутренних API JDK: - По умолчанию запрещено использование рефлексии для доступа к внутренним API JDK (например, sun.misc), что повышает безопасность.

  7. Контекстно-зависимые фильтры десериализации: - Разрешает динамическую конфигурацию фильтров десериализации, предотвращая атаки с использованием вредоносных данных. Улучшения ZGC (Z Garbage Collector)
    - Гарbage collector с низкими паузами, поддерживающий параллельную обработку потоков и оптимизирующий управление большим объемом памяти.


Четвертый раздел. Отмененные и удаленные функции

  1. Отмена API Applet и менеджера безопасности
    • Из-за того, что браузеры перестали поддерживать Java-плагины, API Applet были помечены как отмененные; менеджер безопасности также постепенно исчезает из-за низкой частоты использования.
  2. Удаление экспериментальных компиляторов AOT и JIT
    • Удаление экспериментальных компиляторов GraalVM для снижения затрат на поддержку.------

Пятый раздел. Другие важные функции

  1. Локальное типовое заключение переменных (var)
    • Упрощение объявления локальных переменных:
      var list = new ArrayList<String>();
  2. Улучшение HTTP-клиента
    • Поддержка цепочного вызова и асинхронных запросов:
      HttpClient client = HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(10)).build();
  3. API Vector (второй инкубатор)
    • Предоставляет вычисления векторов с аппаратным ускорением, что улучшает производительность в сценариях научных вычислений и машинного обучения.## 3. Причины возникновения полной сборки мусора (Full GC)

1. Недостаток пространства в старом поколении

Когда новые объекты не могут быть распределены в новом поколении из-за недостатка пространства, это приводит к минорной сборке мусора (Minor GC). Если после нескольких минорных сборок мусора объекты все еще остаются живыми и требуют перехода в старое поколение, но пространство в старом поколении недостаточно для их размещения, это приводит к полной сборке мусора (Full GC). Например, при высокой конкуренции и создании большого количества объектов за короткий промежуток времени, некоторые из которых имеют длительный срок жизни и постоянно переходят в старое поколение, может возникнуть недостаток пространства в старом поколении.

2. Недостаток пространства в постоянном поколении (JDK 1.7 и ранее) или метаспейсе (JDK 1.8 и позже)

Постоянное поколение используется для хранения метаданных классов, а метаспейс является его заменителем. Когда загружается большое количество классов, например, при использовании динамических прокси для создания множества классов или при использовании некоторых фреймворков (например, Spring, Hibernate), которые генерируют множество классов динамически, это может привести к недостатку пространства в постоянном поколении или метаспейсе, что вызывает полную сборку мусора (Full GC).#### 3. Явное вызов System.gc() Явное вызов метода System.gc() в коде рекомендует JVM выполнить полную сборку мусора (Full GC). Однако JVM может не выполнить полную сборку мусора немедленно и будет решать, следует ли это делать, в соответствии со своими стратегиями.

4. Большие объекты сразу переходят в старое поколение

Когда созданный объект занимает больше определенного порога по размеру, он сразу распределяется в старом поколении. Если часто создаются большие объекты, это может привести к недостатку пространства в старом поколении, что вызывает полную сборку мусора (Full GC).

5. Правила перехода объектов из нового поколения

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

4. Методы диагностики Full GC### 1. Анализ логов сборки мусора (GC)

Добавление параметров запуска JVM, таких как -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:gc.log, позволяет выводить информацию о сборке мусора в указанный файл журнала. Анализ логов сборки мусора позволяет понять время каждого вызова сборки мусора, использование кучи до и после сборки мусора и т.д. Например, если часто возникают полные сборки мусора (Full GC), а объем памяти в старой генерации после Full GC не уменьшается значительно, это может указывать на наличие утечек памяти.### 2. Использование инструментов для мониторинга

  • VisualVM: Это визуальный инструмент для мониторинга, который позволяет в реальном времени отслеживать использование памяти JVM, состояние потоков, использование процессора и т.д. С помощью VisualVM можно визуально увидеть использование кучи, включая молодую, старую генерацию и постоянную кучу (или пространство метаданных), а также частоту и время сборки мусора.
  • YourKit: Это мощный инструмент для анализа производительности, который позволяет глубоко анализировать JVM, включая анализ памяти и процессора. С помощью YourKit можно найти объекты с утечками памяти и объекты, которые занимают большое количество памяти.

3. Обзор кода

Проверьте код на наличие явных вызовов System.gc(), избегайте необязательных вызовов. Также проверьте код на наличие создания большого количества больших объектов и наличие утечек памяти, таких как незакрытые ресурсы (например, файлы, соединения с базами данных и т.д.).

4. Настройка параметров JVM

На основе конкретной ситуации приложения, настройте размер кучи JVM, пропорции молодой и старой генерации и т.д. Например, если обнаружено, что недостаток места в старой генерации приводит к частым полным сборкам мусора (Full GC), можно увеличить объем памяти в старой генерации.## 5. Как выявить причины транзакционных мертвых琐锁 в базе данных

База данных может столкнуться с ситуацией, когда два или более транзакта во время выполнения конфликтуют из-за борьбы за ресурсы блокировки, что приводит к состоянию мертвого ожидания. Это состояние называется мертвым琐锁. Ниже приведены общие методы для выявления причин мертвых琐锁 в базе данных.

1. Анализ логов базы данных

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

  • MySQL: Информацию о мертвых琐锁 можно получить, просмотрев файл ошибок (обычно error.log). Также можно использовать команду SHOW ENGINE INNODB STATUS для получения информации о состоянии движка InnoDB, которая включает подробную информацию о последнем мертвом琐锁.
  • Oracle: Информация о мертвых琐锁 записывается в файл предупреждений (alert_SID.log). Можно также использовать представления V$LOCKED_OBJECT и V$SESSION для получения информации о текущих заблокированных объектах и сессиях.
  • SQL Server: Информация о мертвых琐锁 записывается в лог ошибок SQL Server. Также можно использовать SQL Server Profiler или Extended Events для отслеживания событий мертвых琐锁.

2. Мониторинг состояния блокировок

В реальном времени мониторинг состояния блокировок в базе данных позволяет определить, какие транзакты удерживают блокировки и ожидают других блокировок, что помогает выявить корень проблемы мертвых琐锁.- MySQL: Можно использовать команду SHOW PROCESSLIST, чтобы просмотреть информацию о текущих транзакциях и потоках. Для просмотра информации о захвате и ожидании блокировок используйте представления INFORMATION_SCHEMA.INNODB_LOCKS и INFORMATION_SCHEMA.INNODB_LOCK_WAITS.

  • Oracle: Можно использовать представления V$LOCK и V$SESSION для запроса информации о захвате и ожидании блокировок. Для настройки отслеживания событий с целью обнаружения мёртвых琐锁,可以使用DBMS_SYSTEM.SET_EVENTS

3. Анализ последовательности выполнения транзакций

Мёртвые琐锁通常是由于不正确的事务执行顺序引起的。通过分析事务的执行顺序和锁的获取顺序,可以找到可能导致死锁的代码逻辑。

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

4. Моделирование сценария мёртвых琐锁В тестовой среде можно моделировать сценарии, которые приводят к мертвым замкам, что позволяет воспроизводить проблему и анализировать причины мертвого замка более подробно.

5. Проверка кода

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

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

6. Оптимизация производительности базы данных

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

6. Какие распространённые фреймворки распределённых транзакций используются в проектах на Java?В проектах на Java, когда требуется управление транзакциями, которые затрагивают несколько сервисов или баз данных, используются фреймворки распределённых транзакций. Ниже представлены наиболее распространённые:### 1. Seata

  • Описание: Это открытое решение для распределённых транзакций от Alibaba, которое предоставляет пользователю режимы транзакций AT, TCC, SAGA и XA, подходящие для различных сценариев. Поддерживает несколько языков программирования.
  • Сценарии применения: Обработка транзакций между заказами, запасами и платежами в системах электронной коммерции.
  • Преимущества: Предоставляет простые и удобные для использования API, которые могут быть легко интегрированы с Spring Boot и Spring Cloud, снижая сложность разработки распределённых транзакций.
  • Недостатки: В условиях высокой параллельности производительность может быть снижена.

2. Hmily

  • Описание: Это решение для распределённых транзакций с высокой производительностью и нулевой интеграцией, поддерживающее режимы TCC и транзакций с использованием сообщений.
  • Сценарии применения: Управление транзакциями, связанными с переводом средств и обновлением счетов в финансовых системах.
  • Преимущества: Использует дизайн без интеграции, минимально влияющий на бизнес-код; поддерживает несколько моделей RPC, имеет хорошую масштабируемость.
  • Недостатки: Активность сообщества относительно низкая, документация и ресурсы менее доступны.

3. ByteTCC

  • Описание: Это легковесное решение для распределённых транзакций, поддерживающее режимы TCC и XA.- Сценарии применения: Распределённые системы средних и малых предприятий, где требуется высокая согласованность транзакций.
  • Преимущества: Код прост и легко понять и использовать; поддерживает несколько баз данных и серверов приложений.
  • Недостатки: Функциональность ограничена, масштабируемость в сложных сценариях ниже, чем у некоторых крупных фреймворков.

4. Narayana

  • Описание: Это成熟的开源事务管理器,支持JTA、XA、BPM等多种标准和协议。 -> Это成熟的开源事务管理器, поддерживающий JTA, XA, BPM и другие стандарты и протоколы.
  • Применение: Подходит для корпоративных распределённых систем, требующих интеграции с существующими системами и соблюдения стандартных норм.
  • Преимущества: Обладает широким набором функций и хорошей совместимостью, что позволяет интегрировать его с различными Java-серверами приложений и базами данных.
  • Недостатки: Конфигурация может быть сложной, а процесс обучения — затратным.### 5. LCN
  • Описание: Высокопроизводительный распределённый фреймворк для транзакций, использует прокси-подключения и поддерживает компенсацию и согласование транзакций.
  • Применение: Подходит для микросервисных архитектур, где требуется управление транзакциями через несколько сервисов.
  • Преимущества: Высокая производительность и низкая вторжение в бизнес-логику; поддержка различных баз данных и RPC-фреймворков.
  • Недостатки: Не поддерживает вложенные транзакции, что ограничивает его применение в сложных бизнес-сценариях.

7. Какие технологические стеки используются в Spring Cloud?

Spring Cloud предоставляет полный набор решений для микросервисов, охватывающий управление службами, конфигурацию, балансировку нагрузки, отказоустойчивость и многое другое.

1. Открытие и регистрация служб

  • Eureka (Netflix) Устаревший компонент для регистрации и открытия служб, который находится в режиме обслуживания, рекомендуется миграция на другие решения.
  • Nacos (Alibaba) Динамическое открытие служб, управление конфигурацией и метаданными служб, поддерживающее модели AP и CP, стало основным выбором.
  • Consul Управление службами и конфигурациями на основе HashiCorp Consul, поддерживающее многоместные центры и высокую доступность.
  • Zookeeper Управление службами и открытие служб через Apache Zookeeper, подходящее для сценариев CP.---

2. Центральная конфигурация

  • Spring Cloud Config Централизованное управление внешней конфигурацией, поддерживающее Git, SVN и другие хранилища, требует использования Spring Cloud Bus для динамического обновления.
  • Nacos Интегрированное управление конфигурацией, поддерживающее динамическую отправку конфигурации, упрощающее традиционную архитектуру Config + Bus.
  • Consul Config Управление конфигурацией с использованием Key-Value хранилища Consul.

3. Балансировка нагрузки

  • Spring Cloud LoadBalancer Официальный балансировщик нагрузки, заменяющий Ribbon, поддерживает реактивную модель программирования и интегрируется с RestTemplate или WebClient.
  • Ribbon (Netflix) Находится в режиме обслуживания, рекомендуется миграция на LoadBalancer.

4. Разрывы и отказоустойчивость

  • Resilience4j Легкая библиотека для отказоустойчивости, предоставляющая функции разрыва, ограничения и повторных попыток, заменяющая Hystrix.
  • Spring Cloud Circuit Breaker Абстрактный слой, поддерживающий реализации Resilience4j и Sentinel.
  • Sentinel (Alibaba)

5. API-шлюз

  • Spring Cloud Gateway Официально рекомендованная асинхронная неблокирующая API-шлюз, поддерживающая динамическое маршрутизирование, ограничение по количеству запросов, отключение и т.д.
  • Zuul (Netflix) Версия 1.x использует блокирующий модель, постепенно заменяется шлюзом Gateway.### 6. Сервисное взаимодействие
  • OpenFeign Декларативный HTTP-клиент, упрощающий RESTful-взаимодействие между сервисами, поддерживает интеграцию с балансировкой нагрузки и отключением.
  • RestTemplate / WebClient Синхронный (RestTemplate) или асинхронный (WebClient) HTTP-клиент, требует использования LoadBalancer для реализации балансировки нагрузки.

7. Сообщение-ориентированные системы

  • Spring Cloud Stream Абстрактный слой для работы с сообщениями, поддерживающий Kafka, RabbitMQ и т.д., упрощает обработку сообщений через функциональное программирование.
  • Spring Cloud Bus Базируется на сообщениях (например, RabbitMQ), используется для распространения конфигурационных изменений, обеспечивает динамическое обновление конфигураций.

8. Распределённое трассирование

  • Spring Cloud Sleuth Генерирует идентификаторы для трассировки запросов, интегрирует метки трассировки (TraceID, SpanID).
  • Zipkin Распределённая система трассировки, визуализирует цепочки вызовов сервисов и анализирует задержки.
  • SkyWalking Открытая система APM, поддерживающая полное мониторинг, может использоваться как альтернатива Sleuth + Zipkin.

9. Безопасность

  • Spring Cloud Security Предоставляет аутентификацию и авторизацию OAuth2, JWT, поддерживает единую точку входа (SSO) и безопасное взаимодействие между микросервисами.
  • Spring Cloud Vault Управляет чувствительной информацией (например, паролями баз данных, ключами API), интегрирована с HashiCorp Vault.### 10. Распределённые транзакции
  • Seata (Alibaba) Предоставляет распределённые модели транзакций AT, TCC и другие, интегрирована в Spring Cloud Alibaba.

11. Другие инструменты

  • Spring Cloud Contract Контрактное тестирование, гарантирующее согласованность интерфейсов между поставщиками и потребителями услуг.
  • Spring Cloud Task Управление короткоживущими задачами, подходящее для пакетных операций.
  • Spring Cloud Function Абстрагирует бизнес-логику в виде функций, поддерживает развертывание в Serverless.

8. Обзор банковских систем

1. Центральные банковские системы

  1. Центральная банковская система (Core Banking System, CBS) - Функции: Обрабатывает основные банковские операции по депозитам, кредитам, переводам, управлению клиентскими счетами, расчету процентов и учёту счетов. - Основные модули: Депозиты, кредиты, платежи и расчёты, общий бухгалтерский учёт (General Ledger, GL), управление данными клиентов (Customer Information Management, CIF).### 2. Поддерживающие системы
  2. Система управления рисками (Risk Management System) - Функции: Анализирует и управляет финансовыми рисками, включая кредитные, рыночные и ликвидационные риски.
  3. Система управления качеством обслуживания (Quality of Service Management System) - Функции: Оценивает и улучшает качество обслуживания клиентов, включая скорость обслуживания, удобство использования и удовлетворенность клиентов.
  4. Система управления регуляторными требованиями (Regulatory Compliance Management System) - Функции: Обеспечивает соответствие банковских операций регуляторным требованиям, включая отчетность, внутренний контроль и аудит.### Основные системы1. Технические характеристики
  • Технические особенности: высокая пропускная способность, надёжность, обычно основаны на крупных серверах (например, IBM zSeries) или распределённой архитектуре (например, микросервисы).
  1. Системы платежей и расчетов
    • Национальные платежи
      • CNAPS (Китайская система современных платежей): включает в себя систему больших платежей (HVPS) и систему малых платежей (BEPS).
      • UnionPay (платформа UnionPay): обрабатывает сетевые платежи третьих сторон.
    • Международные платежи: SWIFT (общий финансовый телекоммуникационный стандарт для банков), система расчетов по юаням за рубежом (CIPS).

Второй раздел: каналы

  1. Онлайн-каналы
    • Интернет-банкинг/мобильный банкинг: предоставляет услуги перевода, управления активами, оплаты счетов онлайн.
    • WeBank/микросервисы: легкий доступ к услугам, интегрированный с маркетингом и бизнес-процессами.
    • Открытый банкинг (Open Banking): через API интегрируется с платформами третьих сторон (например, электронной коммерции, государственного управления), расширяя сценарии использования.2. Оффлайн-каналы
    • ATM/CRS (автоматы для приема и выдачи наличных): прием и выдача наличных, переводы, запросы.
    • Система POS (точка продаж): обработка транзакций с использованием карт, интеграция с UnionPay/ассоциациями карт.
    • Умные кассы (VTM): автономное обслуживание открытия счетов, подписания договоров и других сложных операций.3. Центры обслуживания клиентов (Call Center)
    • Интеграция IVR (интерактивного голосового ответа), CRM (системы управления взаимоотношениями с клиентами), поддержка услуг телефонного банкинга.

Третий раздел: системы риск-менеджмента и регулирования

  1. Системы управления рисками

    • Кредитный риск: кредитная оценка, мониторинг после выдачи кредита, пятиуровневая классификация, стресс-тестирование.
    • Рыночный риск: мониторинг колебаний процентных ставок, валютных курсов и цен на товары (например, модель VaR).
    • Операционный риск: мониторинг поведения сотрудников, борьба с мошенничеством (например, выявление аномальных транзакций).
  2. Системы соответствия и противодействия отмыванию денег (AML)

    • Системы противодействия отмыванию денег: отчеты о крупных транзакциях, мониторинг подозрительных транзакций (например, использование AI для выявления аномальной денежной деятельности).
    • KYC (know your customer): верификация личности, проверка черных списков (например, связанных с санкционными списками).
  3. Системы аудита и внутреннего контроля

    • Запись аудиторских следов, анализ операционных журналов, проверка соответствия нормативам.

Четвертый раздел: промежуточные услуги1. Системы управления активами и инвестициями

  • Продажа продуктов управления активами, управление портфелями активов, распределение доходов.
  • Интеграция с фондами, страховыми компаниями, драгоценными металлами (например, "финансовая торговая платформа").2. Системы управления кредитными картами
  • Управление выпуском карт, контроль лимитов, рассрочка платежей, обмен бонусов.
  • Реальное время взаимодействие с ассоциациями карт (UnionPay, Visa, Mastercard).
  1. Системы международных операций
    • Обмен валют, аккредитивы (L/C), гарантии, международное финансирование.

5. Операционная поддержка системы

  1. Финансовая система управления (FMS) - Расчет затрат на уровне всего банка, анализ прибыли, управление бюджетом.
  2. Система управления персоналом (HRMS) - Оценка производительности сотрудников, выплата зарплаты, управление обучением.
  3. Система управления взаимоотношениями с клиентами (CRM) - Клиентская сегментация (идентификация VIP-клиентов), точечная маркетинговая стратегия, предупреждение о потере клиентов.
  4. Система отчетности для регуляторов - Автоматическое создание и отправка отчетов регуляторам (например, отчет 1104, система EAST).------

6. Системы, приведенные в действие новыми технологиями

  1. Платформа больших данных - Портрет клиента, обучение моделей противодействия мошенничеству, реальное время риск-менеджмента (например, потоковая обработка данных с помощью Flink).
  2. Применение блокчейна - Финансирование снабженческо-логистической цепочки, международные платежи (например, Центральный банк цифровой валюты DCEP), электронное хранение доказательств.
  3. Искусственный интеллект (AI) - Интеллектуальные чат-боты, RPA (автоматизация процессов), автоматическая проверка кредитоспособности.
  4. Облачные native системы - На основе контейнеризации (Kubernetes) и микросервисной архитектуры для эластичного масштабирования (например, частное облако/гибридное облако).------

7. Пример типичной архитектуры банковской системы

  • Государственные крупные банки/банки с акционерным капиталом:
  • Ядро системы: IBM Mainframe + DB2 (традиционная) или распределенная архитектура (например, Alibaba Cloud, Huawei Cloud).
  • Платежная система расчетов: собственная CNAPS прямая связь, поддерживает расчеты bk 7x24 часов.
  • Городские коммерческие банки/сельскохозяйственные банки:
  • Возможно использование внешнего ядра системы (например, Longshine Technology, Kingdee Solutions).

9. Какие стратегии существуют для обеспечения стабильности микросервисов?

Стабильность микросервисов должна быть гарантирована на всем жизненном цикле — от проектирования до эксплуатации. Основные принципы заключаются в предотвращении сбоев, быстром обнаружении и автоматическом восстановлении. В рамках этих стратегий следует выбирать подходящие инструменты (например, Spring Cloud Alibaba, Istio service mesh) и постоянно оптимизировать архитектуру для создания высоконадежной распределенной системы.### 1. Механизмы отказоустойчивости и разрывов

  • Механизм разрыва (Circuit Breaker) Когда количество последовательных ошибок достигает порогового значения, механизм разрыва автоматически отключает запросы, чтобы предотвратить цепную реакцию сбоев (например, Netflix Hystrix, Resilience4j, Sentinel).
  • Падение сервиса (Fallback) При недоступности сервиса или превышении времени ответа возвращается значение по умолчанию или упрощенная логика, чтобы гарантировать работу основных функций.
  • Ограничение трафика и контроль скорости Используя алгоритмы, такие как бакет с токенами и бакет с дырами, ограничивается объем входящих запросов (например, Sentinel, Redis + Lua), чтобы предотвратить перегрузку сервиса внезапным увеличением нагрузки.------

2. Открытие сервисов и балансировка нагрузки

  • Динамическое открытие и регистрация сервисов Использование сервисного регистратора (например, Eureka, Consul, Nacos) для управления состоянием экземпляров, автоматическое удаление неработающих узлов.
  • Умная балансировка нагрузки

3. Мониторинг и оповещение

  • Полносвязный мониторинг Интеграция APM-инструментов (например, SkyWalking, Zipkin) для отслеживания цепочек запросов и выявления мест с низкой производительностью.
  • Сбор и визуализация метрик Использование Prometheus + Grafana для мониторинга ключевых показателей, таких как CPU, память, процент ошибок.
  • Централизованное управление логами Использование ELK (Elasticsearch, Logstash, Kibana) или Loki для агрегации и анализа логов.
  • Реальное время оповещения Установка пороговых значений (например, процент ошибок >5% или задержка >1с) для активации оповещений (например, Prometheus Alertmanager).

4. Повторные попытки и атомарность

  • Настройка стратегии повторных попыток Ограниченное количество экспоненциальных попыток повтора (чтобы избежать эффекта снежного кома), совмещенное с механизмом таймаута (например, Deadline в gRPC).
  • Атомарность интерфейсов Использование уникальных идентификаторов (например, UUID, бизнес-идентификатора) для обеспечения того, чтобы повторные запросы не приводили к побочным эффектам.### 5. Асинхронная коммуникация и очереди сообщений
  • Архитектура событийного драйвера Использование очередей сообщений (например, Kafka, RabbitMQ) для декомпозиции сервисов и достижения конечной согласованности.
  • Очередь сообщений смертных Обработка сообщений, которые не были доставлены, чтобы избежать потери сообщений или блокировки нормального процесса.

6. Управление конфигурациями

  • Динамический центр управления конфигурациями Централизованное управление конфигурациями (например, Apollo, Nacos, Spring Cloud Config) с поддержкой реального времени обновлений.
  • Изолированная среда Разделение конфигураций для сред разработки, тестирования и производства для предотвращения ошибочных действий.

7. Автоматизация операций

  • CI/CD конвейеры Автоматизация тестирования, сборки и развертывания (например, Jenkins, GitLab CI) для быстрого откатывания проблемных версий.
  • Контейнеризация и оркестрация Использование Docker + Kubernetes для реализации эластичного масштабирования, самоисцеления и постепенного обновления.### 8. Управление базами данных и транзакциями
  • Изолированное управление базами данных Каждый микросервис имеет свою отдельную базу данных для предотвращения связывания таблиц.
  • Компенсационные распределенные транзакции Использование модели Saga (например, Seata) или TCC (Try-Confirm-Cancel) для достижения конечной согласованности.
  • Чтение и запись в отдельных базах данных Увеличение пропускной способности баз данных и снижение нагрузки на одиночные точки.### 9. Подготовка к нагрузке и планирование емкости
  • Хаотическое инженерство Моделирование отказов (например, задержка сети, отказ узла) для проверки устойчивости системы (ChaosBlade, Chaos Monkey).
  • Базовые тесты производительности Периодическое тестирование нагрузки (например, JMeter, Gatling) для оценки емкости системы и оптимизации узких мест.

10. Защита от отказа и резервное копирование

  • Множественная зона доступности Распределение сервисов между несколькими зонами доступности для предотвращения отказа одной зоны.
  • Резервное копирование и восстановление данных Периодическое создание резервных копий баз данных и конфигураций, разработка плана восстановления после аварии (DR).

10. Какие состояния имеет запуск pod в k8s?

В Kubernetes (K8s) процесс запуска pod проходит через несколько состояний, наиболее распространённые из которых следующие:1. Ожидание: Pod принят системой Kubernetes, но еще не распределен на узел или ожидает распределения ресурсов, загрузки образов контейнеров и т.д. 2. Создание контейнера: Kubernetes создает контейнеры внутри pod на узле, в это время происходит загрузка образов контейнеров, инициализация окружения контейнера и т.д. 3. Запущено: Pod распределено на узел и все контейнеры успешно созданы и работают. В этом состоянии приложения внутри pod работают нормально и могут предоставлять услуги внешним потребителям. 4. Успешно завершено: Все контейнеры внутри pod успешно завершили свою работу и вышли. Обычно это указывает на завершение задачи. В этом состоянии pod больше не будет автоматически перезапущен системой Kubernetes. 5. Неудача: Контейнеры внутри pod завершили работу с ошибкой, например, из-за ошибки в приложении внутри контейнера или ошибки команды запуска контейнера. В этом случае pod может быть перезапущен согласно политике перезапуска, или он может остаться в состоянии "ошибка" до вмешательства человека. 6. Неизвестно: Kubernetes не может точно определить состояние pod, обычно из-за проблем с коммуникацией с узлом или средой выполнения контейнера. В этом случае требуется дальнейшее расследование сети кластера, состояния узлов и т.д.## 11. Какие типы ресурсов есть в k8s? Типы ресурсов в Kubernetes (k8s) являются ключевыми компонентами управления и координации контейнеризированных приложений, охватывая такие аспекты, как развертывание приложений, сеть, хранение, конфигурация, безопасность и т.д. Ниже приведены основные типы ресурсов в Kubernetes и их назначение:

1. Загрузки (Workloads)

Управление способом выполнения и жизненным циклом контейнеризированных приложений.| Тип ресурса | Назначение | Примеры использования | | :-------------- | :------------- | :------------------------- | | Pod | Наименьшая единица распределения, содержащая один или более контейнеров с общим хранилищем/сетью. | Временные задачи, односвязные приложения или тесно связанные многоконтейнерные приложения. | | Deployment | Управление набором экземпляров безсостоятельных приложений, поддерживающее поэтапное обновление и откат. | Веб-сервисы, сервисы API и т. д. | | StatefulSet | Управление набором экземпляров состоятельных приложений, обеспечивающее стабильные сетевые идентификаторы и постоянное хранение. | Базы данных (например MySQL, Redis), распределенные системы хранения. | | DaemonSet | Обеспечивает запуск одного экземпляра Pod на каждом узле (или на указанных узлах). | Сбор логов (Fluentd), агенты мониторинга (Node Exporter). | | Job | Запускает одноразовые задачи, после завершения которых Pod прекращает работу. | Обработка данных, задания batch-обработки. | | CronJob | Запускает задачи периодически, аналогично cron в Linux. | Периодическое создание резервных копий, регулярная очистка данных. | | ReplicaSet | Обеспечивает запуск указанного количества экземпляров Pod (обычно управляемых Deployment). | Управление репликами на уровне кластера, обычно не используется напрямую. |

**2.**Сервисы и сеть (Service & Networking)

Экспонируются приложения, управляются потоки и сетевые политики.

Тип ресурса Цель Типичные сценарии
Service Определяет точки доступа для группы Pod, обеспечивая балансировку нагрузки и стабильный IP/DNS. Внутренняя коммуникация сервисов, экспонирование внешнего доступа (ClusterIP, NodePort, LoadBalancer).
Ingress Управляет маршрутизацией внешнего HTTP/HTTPS трафика к сервисам внутри кластера, поддерживает маршрутизацию по пути или домену. Предоставление внешних web-сервисов, единое управление входящими запросами.
Endpoint Записывает IP и порты Pod, находящихся за Service, автоматически поддерживаемые Kubernetes. Сценарии пользовательского открытия сервисов (например, интеграция с внешними сервисами).
NetworkPolicy Определяет правила сетевой коммуникации между Pod (разрешение/отказ от трафика). Реализация сетевого разделения микросервисов (например, разрешение только для определённых пространств имен).

3. Хранилище (Storage)

Управление устойчивым хранением данных. | Тип ресурса | Цель | Типичные сценарии | | :------------------------------ | :----------------------------------------------------------- | :--------------------------------------------- | | PersistentVolume (PV) | Уровень кластера для хранения ресурсов (например, облачные диски, NFS). | Предоставление устойчивого хранения для Pod. | | | PersistentVolumeClaim (PVC) | Заявка пользователя на требуемые объемы хранилища (связана с PV). | Определение требуемых размеров хранилища и режима доступа. | | StorageClass | Шаблон для динамического создания PV, определяющий тип и параметры хранилища (например, конфигурация облачного провайдера). | Динамическое выделение хранилищ по мере необходимости (например, AWS EBS, GCE PD). | | Volume | Определение тома хранения, используемого контейнерами в Pod (временный или постоянный). | Монтирование файлов конфигурации, общего хранилища (emptyDir, hostPath). |

4. Конфигурация и идентификация (Config & Identity)

Управление конфигурацией приложений и контролем доступа.

Тип ресурса Цель Типичные сценарии
ConfigMap Хранение незащищенной конфигурационной информации (например, переменных окружения, файлов конфигурации). Разделение конфигурации приложения (адрес базы данных, уровень логирования).
ServiceAccount Назначение идентификатора для Pod для доступа к API Kubernetes. Управление правами доступа Pod к ресурсам кластера.
Role Определение правил доступа в пространстве имен (например, операции над Pod, Service). Ограничение доступа разработчиков к определенным ресурсам в пространстве имен.
RoleBinding Привязка Role или ClusterRole к пользователю, группе или ServiceAccount. Аутентификация ServiceAccount для выполнения определенных действий.
ClusterRole Определение правил доступа на уровне кластера (например, операции над узлами, PV). Права администратора, управление ресурсами между пространствами имен.
ClusterRoleBinding Привязка ClusterRole к пользователю, группе или ServiceAccount. Предоставление прав управления на уровне кластера.

5. Управление кластером (Cluster Management)

Управление ресурсами и политиками кластера. | Тип ресурса | Цель | Типичные сценарии || | Namespace | Логическая изоляция кластера ресурсов (например, Pod, Service), реализация многоtenant-среды. | Разделение сред разработки, тестирования и производства. || ResourceQuota | Ограничение использования ресурсов в пространстве имен (например, CPU, память, количество Pod). | Предотвращение злоупотребления ресурсами, обеспечение справедливого распределения. | | LimitRange | Ограничение запросов и ограничений ресурсов для отдельных контейнеров/Pod в пространстве имен. | Предотвращение перегрузки узлов из-за отсутствия настроек ограничений ресурсов для контейнеров. | | PodDisruptionBudget | Обеспечение наличия указанного количества Pod в рабочем состоянии во время обслуживания (например, обновления узлов). | Обеспечение высокой доступности критических приложений. |

6. Автоматическое масштабирование (Auto Scaling)

Динамическое изменение ресурсов для сопротивления изменениям нагрузки.

Тип ресурса Цель Типичные сценарии
HorizontalPodAutoscaler (HPA) Автоматическое масштабирование количества экземпляров Pod на основе использования CPU/памяти или других пользовательских метрик. Ответ на пиковые нагрузки, автоматическое масштабирование веб-сервисов.
VerticalPodAutoscaler (VPA) Автоматическое изменение запросов и ограничений ресурсов для Pod (необходимо использовать с осторожностью). Оптимизация распределения ресурсов, предотвращение избыточной конфигурации.

**7.Расширенные ресурсы (Custom Resources)

Расширение API Kubernetes с помощью CRD.

Тип ресурса Цель Типичные сценарии
CustomResourceDefinition (CRD) Определение типов пользовательских ресурсов, расширение функциональности Kubernetes. Реализация модели Operator (например, управление базами данных, промежуточного программного обеспечения).

8. Другие ключевые ресурсы

Тип ресурса Цель
Event Запись изменений состояния ресурсов в кластере и журнал действий (например, неудачное расписание Pod, ошибки загрузки образа).
Node Представляет рабочие узлы в кластере, содержит информацию о состоянии узла и ресурсах.

12. Какие типы данных есть в Java и сколько байт они занимают

1. Базовые типы данных

Базовые типы данных хранят конкретные значения данных. Java предоставляет 8 базовых типов данных, вот их размер в байтах и диапазон значений.

Тип данных Размер в байтах Диапазон значений
byte 1 байт -128 до 127
short 2 байта -32768 до 32767
int 4 байта -2147483648 до 2147483647
------------ --------------- ------------------------------------------------------------------------------------------------------
long 8 байт -9223372036854775808 до 9223372036854775807
float 4 байта Приблизительно ±3.40282347E+38F (эффективное количество цифр около 6 - 7)
double 8 байт Приблизительно ±1.79769313486231570E+308 (эффективное количество цифр около 15)
char 2 байта '\u0000' до '\uffff' (то есть от 0 до 65535)
boolean Не указано true или false

2. Ссылочные типы данных

Ссылочные типы данных хранят адреса объектов, а не сами объекты. Обычные ссылочные типы данных включают:

  • Класс (Class): Это пользовательский тип данных, который позволяет вам определять свойства и методы класса. Например, класс String является встроенным классом Java, используемым для работы со строками.
  • Интерфейс (Interface): Интерфейс определяет подпись методов, но не содержит их реализации. Класс может реализовать один или несколько интерфейсов.
  • Массив (Array): Массив представляет собой упорядоченную коллекцию данных одного типа. Например, int[] — это массив целых чисел, String[] — это массив строк. Размер памяти, занимаемый ссылочными типами данных, зависит от конкретного объекта и реализации виртуальной машины. Обычно ссылка сама по себе занимает 4 байта (в 32-битной виртуальной машине) или 8 байт (в 64-битной виртуальной машине).

13. Действия на уровне реализации HashMap и механизм расширения

1.Действия на уровне реализации

Реализация HashMap основана на хэш-таблице, которая использует массив + связанный список + красно-черное дерево. До JDK 1.8 использовался массив + связанный список, а с JDK 1.8 введено использование красно-черного дерева для оптимизации.

1. Массив

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

2. Связанный список

Когда несколько ключей вычисляются с помощью хеш-функции и получают одинаковое позиционное значение, возникает конфликт хеш-функции. До JDK 1.8 HashMap использовал метод цепочек для решения конфликтов хеш-функции, то есть конфликтующие пары ключ-значение хранились в виде связного списка в одной корзине.

3. Красно-черное дерево

В JDK 1.8 была введена оптимизация с использованием красно-черного дерева. Когда длина связного списка достигает определенного порога (по умолчанию 8) и длина массива достигает 64, связный список преобразуется в красно-черное дерево для повышения эффективности поиска. Когда количество узлов в красно-черном дереве меньше или равно 6, дерево преобразуется обратно в связный список.

Вторая часть: Механизм расширенияМеханизм расширения HashMap в основном связан с двумя параметрами: емкостью (capacity) и коэффициентом заполнения (load factor).

1. Емкость

Емкость представляет собой длину массива в HashMap. Изначальная емкость по умолчанию равна 16. При каждом расширении емкость удваивается.

2. Коэффициент заполнения

Коэффициент заполнения — это число с плавающей запятой, по умолчанию равное 0.75. Он указывает, насколько полной должна быть HashMap перед тем, как будет запущено расширение. Когда количество пар ключ-значение превышает произведение емкости на коэффициент заполнения, происходит запуск механизма расширения.

3. Процесс расширения

  • Создание нового массива: При необходимости расширения HashMap создает новый массив, длина которого в два раза больше исходного.
  • Пересчет хеш-значений: Все пары ключ-значение из исходного массива пересчитываются с новыми хеш-значениями и заново вставляются в новый массив. Из-за изменения длины массива индексные позиции пар ключ-значение могут измениться.

Третья часть: Нитезависимость

HashMap является нитезависимым, в то время как ConcurrentHashMap является нитезависимым. Ниже представлены конкретные объяснения:

Причины нитезависимости HashMap

  • Потенциальное разрушение структуры данных при многонитевом доступе: В многонитевом окружении, когда несколько нитей одновременно выполняют операцию put для HashMap, если происходит расширение, может возникнуть ситуация, когда связный список образует цикл, что приведет к появлению бесконечного цикла при прохождении по HashMap.
  • Проблема перекрытия данных: Когда несколько нитей одновременно выполняют операцию put для различных ключей, может произойти перекрытие данных. Это происходит потому, что при вычислении хеш-значений и индексов различные нити могут получить одинаковые результаты, что приводит к тому, что данные, вставленные последней нитью, перекрывают данные, вставленные первой нитью.

14. Механизмы обеспечения нитезависимости ConcurrentHashMap

  • Технология разделения блокировки (JDK 1.7)

    • В JDK 1.7 ConcurrentHashMap использует технологию разделения блокировки, которая делит всю хеш-таблицу на несколько сегментов (Segment), каждый из которых независимо блокируется.
    • Когда несколько потоков одновременно обращаются к различным сегментам данных, возникает ситуация, при которой отсутствуют конфликты, что повышает эффективность параллельного доступа. Конфликтные блокировки необходимы только в том случае, если несколько потоков обращаются к одному и тому же сегменту данных.
  • CAS + синхронизация (JDK 1.8 метод)

    • В JDK 1.8 ConcurrentHashMap использует метод CAS (Compare and Swap) вместе с синхронизацией, что позволяет избежать блокировок и повысить производительность. - В JDK 8 произошли оптимизации в ConcurrentHashMap, где больше не используется метод разделения блоков на сегменты, а вместо этого используются операции CAS (Compare and Swap) и ключевое слово synchronized для обеспечения безопасности потока.
      • При добавлении элемента сначала выполняется попытка использования операции CAS для вставки элемента в указанное место. Если операция CAS не удалась, это указывает на то, что в этом месте уже существует элемент, и тогда используется ключевое слово synchronized для блокировки узла в этом месте, после чего выполняется операция вставки.
      • Для операций чтения благодаря ключевому слову volatile гарантируется получение последней версии данных, поэтому блокировка не требуется. Кроме того, ConcurrentHashMap использует различные оптимизационные приемы, такие как использование длины массива, которая всегда является степенью двойки, и вычисление хеш-значений и индексов с помощью битовых операций, что повышает производительность вычислений.
      • HashMap может столкнуться с проблемами несогласованности данных и разрушения структуры при многопоточной работе, в то время как ConcurrentHashMap использует различные механизмы для обеспечения безопасности потока и максимизации производительности параллельного доступа.

    15. Состав JVM-памятиJVM (Java Virtual Machine) состоит из областей памяти, которые являются общими для всех потоков и областей памяти, которые являются частными для каждого потока.

1. Частные области потока

Программный счетчик (Program Counter Register)

  • Функция: Это небольшая область памяти, которая используется для записи номера строки текущего исполняемого потоком байт-кода. В многопоточной среде каждый поток имеет свой собственный счетчик программ, который позволяет восстановить положение исполнения при переключении потоков.
  • Характеристика: Эта область — единственная в спецификации JVM, где не предусмотрены случаи возникновения ошибки OutOfMemoryError.

Виртуальная машина стека (Java Virtual Machine Stacks)

  • Функция: Каждый Java-метод создает стековый кадр, который используется для хранения локальных переменных, стека операндов, динамической связи, информации о выходе из метода и т. д. Вызовы и возвраты методов соответствуют операциям ввода и вывода стекового кадра в стеке виртуальной машины.

  • Аномалии: Если запрос потока на глубину стека превышает допустимую глубину стека виртуальной машины, будет выброшено исключение StackOverflowError. Если стек виртуальной машины может динамически расширяться, но не удается получить достаточно памяти при расширении, будет выброшено исключение OutOfMemoryError.#### Локальный стек (Native Method Stacks)

  • Функция: Аналогичен стеку виртуальной машины, но служит для работы с местными методами (методами, реализованными на языках, отличных от Java). Локальная стековая память предоставляет пространство для хранения данных, используемых локальными методами.

  • Исключительные ситуации: как и в случае с виртуальной стековой памятью, могут возникнуть исключения StackOverflowError и OutOfMemoryError.### 2. Общие области для всех потоков

Куча (Heap)

  • Функциональность: Это самая большая область памяти в JVM, доступная всем потокам. Она используется для хранения объектов и массивов. Большинство объектов, созданных с помощью ключевого слова new, выделяются в куче.
  • Сборка мусора: Куча является основной областью для сборки мусора. В зависимости от жизненного цикла объектов, куча может быть разделена на молодую (Eden) и старую (Old) области.
  • Исключительные ситуации: Когда куча больше не может выделить память для новых объектов, возникает исключение OutOfMemoryError.

Оперативная зона методов (Method Area)

  • Функциональность: Это общая область памяти для всех потоков, используемая для хранения информации о загруженных классах, константах, статических переменных и скомпилированном коде JIT.
  • Реализация: До JDK 1.7 оперативная зона методов также называлась постоянной областью; начиная с JDK 1.8, постоянная область была заменена метасpace (Metaspace), который использует локальную память вместо памяти JVM.
  • Исключительные ситуации: Когда метасpace не может удовлетворить запросы на выделение памяти, возникает исключение OutOfMemoryError.

Пул постоянных значений (Runtime Constant Pool)

  • Функциональность: Это часть оперативной зоны методов, используемая для хранения различных литералов и символьных ссылок, созданных во время компиляции.Эти значения помещаются в пул постоянных значений после загрузки класса. Во время выполнения новые постоянные значения также могут быть добавлены в пул, например методом intern() класса String.
  • Исключительные ситуации: Когда пул постоянных значений больше не может выделить память, возникает исключение OutOfMemoryError.

3. Прямая память (Direct Memory)

  • Функциональность: Хотя прямая память не является частью областей данных JVM, она часто используется в Java-приложениях. Прямая память представляет собой внешнюю память, выделенную через класс DirectByteBuffer пакета NIO, что может повысить производительность операций ввода-вывода.
  • Исключительные ситуации: Поскольку прямая память не ограничена размером кучи JVM, но ограничена общим объемом локальной памяти и системой, при слишком большом использовании прямой памяти может возникнуть исключение OutOfMemoryError.

16. Алгоритмы сборки мусора в JVM

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

1. Алгоритм маркировки и очистки (Mark-Sweep)

1. Маркер-сборщик (Mark-Sweep)

  • Принцип работы: Алгоритм состоит из двух этапов — "маркировки" и "очистки".На этапе маркировки сборщик мусора начинает с корневых объектов (например, ссылок в стеке, статических переменных и т. д.) и проходит по всем живым объектам, помеча их как активные. На этапе сборки освобождается память, занятая объектами, которые не были помечены (то есть мусором).

  • Преимущества и недостатки: Преимущество заключается в простоте реализации; недостаток — образование большого количества фрагментов памяти, что со временем может привести к невозможности выделения непрерывной памяти для больших объектов, что в свою очередь может вызвать преждевременную активацию нового цикла сборки мусора.### 2. Копирующий алгоритм (Copying)

  • Принцип работы: Доступная память делится на две равные части по объему. В каждый момент времени используется только одна часть. Когда эта часть заполняется, все еще живые объекты копируются в другую часть, а затем очищается использованная память.

  • Преимущества и недостатки: Преимущество — простота реализации и высокая эффективность сборки мусора, отсутствие образования фрагментов памяти; недостаток — уменьшение доступной памяти на половину, что снижает эффективность использования памяти. Этот алгоритм часто используется для сборки мусора в молодой генерации, так как большинство объектов в молодой генерации имеют короткий срок жизни, и количество живых объектов невелико, что делает копирование относительно дешёвым.### 3. Маркер-упаковщик (Mark-Compact)

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

  • Преимущества и недостатки: Преимущество — решение проблемы фрагментации памяти, возникающей при работе с маркер-сборщиком, и избежание низкой эффективности использования памяти, характерной для копирующего алгоритма; недостаток — дополнительные затраты на перемещение объектов, что снижает общую эффективность. Этот алгоритм часто используется для сборки мусора в старой генерации, так как объекты в старой генерации имеют длительный срок жизни, и затраты на перемещение объектов могут быть приемлемыми.### 4. Генерационная коллекция (Generational Collection)

  • Принцип работы: Память разделяется на различные области в зависимости от срока жизни объектов, обычно на молодую и старую генерацию. В молодой генерации объекты имеют короткий срок жизни, поэтому используются копирующие алгоритмы для сборки мусора; в старой генерации объекты имеют длительный срок жизни, поэтому используются маркер-сборщик или маркер-упаковщик для сборки мусора.

  • Преимущества и недостатки: Преимущество — объединение преимуществ различных алгоритмов, выбор подходящего алгоритма сборки мусора в зависимости от характеристик объектов, что повышает эффективность сборки мусора; недостаток — необходимость разбиения и управления кучей памяти, что увеличивает сложность системы.### 5. Инкрементальная коллекция (Incremental Collection)

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

Преимущества и недостатки: Преимуществом является снижение времени простоя при сборке мусора; недостатком является увеличение общего времени сборки мусора, так как между каждым шагом сборки требуется сохранение и восстановление контекста.### 6. Алгоритм областей (Region-Based)

  • Принцип работы: Вся область кучи разбивается на несколько равных по размеру областей (Regions), каждая из которых может быть молодым поколением, старшим поколением или другим специальным регионом. При сборке мусора, сборка происходит по областям, выбирая подходящий алгоритм сборки мусора в зависимости от состояния объектов в каждой области.
  • Преимущества и недостатки: Преимуществом является более гибкое управление памятью и повышение эффективности сборки мусора; недостатком является усложнение управления памятью.

Различные алгоритмы сборки мусора имеют свои преимущества и недостатки. JVM выбирает наиболее подходящий алгоритм сборки мусора в зависимости от конкретной сценария использования и конфигурации системы, чтобы достичь наилучшей производительности и эффективности использования ресурсов.## 17. Какие основные типы движков хранения используются в MySQL?

1. InnoDB

  • Характеристики
    • Поддержка транзакций: InnoDB — это движок хранения MySQL, поддерживающий транзакции, который следует принципам ACID (атомарность, согласованность, изолированности, долговечности). Это позволяет гарантировать целостность и согласованность данных при выполнении бизнес-логики, которая включает несколько операций. Например, при банковских транзакциях использование движка хранения InnoDB гарантирует, что транзакция либо полностью завершается успешно, либо полностью проваливается.
    • Строковый замок: Использует механизм строкового замка, при параллельных операциях замкиваются только те строки, которые требуются для операции, а не весь таблицы. Это повышает параллелизм и снижает конфликты замков, позволяя нескольким транзакциям одновременно работать с различными строками.
    • Ограничения внешних ключей: Поддерживает ограничения внешних ключей, что помогает поддерживать целостность ссылок на данные. Когда определены внешние ключи, MySQL автоматически проверяет, соответствуют ли операции вставки, обновления и удаления условиям ограничений внешних ключей. - Восстановление после сбоя: Обладает возможностью восстановления после сбоя, что позволяет автоматически восстановиться до состояния согласованности после сбоя базы данных или её необычного закрытия, обеспечивая безопасность данных.
  • Пригодность: Подходит для приложений, где требуется высокая поддержка транзакций, таких как системы онлайн-транзакций, финансовые системы и т. д.

2. MyISAM

  • Характеристики
    • Неподдержка транзакций: MyISAM не поддерживает транзакции, что означает, что он не может гарантировать атомарность группы операций.
    • Табличные блокировки: Используются табличные блокировки, при этом во время записи блокируется вся таблица, что приводит к снижению производительности параллельных записей.
    • Полнотекстовый индекс: Поддерживает полнотекстовые индексы, позволяющие быстро выполнять полнотекстовые поиски, что подходит для сценариев, требующих полнотекстового поиска.
    • Размер и производительность: Занимает относительно мало места, поэтому для некоторых только для чтения или редко используемых таблиц MyISAM обеспечивает высокую производительность запросов.
  • Пригодность: Подходит для приложений, где требуется высокая производительность запросов, но низкая требовательность к транзакциям, таких как веб-сайты новостей, блоги и т. д.

3. Memory

  • Характеристики ### 4. Архив
    • особенности
    • сжатие данных: данные хранятся с использованием алгоритма сжатия, что значительно уменьшает использование места на диске.
    • поддержка только вставок и выборок: поддерживаются только операции INSERT и SELECT, операции UPDATE и DELETE не поддерживаются.
    • высокая производительность вставок: благодаря специальному структурированию данных движок Archive имеет высокую производительность вставок.
  • пригодность: подходит для хранения больших объемов исторических данных, таких как логи, архивные данные и т. д.

5. Кластер NDB

  • особенности - кластерное хранение: NDB Cluster — это распределённый движок хранения, который поддерживает хранение и обработку данных на нескольких узлах, обеспечивая высокую доступность и масштабируемость. - поддержка транзакций: поддерживает транзакционную обработку, гарантирующую целостность и согласованность данных. - автоматическое шарпинг: может автоматически распределять данные между различными узлами, повышая производительность чтения и записи данных.
  • пригодность: подходит для крупных приложений, где требуется высокая доступность и масштабируемость данных, таких как электронная коммерция, социальные сети и т. д. Эти движки хранения имеют свои преимущества и недостатки, и при выборе движка хранения следует учитывать конкретные требования приложения, такие как транзакционная обработка, параллельная производительность, безопасность данных, использование места и т. д.

18. По умолчанию какой уровень изоляции используется в InnoDB?

По умолчанию уровень изоляции READ COMMITTED используется в InnoDB.В MySQL по умолчанию уровень изоляции транзакций для движка InnoDB установлен на уровне повторяемого чтения (REPEATABLE READ). Уровень изоляции повторяемого чтения гарантирует, что при выполнении одного и того же запроса несколько раз в рамках одной транзакции результат будет всегда одинаковым. То есть во время выполнения транзакции изменения данных другими транзакциями не влияют на результаты запросов внутри текущей транзакции.

Реализация

  • MVCC (множественные версии параллельного управления): InnoDB использует MVCC для достижения уровня изоляции повторяемого чтения. При выполнении операций чтения InnoDB не читает самую свежую версию данных, а вместо этого читает снимок данных, существовавший в момент начала транзакции. Таким образом, даже если другие транзакции изменяют данные во время выполнения текущей транзакции, последняя может читать версию данных, существовавшую в момент начала транзакции.
  • Заклинивание промежутков (Gap Locking): Чтобы предотвратить фантомные чтения, InnoDB использует заклинивание промежутков при уровне изоляции повторяемого чтения. Когда транзакция выполняет диапазонное чтение, InnoDB блокирует промежутки диапазона, чтобы предотвратить вставку новых данных другими транзакциями в этот промежуток.Это гарантирует, что повторное выполнение одного и того же диапазонного запроса в рамках одной и той же транзакции будет давать одинаковый набор результатов.

Пример кода

Ниже представлен код, демонстрирующий эффект уровня изоляции повторяемого чтения:

-- Сессия 1
-- Начать транзакцию
START TRANSACTION;
-- Установить уровень изоляции на повторяемое чтение
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
-- Выполнить запрос данных
SELECT * FROM your_table WHERE id = 1;
-- Здесь можно выполнять другие действия, моделирующие процесс выполнения транзакции
-- Второй раз выполнить тот же запрос данных
SELECT * FROM your_table WHERE id = 1;
-- Подтвердить транзакцию
COMMIT;
```-- Сессия 2
-- В течение выполнения транзакции в сессии 1 можно попытаться изменить данные
UPDATE your_table SET column_name = 'новое_значение' WHERE id = 1;

В этом примере сессия 1 начинает транзакцию с уровнем изоляции повторяемого чтения и выполняет два одинаковых запроса. Даже если в сессии 2 данные были изменены, результат второго запроса в сессии 1 все еще совпадает с первым запросом, что демонстрирует характеристики уровня изоляции повторяемого чтения.

19. Какие виды индексов используются в MySQL?

1. Обычный индекс

  • Определение: Самый базовый тип индекса, который не имеет никаких ограничений и используется исключительно для ускорения доступа к данным.
  • Способ создания: Может быть создан при создании таблицы или добавлен после создания таблицы.
-- Создание обычного индекса при создании таблицы
CREATE TABLE example_table (
    id INT,
    name VARCHAR(50),
    INDEX idx_name (name)
);
```-- Добавление обычного индекса после создания таблицы
ALTER TABLE example_table ADD INDEX idx_id (id);
  • Пригодность: Подходит для полей, часто используемых в условиях запросов, таких как поля в WHERE и JOIN предложениях.

2. Уникальный индекс

1. Уникальный индекс

  • Определение: Похож на обычный индекс, но требует уникальности значений в индексируемой колонке, допускает значения NULL. В случае составного уникального индекса все комбинации значений должны быть уникальными.
  • Способ создания: sql
    -- Создание уникального индекса при создании таблицы
    CREATE TABLE unique_table (
        id INT,
        email VARCHAR(100),
        UNIQUE INDEX idx_email (email)
    );
    -- Добавление уникального индекса после создания таблицы
    ALTER TABLE unique_table ADD UNIQUE INDEX idx_id (id);
    • Приложение: Часто используется для обеспечения уникальности данных, таких как электронная почта или номер телефона в таблице пользователей.### 2. Первичный ключ
  • Определение: Специальный уникальный индекс, который не допускает значения NULL. Каждая таблица может иметь только один первичный ключ, который используется для уникальной идентификации каждой строки в таблице.
  • Способ создания: sql
    -- Создание первичного ключа при создании таблицы
    CREATE TABLE primary_table (
        id INT PRIMARY KEY,
        name VARCHAR(50)
    );
    -- Добавление первичного ключа после создания таблицы
    ALTER TABLE primary_table ADD PRIMARY KEY (id);
    • Приложение: Подходит для полей, которые могут уникально идентифицировать каждую строку в таблице, обычно это основной ключ бизнес-логики.

3. Полнотекстовый индекс

  • Определение: Используется для выполнения полнотекстового поиска в текстовых полях, таких как содержимое статьи или описание продукта. MySQL поддерживает создание полноценных индексов для полей типа CHAR, VARCHAR и TEXT.
  • Способ создания: sql
    -- Создание полноценного индекса при создании таблицы
    CREATE TABLE fulltext_table (
        id INT,
        content TEXT,
        FULLTEXT INDEX idx_content (content)
    );
    -- Добавление полноценного индекса после создания таблицы
    ALTER TABLE fulltext_table ADD FULLTEXT INDEX idx_content (content);
    • Приложение: Подходит для сценариев, где требуется полнотекстовый поиск, например, поиск статей на новостном сайте или поиск описаний товаров на торговой платформе.### 4. Составной индекс
  • Определение: Индекс, созданный на нескольких колонках, также известный как составной индекс. Использование составного индекса следует правилу левого префикса, то есть условие запроса должно включать левую колонку индекса.
  • Способ создания:
-- Создание составного индекса при создании таблицы
CREATE TABLE composite_table (
    id INT,
    name VARCHAR(50),
    age INT,
    INDEX idx_name_age (name, age)
);
-- Добавление составного индекса после создания таблицы
ALTER TABLE composite_table ADD INDEX idx_id_name (id, name);
  • Приложение: Подходит для сценариев, где часто используются несколько полей одновременно для выполнения запросов. Создание составного индекса позволяет уменьшить количество индексов и повысить производительность запросов.

6. Пространственные индексы

  • Определение: Используются для индексации пространственных данных (например, географических местоположений, геометрических фигур и т. д.). MySQL поддерживает создание пространственных индексов на полях с типами данных GEOMETRY, POINT, LINESTRING, POLYGON и других пространственных данных.
  • Способы создания:
-- Создание пространственного индекса при создании таблицы
CREATE TABLE spatial_table (
    id INT,
    location GEOMETRY,
    SPATIAL INDEX idx_location (location)
);
-- Добавление пространственного индекса после создания таблицы
ALTER TABLE spatial_table ADD SPATIAL INDEX idx_location (location);
```  - **Applications**: Suitable for scenarios requiring spatial queries, such as searching by geographic locations in mapping applications or analyzing spatial data in Geographic Information Systems (GIS). Different types of indexes are suitable for different scenarios, so it is important to choose the most appropriate type of index based on business requirements and characteristics of the data. An excessive number of indexes can increase storage and maintenance requirements for the database, so they should be used wisely.### 20. Как оптимизировать производительность SQL
   ### 1. Уровень проектирования базы данных
   - Оптимальное проектирование структуры таблиц
    - **Нормализация**: Соблюдение нормальных форм баз данных для минимизации избыточности данных, обеспечения согласованности и целостности данных. Например, в системе электронной коммерции товарная информация, заказы и данные пользователей могут храниться в отдельных таблицах, чтобы избежать повторного хранения информации.
    - **Денормализация**: В некоторых случаях для повышения производительности запросов можно ввести некоторую избыточность данных. Например, при выполнении запросов отчетов можно хранить часто используемые связанные поля в одной таблице, чтобы уменьшить количество операций соединения таблиц.
  - Выбор подходящих типов данных
    - **Минимизация типов данных**: Выбор минимального типа данных в соответствии с реальными потребностями хранения данных, что позволяет снизить использование места на диске и повысить скорость запросов. Например, если требуется хранить возраст, лучше использовать TINYINT вместо INT.   - **Избегание использования TEXT и BLOB типов данных**: Обработка этих типов данных занимает больше времени, поэтому если действительно требуется хранить большие текстовые или двоичные данные, можно рассмотреть возможность их хранения в файловой системе, а в базе данных хранить только пути к этим файлам.
   ### 2. Уровень оптимизации индексов
   - Оптимальное создание индексов
    - **Создание индексов на часто используемых полях**: Например, на полях, которые часто используются в условии WHERE или JOIN. Например, в таблице пользователей часто выполняются запросы по электронной почте пользователя, поэтому можно создать индекс на поле электронной почты.
    - **Создание составных индексов**: Когда условия запроса часто включают несколько полей, следует создать составной индекс. Необходимо учитывать принципы левого префикса, например, если создано составное индексное поле (col1, col2, col3), то при условии, что запрос включает col1 или col1 и col2 или col1, col2 и col3, можно использовать этот индекс.
   - **Избегайте избыточного количества индексов**: Избыток индексов увеличивает затраты на обслуживание базы данных, так как каждое действие вставки, обновления или удаления требует обновления индексов. Поэтому следует создавать индексы только для необходимых полей.
 ### 3. Оптимизация SQL-запросов
 - Оптимизация запросов  - Избегайте использования `SELECT *`: ограничьтесь теми полями, которые вам нужны, чтобы снизить объем передаваемых данных и нагрузку на базу данных. Например, если требуется получить только имя и электронную почту пользователя, не используйте `SELECT *`.
   - **Разумное использование `WHERE`-предиката**: переместите условия фильтрации как можно ближе к началу запроса, чтобы снизить ненужные операции сканирования данных. Например, сначала отфильтруйте записи, соответствующие условиям, а затем выполните сортировку и группировку.
   - **Оптимизация операций `JOIN`**: по возможности используйте `INNER JOIN` вместо `OUTER JOIN`, так как `INNER JOIN` обычно работает быстрее. Также убедитесь, что на ключевых полях `JOIN` есть индексы.
 - **Избегайте использования подзапросов**: подзапросы обычно работают медленнее, чем `JOIN`-операции. По возможности преобразуйте подзапросы в `JOIN`-операции. Например:
 ```sql
 -- Пример подзапроса
 SELECT column1 FROM table1 WHERE column2 IN (SELECT column2 FROM table2);
 -- Преобразование в JOIN-операцию
 SELECT t1.column1 FROM table1 t1 JOIN table2 t2 ON t1.column2 = t2.column2;

Метод 4. Уровень настроек базы данных

  • Настройка размера буферной области: на основе размера памяти сервера и потребностей бизнеса, настройте размер буферной области базы данных, например, размер буферной области InnoDB. Удобный размер буферной области может снизить количество операций чтения/записи на жесткий диск и повысить производительность запросов.- Оптимизация конфигурации журнала: на основе потребностей бизнеса, настройте журналы базы данных, такие как двоичный журнал, журнал медленных запросов и т. д. Избыточное количество записей в журнале может замедлить работу базы данных.

21. Как определить, использовался ли индекс в запросе MySQL?

1. Использование команды EXPLAIN для анализа плана выполнения

Добавьте EXPLAIN или EXPLAIN FORMAT=JSON перед SQL-запросом, чтобы просмотреть путь выполнения запроса. Пример:

EXPLAIN SELECT * FROM users WHERE name = 'Alice';

Ключевые поля

Поле Описание
type Метод доступа к данным. Если значение ALL, это означает полное сканирование таблицы; если значение ref, range или index, это указывает на использование индекса.
key Имя реально используемого индекса. Если key равно NULL, это означает, что индекс не используется.
---
rows Ожидаемое количество просматриваемых строк. Чем меньше строк, тем эффективнее запрос.
Extra Дополнительная информация. Например, Using index указывает на использование покрывающего индекса, а Using where — на необходимость фильтрации данных после использования индекса.
  • Если поле key имеет значение: это означает использование индекса (например, key: idx_name).
  • Если поле type не равно ALL: если значение равно ref, range, index и т.д., обычно это указывает на использование индекса.
  • Если поле rows имеет небольшое значение: если количество просматриваемых строк значительно меньше общего количества строк в таблице, возможно, индекс используется.

22. Часто встречающиеся ситуации, при которых индекс не используется

Даже если индекс создан, следующие действия могут привести к тому, что индекс не будет использоваться:

1. Использование функций или операций над индексируемым полем:

SELECT * FROM users WHERE YEAR(create_time) = 2023; -- Индекс не используется

Оптимизация: замените на диапазонный запрос:

SELECT * FROM users WHERE create_time BETWEEN '2023-01-01' AND '2023-12-31';

2. Неявное преобразование типов:

SELECT * FROM users WHERE id = '100'; -- Если тип поля `id` — INT, то строка приведёт к тому, что индекс не будет использован

3. Использование OR для незадействованных индексами полей:

SELECT * FROM users WHERE name = 'Alice' OR age = 20; -- Если поле `age` не индексировано, индекс не будет использован

Оптимизация: используйте UNION ALL:

SELECT * FROM users WHERE name = 'Alice' 
UNION ALL 
SELECT * FROM users WHERE age = 20;
```## 23. Кэш- Avalanche, кэш- пробой и кэш- пробитие
### 1. Кэш- Avalanche
- **Определение**: Кэш- Avalanche — это ситуация, когда большое количество кэшированных данных одновременно истекает сроком годности, что приводит к тому, что большинство запросов сразу обращаются к базе данных, увеличивая нагрузку на неё и потенциально приводя к её отказу, что может повлиять на нормальную работу всего системы.
- **Причины**: Обычно это происходит из-за некорректной настройки срока годности кэшированных данных, например, если большое количество данных было закэшировано в одно и то же время и им был установлен одинаковый срок годности, то когда эти данные истекут сроком годности одновременно, это вызовет кэш- Avalanche.
- **Решение**:
  - **Установка случайного срока годности**: При кэшировании данных установите случайный срок годности для каждого элемента, чтобы избежать истечения срока годности большого количества данных одновременно. Например, если срок годности кэша был установлен в 1 час, его можно изменить на случайное значение от 30 минут до 1,5 часов.
### 2. Использование кэш-кластера
- **Использование распределенного кэш-кластера**: При использовании распределенного кэш-кластера данные хранятся в нескольких узлах, что позволяет избежать концентрации всех данных в одном кэш-сервере. Даже если часть узлов выходит из строя, это не повлияет на работу всего кэша.- **Предварительная загрузка данных**: В момент запуска системы или во время простоя можно заранее загружать популярные данные в кэш, чтобы избежать ситуации, когда множество запросов одновременно обращаются к базе данных в пиковые часы.### 2. Проблема пробоя кэша
- **Определение**: Пробой кэша происходит, когда популярные данные внезапно исчезают из кэша (например, срок действия кэша истекает), и в этот момент множество параллельных запросов обращаются к этим данным. Эти запросы обходят кэш и сразу обращаются к базе данных, что может вызвать высокую нагрузку на базу данных.
- **Причины**: Основной причиной является неправильная настройка срока действия кэша для популярных данных или случайное удаление этих данных из кэша по какой-то причине. В этот момент множество параллельных запросов могут обращаться к этим данным.
- **Решение**
  - **Установка вечного срока действия для популярных данных**: Для очень важных популярных данных можно установить вечный срок действия или использовать другие методы для ручного обновления кэша, чтобы гарантировать, что эти данные всегда будут доступны в кэше и не исчезнут из-за истечения срока действия.
  - **Использование блокировки**: Когда данные в кэше истекают, можно использовать распределённую блокировку, чтобы гарантировать, что только один запрос сможет обратиться к базе данных и обновить кэш, а остальные запросы будут ждать, пока кэш не будет обновлен. Например, можно использовать команду `SETNX` в Redis для реализации распределённой блокировки.### 3. Проблема пробоя кэша
- **Определение**: Пробой кэша происходит, когда клиентский запрос обращается к данным, которые отсутствуют как в кэше, так и в базе данных. Это приводит к тому, что каждый запрос обходит кэш и сразу обращается к базе данных. Если таких запросов много, это может создать огромную нагрузку на базу данных и даже привести к её отказу.
- **Причины**: Обычно это связано с намеренной атакой, например, когда хакеры отправляют множество запросов с ключами, которые не существуют, или когда бизнес-логика не обеспечивает строгую проверку данных, что приводит к появлению запросов с несуществующими ключами.
- **Решение**
  - **Блум-фильтр**: Использование блум-фильтра перед кэшем для проверки наличия данных. Блум-фильтр — это вероятностная структура данных, которая позволяет быстро проверять наличие элемента в множестве. Когда приходит запрос, сначала проверяется ключ с помощью блум-фильтра, и если ключ отсутствует, возвращается ответ без обращения к базе данных, что помогает избежать пробоя кэша.
  - **Кэширование пустых значений**: Когда данные не найдены в базе данных, можно кэшировать пустое значение и установить короткий срок его действия. Таким образом, при следующих запросах пустое значение можно будет получить из кэша, не обращаясь к базе данных снова.
  
## 24 Различия HashSet, LinkedHashSet, TreeSet, EnumSet, CopyOnWriteArraySet, ConcurrentSkipListSet  В Java различные реализации интерфейса `Set` отличаются по структуре данных, порядку сортировки, потокобезопасности, производительности и подходящим сценариям использования. Вот основные различия между **HashSet, LinkedHashSet, TreeSet, EnumSet, CopyOnWriteArraySet, ConcurrentSkipListSet**:

Пожалуйста, обратите внимание, что в данном тексте нет необходимости в переводе дополнительных слов или фраз, так как они уже представлены на русском языке.  ### 1. Таблица сравнения ключевых особенностей
   | Основные характеристики             | HashSet                        | LinkedHashSet                  | TreeSet                      | EnumSet                   | CopyOnWriteArraySet     | ConcurrentSkipListSet   |
  | ------------------------------------ | ------------------------------ | ------------------------------- | ----------------------------- | -------------------------- | ------------------------ | ------------------------ |
  | **Основной тип данных**              | Хеш-таблица (массив + связанный список / красно-черное дерево) | Хеш-таблица + двусвязный список | Красно-черное дерево         | Битовый вектор или массив (специализированный для перечислений) | Копируемый массив (копирование при записи) | Скользящее дерево (skip list)          |
  | **Порядок сортировки**               | Отсутствует (порядок вставки не важен) | Сохраняет порядок вставки       | Природный порядок / Настроенная сортировка | Порядок перечисления (фиксированный порядок) | Сохраняет порядок вставки               | Природный порядок / Настроенная сортировка |
  | **Потокобезопасность**               | Непотокобезопасен             | Непотокобезопасен             | Непотокобезопасен           | Непотокобезопасен         | Потокобезопасен (копирование при записи) | Потокобезопасен (безблокировка)           |
  | **Разрешение null**                  | Да (один)                     | Да (один)                      | Нет                          | Нет (значения перечислений не могут быть null) | Да (один)                                    | Нет                                      || **Уникальность элементов**           | Обязательно уникальны         | Обязательно уникальны          | Обязательно уникальны       | Обязательно уникальны (уникальность значений перечислений) | Обязательно уникальны                     | Обязательно уникальны                    |
| **Способ сортировки**                | Отсутствует                   | Порядок вставки                | Сравнимый/Компаратор        | Порядок объявления перечисления | Порядок вставки          | Сравнимый/Компаратор    |
| **Поддержка сценариев параллелизма** | Нет                            | Нет                            | Нет                          | Нет                       | Сценарии чтения с небольшим количеством записей | Сценарии высокой параллелизации с упорядоченными операциями |  Внимание: В таблице выше "null" относится к значению null, которое может быть добавлено в коллекцию. | **Сценарии применения** | Быстрое удаление дубликатов, проверка уникальности | Сохранение порядка вставки при удалении дубликатов | Сортировка элементов, запросы диапазона | Уникальное множество для перечислений | Нитезащищенный низко-конкурентный режим записи | Высоко-конкурентные операции с упорядоченным множеством |
   ### 2. Подробный анализ характеристик
   #### 1. HashSet
   - **Структура данных**: Основана на хеш-таблице (оптимизация с использованием красно-черного дерева начиная с JDK 8).
   - **Упорядоченность**: Неупорядочено, порядок хранения элементов не зависит от порядка вставки (порядок прохода не определен).
   - **Нитезащита**: Не нитезащищено, требуется ручная синхронизация в многонитевых средах.
   - **Поддержка null**: Разрешено одно значение null (из-за уникальности ключей).
   - **Производительность**: Среднее время выполнения операций вставки, удаления и поиска **O(1)** (в идеальных условиях), самая быстрая реализация множества Set.
   - **Типичные сценарии**: Необходимость быстрого определения наличия элемента или удаления дубликатов (например, очистка массива от дубликатов, подсчет уникальных элементов).
   #### 2. LinkedHashSet
   - **Структура данных**: Хеш-таблица + двусвязный список (сохраняет порядок вставки).  - **Упорядоченность**: Сохраняет порядок **вставки** (проход по элементам происходит в порядке вставки).
   - **Нитезащита**: Не нитезащищено, основана на `HashSet`, дополнительно поддерживает список.
   - **Поддержка null**: Разрешено одно значение `null` (как и в `HashSet`).
   - **Производительность**: Время выполнения операций вставки, удаления и поиска **O(1)** (низкая стоимость поддержания списка, производительность близка к `HashSet`).
   - **Типичные сценарии**: Необходимость сохранения порядка вставки при удалении дубликатов (например, стратегии кэширования, последовательность логирования).
   #### 3.  **TreeSet**
   - **Структура данных**: Красно-черное дерево (балансированное двоичное дерево поиска).
   - **Упорядоченность**: Элементы сортируются по **естественному порядку** (реализация `Comparable`) или **пользовательскому порядку** (передача `Comparator`).
   - **Нитезащита**: Не нитезащищено, требуется синхронизация в многонитевых средах (например, `Collections.synchronizedSortedSet`).
   - **Поддержка null**: Не разрешено `null` (вставка `null` приводит к `NullPointerException`).
   - **Производительность**: Время выполнения операций вставки, удаления и поиска **O(log n)** (красно-черное дерево гарантирует баланс, лучше обычного двоичного дерева поиска).
   - **Типичные сценарии**: Необходимость сортировки элементов или запросов диапазона (например, получение минимального значения, операции с подмножествами `subSet()`).
   #### 4.  **EnumSet**  - **Структура данных**: Основана на битовом векторе для перечислений (высокая эффективность при малом количестве значений) или массиве.
   - **Упорядоченность**: Строго следуют порядку **объявления перечислений** (фиксированный порядок, неизменяемый).
   - **Нитезащита**: Не нитезащищено, но без изменений состояния (обычно используется в однопоточных или без изменений сценариях).
   - **Поддержка null**: Не разрешено null (вставка null приводит к NullPointerException). - **Специфичность**: Может хранить только элементы одного **перечисления типа**, при создании необходимо указать перечисление.
 - **Производительность**: Почти все операции имеют сложность **O(1)** (реализованы с помощью битовых операций, без конфликтов хэширования или затрат на деревья).
 - **Типичные сценарии использования**: Эффективное управление наборами значений перечислений (например, проверка прав доступа, состояние флагов).
 #### 5.  **CopyOnWriteArraySet**
 - **Структура данных**: Основана на `CopyOnWriteArrayList`, при записи массив копируется (механизм создания снимков).
 - **Порядок вставки**: Сохраняет порядок вставки (как `LinkedHashSet`, но потокобезопасен).
 - **Потокобезопасность**: Потокобезопасен (запись защищена блокировками, чтение не защищено, подходит для сценариев с **многими чтениями и редкими записями**).
 - **Поддержка null**: Допускает один элемент `null` (как `HashSet`).
 - **Производительность**:  - Чтение **O(1)** (без блокировок, прямой доступ к массиву);
   - Запись **O(n)** (копирование массива, производительность значительно снижается при параллельной записи).
 - **Типичные сценарии использования**: в многопоточной среде, когда частота обновления коллекции низкая, но часто требуется чтение (например, регистрация прослушивания событий).
 #### 6.  **ConcurrentSkipListSet**
 - **Структура данных**: использует пропускное дерево (Skip List, поддерживает эффективные операции над упорядоченными множествами).
 - **Упорядоченность**: элементы упорядочены по **естественному порядку** или **пользовательскому порядку** (как `TreeSet`, но потокобезопасен).
 - **Потокобезопасность**: потокобезопасен (основан на алгоритмах без блокировок и операциях CAS, поддерживает высокую конкурентность).
 - **Поддержка null**: не допускает `null` (как `TreeSet`).
 - Производительность:
   - Время выполнения операций вставки, удаления и поиска имеет сложность **O(log n)** (уровневый индекс пропускного дерева оптимизирует производительность, превосходит конкурентную производительность красно-черных деревьев);
   - В конкурентных сценариях производительность значительно превышает `TreeSet` (не требует глобальной блокировки).
 - **Типичные сценарии использования**: упорядоченные множества в условиях высокой конкурентности (например, реальное время статистики сортировки, упорядоченные очереди в распределённых системах).
 ### 3.Ключевые различия
 #### 1.  **Упорядоченность и методы сортировки**
 - **Несортированные**: `HashSet` (полностью неупорядоченное множество).
 - **Порядок вставки**: `LinkedHashSet`, `CopyOnWriteArraySet` (хранят элементы в порядке вставки).
 - **Фиксированный порядок**: `EnumSet` (упорядочено по объявленному перечислению, неизменяемое).
 - **Пользовательский порядок**: `TreeSet`, `ConcurrentSkipListSet` (на основе компаратора или естественного порядка).
 #### 2.  **Потокобезопасность**
 - **Не потокобезопасные**: `HashSet`, `LinkedHashSet`, `TreeSet`, `EnumSet` (требуют ручного синхронизации).
 - Потокобезопасные:
   - `CopyOnWriteArraySet` (механизм копирования при записи, подходит для низкой конкурентности записей);
  - `ConcurrentSkipListSet` (алгоритмы без блокировок, подходит для высокой конкурентности упорядоченных операций).
 #### 3.  **Поддержка null элементов**
 - **Разрешение null**: `HashSet`, `LinkedHashSet`, `CopyOnWriteArraySet` (каждый разрешает один `null`).
 - **Запрет null**: `TreeSet`, `ConcurrentSkipListSet` (вызывает исключение при попытке вставить `null`); `EnumSet` (значения перечислений сами по себе не могут быть `null`).#### 4. **Сводка по применению**

| Требование | Рекомендованный класс | Причина |
| ----------- | --------------------- | ------- |
| Обычное удаление дубликатов и быстрый поиск | `HashSet` | Среднее время выполнения O(1), простота и эффективность |
| Сохранение порядка вставки | `LinkedHashSet` | Упорядочен и имеет производительность, близкую к `HashSet` |
| Сортировка элементов / запросы диапазона | `TreeSet` | Реализован с использованием красно-черного дерева, что обеспечивает упорядоченность, подходит для однопоточной сортировки |
| Специализированный для перечислений | `EnumSet` | Оптимизирован для перечислений, не поддерживает `null`, максимальная производительность |
| Нитезащищён и сохраняет порядок вставки | `CopyOnWriteArraySet` | Копирование при записи гарантирует нитезащиту, подходит для случаев с большим количеством чтений и малым количеством записей (например, мониторинг конфигураций) |
| Высокопроизводительные операции над упорядоченными множествами в многонитевых средах | `ConcurrentSkipListSet` | Реализован с использованием прыжкового списка, обеспечивает блокировку без потерь, превосходит производительность `TreeSet` в многонитевых средах |

### 4. Примеры кода: демонстрация ключевых различий

#### 1. Порядок вставки и сортировка

```java
// HashSet (неупорядоченный)
Set<String> hashSet = new HashSet<>();
hashSet.add("B");
hashSet.add("A");
System.out.println(hashSet); // Порядок вывода не определён (например, [A, B] или [B, A])
```// LinkedHashSet (сохраняет порядок вставки)
Set<String> linkedHashSet = new LinkedHashSet<>();
linkedHashSet.add("B");
linkedHashSet.add("A");
System.out.println(linkedHashSet); // Выводит [B, A] (в порядке вставки)

// TreeSet (естественнная сортировка)
Set<Integer> treeSet = new TreeSet<>();
treeSet.add(3);
treeSet.add(1);
System.out.println(treeSet); // Выводит [1, 3] (по возрастанию)

#### 2. Пример нитезащиты (CopyOnWriteArraySet)

```java
Set<String> threadSafeSet = new CopyOnWriteArraySet<>();
// Можно безопасно добавлять элементы в многонитевой среде (копирование при записи)
new Thread(() -> threadSafeSet.add("A")).start();
new Thread(() -> threadSafeSet.add("B")).start();

3. Специализированный сценарий использования EnumSet```java

enum Color { RED, GREEN, BLUE } Set colorSet = EnumSet.of(Color.RED, Color.GREEN); colorSet.add(Color.BLUE); // Разрешено, значение перечисления // colorSet.


```markdown
### 5. Заключение
При выборе реализации класса `Set`, следует учитывать следующие ключевые моменты:
1. **Необходимость упорядоченности**: Для неупорядоченного множества выбирайте `HashSet`, для упорядоченного по порядку вставки — `LinkedHashSet`, для сортированного по пользовательскому критерию — `TreeSet` или `ConcurrentSkipListSet`, а для перечислений — `EnumSet`.
2. **Требования к потокобезопасности**: В однопоточной среде используйте непотокобезопасные классы (высокая производительность), в многопоточной — выбирайте `CopyOnWriteArraySet` (низкая конкуренция при записи) или `ConcurrentSkipListSet` (высокая конкуренция при упорядоченных операциях).
3. **Тип элементов**: Для перечислений используйте `EnumSet`, для пользовательских объектов переопределите методы `hashCode()` и `equals()` для обеспечения уникальности.
4. **Требования к производительности**: В обычных сценариях предпочтительно использовать `HashSet`/`LinkedHashSet`, для сортированных данных — `TreeSet`, а для высоконагруженных упорядоченных сценариев — `ConcurrentSkipListSet`.
Через понимание ключевых различий между реализациями можно эффективно использовать коллекцию `Set` в различных сценариях, избегая проблем производительности и ошибок проектирования.
```## 25. Реализация принципа паттерна Singleton и его ключевые элементы
Основной принцип реализации паттерна Singleton заключается в контроле процесса создания экземпляров класса, чтобы гарантировать наличие только одного экземпляра данного класса во всем приложении и предоставление глобальной точки доступа для получения этого экземпляра. Вот подробное описание принципа и способов его реализации:
### 1. Приватный конструктор:
Задайте конструктор класса как приватный, чтобы запретить внешнему коду создание экземпляров класса с помощью ключевого слова `new`. Это позволяет контролировать создание экземпляров только через методы самого класса.
### 2. Статическая переменная:
Определите статическую переменную внутри класса для хранения единственного экземпляра класса. Поскольку статические переменные принадлежат классу и существуют только один раз в течение всего жизненного цикла класса, они обеспечивают уникальность экземпляра. Например, `private static Singleton instance;`.
### 3. Общедоступный метод доступа:
Предоставьте общедоступный статический метод (обычно называемый `getInstance`), который используется для получения единственного экземпляра класса. Внутри этого метода используйте логические проверки для определения наличия экземпляра.Если экземпляр еще не создан, создайте новый и присвойте его статической переменной; если экземпляр уже существует, верните его. Например:
```java
public static Singleton getInstance() {
    if (instance == null) {
        instance = new Singleton();
    }
    return instance;
}

Механизмы потокобезопасности: В многопоточной среде для обеспечения уникальности экземпляра необходимо применять механизмы потокобезопасности. Можно использовать ключевое слово synchronized для синхронизации метода getInstance, чтобы гарантировать, что одновременно только один поток может войти в метод для создания экземпляра. Также можно использовать двойное проверочное замыкание (Double-Checked Locking, DCL), статические внутренние классы и другие способы для обеспечения потокобезопасного одиночки, они используют ключевое слово volatile или механизм загрузки класса для избежания проблем в многопоточной среде. Различные реализации паттерна одиночки (например, голодающий одиночка, ленивый одиночка, двойное проверочное замыкание, статические внутренние классы и т. д.) отличаются по деталям реализации и сценариям использования, но все они следуют вышеупомянутым основным принципам.

26. Общие команды для мониторинга ресурсов в Linux

Linux предоставляет множество командной строки для мониторинга производительности системы и использования ресурсов.Ниже приведены некоторые часто используемые команды мониторинга и их типичные применения:

  • top: Отображает текущее состояние системы в реальном времени, включая использование процессора, памяти и другие метрики.
  • htop: Улучшенная версия top, которая предоставляет более удобный интерфейс и дополнительные возможности для мониторинга.
  • ps: Показывает информацию о запущенных процессах.
  • pidstat: Предоставляет детализированную статистику по каждому процессу, включая использование ЦПУ, памяти, ввода/вывода и сетевые данные.
  • vmstat: Отслеживает использование оперативной памяти, страницирование, процессорное время и другие параметры.
  • iostat: Анализирует производительность ввода/вывода устройств, показывая данные о чтении и записи.
  • netstat: Отображает текущую статистику сети, включая активные соединения, слушающие порты и таблицы маршрутизации.
  • iftop: Интерактивный инструмент для анализа сетевого трафика, который позволяет просматривать передачу данных между различными хостами.
  • sar: Сохраняет и отображает системные данные, такие как использование ЦПУ, памяти, ввода/вывода и сетевые данные.
  • dstat: Объединяет различные данные о производительности системы в одном месте, позволяя легко сравнивать различные метрики.
  • free: Показывает использование оперативной памяти и swap-памяти.
  • df: Отображает информацию о свободном пространстве на диске.
  • uptime: Показывает время работы системы и среднюю загрузку процессора.
  • mpstat: Анализирует производительность каждого процессора в системе.
  • lsof: Отображает открытые файлы и сокеты процессами.
  • strace: Отслеживает системные вызовы, выполняемые процессом, что полезно для диагностики проблем.
  • tcpdump: Анализирует сетевой трафик, записывая пакеты для дальнейшего анализа.
  • ss: Анализирует состояние TCP/IP соединений, предоставляя подробную информацию о сокетах.
  • ipcs: Показывает информацию о IPC (Inter-Process Communication) объектах, таких как shared memory, semaphores и message queues.
  • ipcrm: Удаляет IPC объекты.
  • ipcs -s: Показывает информацию о семафорах.
  • ipcs -m: Показывает информацию о совместно используемых памятьях.
  • ipcs -q: Показывает информацию о очередях сообщений.
  • ipcs -a: Показывает общую информацию обо всех IPC объектах.
  • ipcmk: Создает новые IPC объекты.
  • ipcs -l: Показывает информацию о лимитах IPC.
  • ipcs -u: Показывает информацию о использовании IPC.
  • ipcs -p: Показывает информацию о процессах, использующих IPC.
  • ipcs -t: Показывает информацию о времени жизни IPC объектов.
  • ipcs -c: Показывает информацию о создании IPC объектов.
  • ipcs -r: Показывает информацию о удалении IPC объектов.
  • ipcs -x: Показывает информацию о расширении IPC объектов.
  • ipcs -z: Показывает информацию о размерах IPC объектов.
  • ipcs -v: Показывает информацию о версиях IPC объектов.
  • ipcs -w: Показывает информацию о времени ожидания IPC объектов.
  • ipcs -n: Показывает информацию о номерах IPC объектов.
  • ipcs -o: Показывает информацию о владельцах IPC объектов.
  • ipcs -e: Показывает информацию о ошибках IPC объектов.
  • ipcs -f: Показывает информацию о файлах IPC объектов.
  • ipcs -g: Показывает информацию о группах IPC объектов.
  • ipcs -h: Показывает помощь по команде ipcs.
  • ipcs -i: Показывает информацию о информации IPC объектов.
  • ipcs -j: Показывает информацию о журналах IPC объектов.
  • ipcs -k: Показывает информацию о ключах IPC объектов.
  • ipcs -l: Показывает информацию о лимитах IPC объектов.
  • ipcs -m: Показывает информацию о совместно используемых памятьях IPC объектов.
  • ipcs -n: Показывает информацию о номерах IPC объектов.
  • ipcs -o: Показывает информацию о владельцах IPC объектов.
  • ipcs -p: Показывает информацию о процессах, использующих IPC объекты.
  • ipcs -q: Показывает информацию о очередях сообщений IPC объектов.
  • ipcs -r: Показывает информацию о удалении IPC объектов.
  • ipcs -s: Показывает информацию о семафорах IPC объектов.
  • ipcs -t: Показывает информацию о времени жизни IPC объектов.
  • ipcs -u: Показывает информацию о использовании IPC объектов.
  • ipcs -v: Показывает информацию о версиях IPC объектов.
  • ipcs -w: Показывает информацию о времени ожидания IPC объектов.
  • ipcs -x: Показывает информацию о расширении IPC объектов.
  • ipcs -y: Показывает информацию о размерах IPC объектов.
  • ipcs -z: Показывает информацию о размерах IPC объектов.
  • ipcs -A: Показывает общую информацию обо всех IPC объектах.
  • ipcs -B: Показывает информацию о блоках IPC объектов.
  • ipcs -C: Показывает информацию о конфигурациях IPC объектов.
  • ipcs -D: Показывает информацию о данных IPC объектов.
  • ipcs -E: Показывает информацию о ошибках IPC объектов.
  • ipcs -F: Показывает информацию о файлах IPC объектов.
  • ipcs -G: Показывает информацию о группах IPC объектов.
  • ipcs -H: Показывает информацию о хэшах IPC объектов.
  • ipcs -I: Показывает информацию о информации IPC объектов.
  • ipcs -J: Показывает информацию о журналах IPC объектов.
  • ipcs -K: Показывает информацию о ключах IPC объектов.
  • ipcs -L: Показывает информацию о лимитах IPC объектов.
  • ipcs -M: Показывает информацию о совместно используемых памятьях IPC объектов.
  • ipcs -N: Показывает информацию о номерах IPC объектов.
  • ipcs -O: Показывает информацию о владельцах IPC объектов.
  • ipcs -P: Показывает информацию о процессах, использующих IPC объекты.
  • ipcs -Q: Показывает информацию о очередях сообщений IPC объектов.
  • ipcs -R: Показывает информацию о удалении IPC объектов.
  • ipcs -S: Показывает информацию о семафорах IPC объектов.
  • ipcs -T: Показывает информацию о времени жизни IPC объектов.
  • ipcs -U: Показывает информацию о использовании IPC объектов.
  • ipcs -V: Показывает информацию о версиях IPC объектов.
  • ipcs -W: Показывает информацию о времени ожидания IPC объектов.
  • ipcs -X: Показывает информацию о расширении IPC объектов.
  • ipcs -Y: Показывает информацию о размерах IPC объектов.
  • ipcs -Z: Показывает информацию о размерах IPC объектов.
  • ipcs -a: Показывает общую информацию обо всех IPC объектах.
  • ipcs -b: Показывает информацию о блоках IPC объектов.
  • ipcs -c: Показывает информацию о конфигурациях IPC объектов.
  • ipcs -d: Показывает информацию о данных IPC объектов.
  • ipcs -e: Показывает информацию о ошибках IPC объектов.
  • ipcs -f: Показывает информацию о файлах IPC объектов.
  • ipcs -g: Показывает информацию о группах IPC объектов.
  • ipcs -h: Показывает помощь по команде ipcs.
  • ipcs -i: Показывает информацию о информации IPC объектов.
  • ipcs -j: Показывает информацию о журналах IPC объектов.
  • ipcs -k: Показывает информацию о ключах IPC объектов.
  • ipcs -l: Показывает информацию о лимитах IPC объектов.
  • ipcs -m: Показывает информацию о совместно используемых памятьях IPC объектов.
  • ipcs -n: Показывает информацию о номерах IPC объектов.
  • ipcs -o: Показывает информацию о владельцах IPC объектов.
  • ipcs -p: Показывает информацию о процессах, использующих IPC объекты.
  • ipcs -q: Показывает информацию о очередях сообщений IPC объектов.
  • ipcs -r: Показывает информацию о удалении IPC объектов.
  • ipcs -s: Показывает информацию о семафорах IPC объектов.
  • ipcs -t: Показывает информацию о времени жизни IPC объектов.
  • ipcs -u: Показывает информацию о использовании IPC объектов.
  • ipcs -v: Показывает информацию о версиях IPC объектов.
  • ipcs -w: Показывает информацию о времени ожидания IPC объектов.
  • ipcs -x: Показывает информацию о расширении IPC объектов.
  • ipcs -y: Показывает информацию о размерах IPC объектов.
  • ipcs -z: Показывает информацию о размерах IPC объектов.
  • ipcs -A: Показывает общую информацию обо всех IPC объектах.
  • ipcs -B: Показывает информацию о блоках IPC объектов.
  • ipcs -C: Показывает информацию о конфигурациях IPC объектов.
  • ipcs -D: Показывает информацию о данных IPC объектов.
  • ipcs -E: Показывает информацию о ошибках IPC объектов.
  • ipcs -F: Показывает информацию о файлах IPC объектов.
  • ipcs -G: Показывает информацию о группах IPC объектов.
  • ipcs -H: Показывает информацию о хэшах IPC объектов.
  • ipcs -I: Показ------

1. Обзор системных ресурсов

  • top Показывает текущее состояние процессов и использование ресурсов системы (CPU, память, нагрузка и т. д.) в реальном времени. Клавиши: P (сортировка по CPU), M (сортировка по памяти), q выход.
  • htop Улучшенная версия top (требуется установка), поддерживает цветовое выделение, работу мыши и более интуитивное управление процессами. Команда установки: sudo apt install htop (Debian/Ubuntu) или sudo yum install htop (CentOS/RHEL).
  • vmstat Отчет о виртуальной памяти, процессах, активности CPU и состоянии I/O. Пример: vmstat 1 (обновление каждую секунду).
  • uptime Показывает время работы системы, количество текущих пользователей и среднюю нагрузку за последние 1, 5 и 15 минут.

2. Мониторинг памяти

  • free Просмотр использования памяти и разделов обмена. Часто используемые опции: free -h (в человекочитаемом формате).
  • vmstat -s Показывает подробные статистические данные о памяти.

3. Мониторинг CPU

  • mpstat Просмотр использования многоядерного CPU (требуется установка пакета sysstat). Пример: mpstat -P ALL 1 (показывает состояние всех ядер CPU каждую секунду).
  • sar Инструмент отчета о системной активности, который позволяет записывать и анализировать исторические данные о производительности. Пример: sar -u 1 3 (выборка данных о использовании CPU каждую секунду, всего три выборки).

4. Мониторинг I/O дисков

  • **iostat**Мониторинг использования I/O дисков и активности CPU. Пример: iostat -x 1 (показывает расширенные статистические данные, обновление каждую секунду).
  • iotop Просмотр процессов, использующих высокий уровень I/O (требуется установка). Команда установки: sudo apt install iotop или sudo yum install iotop.
  • df Просмотр использования пространства на дисках. Часто используемые опции: df -h (в человекочитаемом формате).
  • du Подсчет использования диска для каталогов или файлов. Пример: du -sh /путь/к/каталогу (показывает общую размерность каталога).

5. Наблюдение за сетью

  • netstat Отображает соединения сети, таблицу маршрутизации, статистику интерфейсов и т. д. (некоторые функции устарели, рекомендуется использовать ss). Пример: netstat -tulnp (просмотр слушающих портов и процессов).
  • ss Альтернатива netstat, более быстрая и эффективная. Пример: ss -tunlp (отображение TCP/UDP слушающих портов).
  • iftop В реальном времени отслеживает использование пропускной способности сети (сортирует по объему передачи, требуется установка). Команда установки: sudo apt install iftop или sudo yum install iftop.
  • nload Отображает графики реального времени для сетевых интерфейсов (требуется установка). Пример: nload eth0.### 6. Наблюдение за процессами
  • ps Просмотр моментального снимка текущих процессов. Пример: ps aux или ps -ef.
  • pidstat Наблюдение за использованием CPU, памяти и I/O процессами (входит в состав пакета sysstat). Пример: pidstat -d 1 (каждую секунду отображает статистику использования I/O процессами).
  • lsof Список открытых файлов и сетевых соединений процессами. Пример: lsof -i :80 (просмотр процессов, использующих порт Yöntem: 80).

7. Комбинированные инструменты

  • dstat Многофункциональный инструмент наблюдения, объединяет возможности vmstat, iostat, netstat и т.д. Пример: dstat -cmsdnl (наблюдение за CPU, памятью, диском, сетью).
  • glances Кросс-платформенный инструмент наблюдения (требуется установка), поддерживает веб-интерфейс. Команда установки: pip install glances.

8. Наблюдение за журналами

  • tail -f /var/log/syslog В реальном времени отслеживает обновления журнала (подходит для большинства журналов).
  • journalctl Просмотр и управление журналами systemd (подходит для систем, использующих systemd). Пример: journalctl -f (в реальном времени отслеживает журнал).

9. Информация о оборудовании

  • lscpu Просмотр архитектуры и информации о ядрах CPU.
  • lsblk Список информации о блочных устройствах (дисках, разделах).
  • sensors Отображение температуры оборудования (требуется установка lm-sensors).### Заключение
  • Быстрый просмотр нагрузки системы: uptime, top, htop.
  • Поиск проблем с CPU: mpstat, pidstat.
  • Анализ проблем с памятью: free, vmstat.
  • Наблюдение за I/O диска: iostat, iotop.
  • Диагностика сети: ss, iftop, nload. Выбирать подходящий инструмент в зависимости от конкретной ситуации, при необходимости использовать команды grep, awk и т.д. для фильтрации вывода данных.

Аннотации внедрения зависимостей

  • @Autowired: Этот аннотация входит в состав Spring-фреймворка и используется при внедрении зависимостей в Spring-контейнере.
  • @Resource: Эта аннотация определена в спецификации JSR-250 и является стандартной аннотацией Java, поэтому она может использоваться во всех проектах, которые следуют этой спецификации.

2. Способы внедрения

  • @Autowired: По умолчанию внедряется по типу (byType). Это означает, что Spring будет искать в контейнере Bean, который соответствует типу объекта, требующего внедрения зависимости. Если существует несколько Beans с одинаковым типом, Spring выбросит исключение. В этом случае можно использовать аннотацию @Qualifier, чтобы указать конкретный Bean по имени (byName).
  • @Resource: По умолчанию внедряется по имени (byName). Сначала Spring пытается найти Bean по имени, а если не находит, то ищет Bean по типу (byType).### 3. Атрибуты
  • @Autowired: Имеет атрибут required, значение которого по умолчанию равно true. Это означает, что зависимость должна быть внедрена; если в контейнере нет подходящего Bean, будет выброшено исключение. Если установить значение этого атрибута в false, то при отсутствии подходящего Bean в контейнере, объект будет установлен в null.
  • @Resource: Имеет два основных атрибута: name и type. Атрибут name используется для указания имени Bean, которое требуется внедрить, а атрибут type — для указания типа Bean.### Пример кода Ниже приведен пример кода, демонстрирующий использование этих аннотаций:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;

// Определение сервисного интерфейса
interface MyService {
    void doSomething();
}

// Реализация сервисного интерфейса
@Component
class MyServiceImpl implements MyService {
    @Override
    public void doSomething() {
        System.out.println("Выполняю задачу...");
    }
}

// Использование @Autowired для внедрения зависимости
@Component
class AutowiredExample {
    @Autowired
    private MyService myService;

    public void performTask() {
        myService.doSomething();
    }
}

// Использование @Resource для внедрения зависимости
@Component
class ResourceExample {
    @Resource
    private MyService myService;

    public void performTask() {
        myService.doSomething();
    }
}

В приведенном выше коде класс AutowiredExample использует аннотацию @Autowired для внедрения зависимости типа MyService, а класс ResourceExample использует аннотацию @Resource для внедрения зависимости типа MyService.

Заключение

  • Если проект использует только Spring-фреймворк, то @Autowired является наиболее распространенным выбором. Если проект должен следовать стандартам Java, или если желательна лучшая переносимость кода, то @Resource является более подходящим выбором.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/yangdechao_admin-guage-notes.git
git@api.gitlife.ru:oschina-mirror/yangdechao_admin-guage-notes.git
oschina-mirror
yangdechao_admin-guage-notes
yangdechao_admin-guage-notes
master