Учебные заметки «Спецназ Java»

Java

Учебные заметки «Спецназ Java»

1. Фонд

1.1 Оптимизация времени компиляции

String a = "a" + "b" + 1;
String b = "ab1";
println(a == b);  // true 编译期优化
String a = "a";
final String c = "a"; 
//a并不是一个常量,而是局部变量,字节码增强技术就可以修改a的实际赋值
String b = a + "b";	
String d = c + "b";	//final

//1.编译器不会看方法内部做了什么,2.递归深度不可预测
//3.返回的是对常量引用的拷贝,不是final的,可以修改
String e = getA() + "b"; 
String compare = "ab";
println(b == compare);	//fasle
println(d == compare);	//true
println(e == compare);	//fasle

private final static String getA() {
	return "a";
}
//String b = a + "b" 的实际编译效果
StringBuilder temp = new StringBuilder();
String b = temp.append(a).append("b");

1.2 Intern

public native String intern();
Связанный с пулом строк, заблокируйте, чтобы найти строку строки, и используйте метод equals, чтобы определить, является ли она целевой строкой.
Jdk1.6: струнный пул в Перми Gen
Jdk1.7: пул строк находится в куче

public static void test3() {
    String a = "a";
    String b = a + "b";	//a是变量,new StringBuilder().append(a).append("b");
    String c = "ab";	//在string pool中新建ab字符串
    String d = new String(b);//新对象
    println(b == c);	//F
    println(c == d);	//F
    println(c == d.intern());	//True:intern:寻找string pool中的ab,返回地址,没有则创建后返回地址
    println(b.intern() == d.intern());	//True:intern:寻找string pool中的ab,返回地址,没有则创建后返回地址
}

Можно ли очистить старое поколение в одиночку, а молодое поколение не очистить?

1.3 StringBuilder

StringBuilder stringBuilder = new StringBuilder();
for (...) {
    //最坏的情况是它所占用的内存空间接近Old区域1/3时发生扩容,导致OOM
    stringBuilder.append(string);	
}

Когда stringBuilder расширяет свое добавление, требуетсяmax(2倍,count+string.length), поэтому, когда к маленькой строке добавляется большая строка, места для расширения как раз достаточно, а когда к большой строке добавляется маленькая строка, будет много дополнительного места в памяти.

1.4 Большое количество операций Да | Нет

Пример: модификатор класса в байт-коде java, все следующие символы являются шестнадцатеричными, отображаются только последние четыре цифры

public:0001
static:0100
final:1000

Взять и оперировать числами, верно, если не 0
Если судитьpublic static final, сначала взять илиpublic_static_final=public|static|final;судить(value& public_static_final)== public_static_final

1.5 Кэш данных

Типы Диапазон кеша
Integer -128 ~127
Short -128 ~127
Long -128 ~127
Float double никто
Byte 256 значений

2. Принцип работы компьютера

2.1 Стек

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

2.2 Cache line

Обычно кэшируется в единицах последовательных 64-битных байтов.
Например, при получении массива, при получении двумерного массива a[0][0] операция строки кэша обычно кэширует некоторые соседние элементы массива в кэш ЦП, поэтому осуществляется доступ к a[0][0], a[0]. непрерывно [1]... эти последовательные значения нужно кэшировать только один раз

2.3 Протокол согласования кэша

Когда один и тот же кэш данных существует в нескольких ЦП, данные должны считываться и записываться последовательно, а несколько ЦП должны следовать протоколу согласованности совместного использования кеша.
Когда ЦП читает и записывает данные, он будет транслировать, другие ЦП будут отслеживать и сохранять согласованность данных.

2.4 Память

Адреса, используемые во всех программах, являются виртуальными адресами (логическими адресами), которые могут повторяться в разных процессах.
Физический адрес: у каждого процесса есть область памяти,起始地址+逻辑地址=物理地址
ОС заранее выделяет пространство памяти размера -xms для jvm, вместо того, чтобы сразу выделять пространство размера -xmx, многие места выделяются только тогда, когда они фактически используются (при запуске java параметр -xmx может быть больше, чем физическая память)

2.5 Диски

Чем выше количество операций чтения в секунду IOPS, тем лучше
Последовательное чтение и запись для уменьшения задержки позиционирования
Инструмент чтения и записи журнала на Java заменит журнал методом добавления буфера, запишет журнал в буфер и запишет журнал специальной программой, или запишет на диск только при заполнении буфера, попробуйте одновременная запись Ввод нескольких фрагментов данных, последовательный ввод-вывод, сокращение адресации при поиске на жестком диске

3. JVM

JVM内存管理模型
Старая площадь больше
Статические данные хранятся в области метода
Внутренний метод объекта String копирует объект строки в пул констант.

3.1 Байт-код класса

постоянный пул класса
Метод: байт-код конструктора автоматически генерируется во время компиляции.
пропустить вперед

3.2 Загрузчик байт-кода класса

  1. отношения наследования
    ClassLoader.loadClass(“类名”)Когда класс загружается, он сначала проверяет, был ли класс загружен из текущего ClassLoader, затем шаг за шагом находит класс из родительского класса и, наконец, загружает класс из родительского класса в дочерний класс и, наконец, Класснотфаундексцептион
    Родительский класс сначала загружает классBootStrapClassLoader -> ExtClassLoader -> AppClassLoader -> 自定义ClassLoader
  2. BootStrapClassLoader
    Загрузите основные классы, которые поставляются с java, напримерjava.Lang.*( Object, Class, Number, Thread, System, Throwable…), реализуется ядром jvm и не может быть заменен
  3. ExtClassLoader
    Загрузите пакет jar в каталог jre/lib/ext
    • расширять
      jre
      C:\Program Files\Java\jre : среда jre, в которой пользователь запускает программу java для jvm.
      Jdk
      Кроме того, для разработки программы необходим установленный jdk:
      jdk\lib: пакет jar, включающий среду разработки Java
      jdk\jre: среда разработки запускает jre под jdk
      jdk\jre\lib: в среде разработки пакет jar, необходимый во время выполнения, например импортированный внешний пакет jar.
  4. AppClassLoader
    Загрузите содержимое ниже classPath
  5. Пользовательский загрузчик классов
    Загрузить класс, файлы jar и даже другие файлы, место загрузки может быть локальным или удаленным.
    Пользовательский ClassLoader может распознавать классы, загруженные parentClassLoader, в то время как классы, загруженные другими ClassLoader, должны быть повторно объединены из пути к классам в качестве параметра для динамической компиляции.
    Если parentClassLoader не указан, parentClassLoader по умолчанию использует ClassLoader, соответствующий вызывающему классу; parentClassLoader может быть установлен в null во время инициализации.
  6. загрузочная загрузка
    При запуске загружаются только базовая библиотека JVM (например, BootStrapClassLoader) и классы, связанные с основным методом.

3.3 процесс загрузки класса

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

  1. Чтение файла (ClassNotFoundException)
    Загрузите файл .class в область методов (включая все классы и статические переменные, которые являются единственными элементами в программе). Сначала загрузите из родительского загрузчика классов, если он не найден, загрузите дочерний загрузчик и, наконец, выдайте исключение.
    (BootStrapClassLoader -> ExtClassLoader -> AppClassLoader ->自定义ClassLoader->classnotfoundexception)
  2. ссылка (NoClassDefFoundError)
    Разберите проверочный байт-код и выдайте NoClassDefFoundError, если он не соответствует спецификации.
    Выделить память для объекта класса
  3. инициализация
    Вызов конструктора объекта класса, статическая переменная, назначение статического блока
    порядок инициализации
    static块 -> 代码块 -> 构造方法
class Parent {
    public Parent() {
	System.out.println("parent constructor init....");	//4
    }
    static {
	System.out.println("parent static block init....");	//1
    }
    {
	System.out.println("parent normal block call....");	//3
    }
}

class Child extends Parent {
    static {
	System.out.println("child static block call....");	//2
    }
    {
	System.out.println("child block call....");		//5
    }
    public Child() {
	System.out.println("child constructor call....");	//6
    }
}
public class LoadObjectStepDemo {
    public static void main(String[] args) {
	new Child();
    }
}
parent static block init....
child static block call....
parent normal block call....
parent constructor init....
child block call....
child constructor call....

Ошибка инициализации экземпляра ExceptionInInitializerError

class B {
    // 加载类时先调用static块
    private final static B instance = new B();
    public static B getInstance() {
	return instance;
    }
    public B() {
	instance.test(); // new B()引用instance实例,但又发现这个类未加载完成,instance为NULL
    }
    public void test() {
	System.out.println("test");
    }
}

3.4 Другие точки знаний класса

  1. Доступ к контейнеру между приложениями
    В веб-контейнере используются разные загрузчики классов для загрузки разных приложений (разных приложений), но доступ к информации можно получить через загрузчики классов.
  2. ClassLoader класс загружает только один
    Один и тот же ClassLoader будет загружать только один класс, и один и тот же класс может быть загружен разными ClassLoader.Эта проблема должна рассматриваться в режиме singleton.
  3. Полные классы выпусков GC
    Когда JVM выполняет fullGC, только когда все классы в соответствующем ClassLoader не имеют ссылок на экземпляры, ClassLoader и все классы в нем могут быть освобождены.
  4. Загрузка ClassLoader
    ClassLoader сам по себе является классом, и когда ClassLoader отсутствует, он загружается ядром jvm
  5. Загрузка класса и родительский класс
    Сначала загрузите родительский класс, сначала инициализируйте статический метод родительского класса.
  6. JIT-оптимизация времени выполнения
    Постепенно оптимизировать, оптимизированный код будет храниться в codeCache
    -XX:ReservedCodeCacheSize: Изменить размер codeCache, 64-битный сервер java7 по умолчанию 48M
    -XX:+UseCodeCacheFlushing: очистить codeCache
    -XX:CICompilerCount: максимальное количество параллельных компиляций, чем больше число, тем быстрее компиляция
  7. Конфликт загрузки классов с тем же именем
    Классы с одинаковыми именами появляются в разных пакетах jar и могут использоватьсяinstance.getClass().getResource("").getPath();Получите пакет исходного кода класса
  8. корневая ссылка
    Корневой ссылкой во время GC является ссылка на локальную переменную, ссылку на стек операндов, регистр ПК, ссылку на локальный стек методов, статическую ссылку и т. д.
    То есть ссылка + статический список ссылок в стеке при работе программы
  9. Вызывает полный сбор мусора
    1. Старая область заполнена || меньше, чем средний размер рекламной площади
    2. Пермский край полный: класс стринг
    3. System.gc()
    4. Дамп памяти

3.5 Алгоритм восстановления

см. примечания JVM

3.6 Общие параметры ГХ

  1. Параметры памяти JVM, связанные с размером кучи Java

    параметр имея в виду
    -Xms Установите начальный размер кучи Java
    -Xmx Установите максимальный размер кучи Java
    -Xss Установить размер стека потока Java
    -Xmn Установите размер пространства нового поколения
  2. Аргументы JVM для печати сведений о сборщике мусора

    параметр имея в виду
    -verbose:gc Запись операций и времени работы сборщика мусора, которые обычно используются для проверки того, не является ли сборщик мусора узким местом приложения.
    -XX:+PrintGCDetails Запишите подробную информацию о данных среды выполнения GC, включая размер памяти и время, затраченное на вновь созданные объекты, и т. д.
    -XX:-PrintGCTimeStamps Распечатать метку времени сборки мусора
  3. Параметры JVM, определяющие поведение сборщика мусора Java.

    параметр имея в виду
    -XX:+UseParallelGC Используйте параллельную сборку мусора
    -XX:-UseConcMarkSweepGC Сбор данных с одновременными флагами
    -XX:-UseSerialGC Использовать последовательную сборку мусора
  4. Параметры отладки JVM для удаленной отладки

-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000
  1. Аргументы JVM в пути к классам
    -XbootclasspathИспользуется для указания путей к классам, которые необходимо загрузить, но которые не должны проходить проверку. JVM проверяет все классы перед загрузкой и применяет значение int для каждого класса. Это необходимый процесс для обеспечения стабильности JVM, но он занимает много времени.Если вы хотите пропустить этот процесс, укажите класс через этот параметр.
  2. Аргументы JVM для изменения размера Perm Gen
    Следующие три параметра в основном используются для устранения ошибок JVM:java.lang.OutOfMemoryError:Perm Gen Space.
    -XX:PermSize and -XX:MaxPermSize
    -XX:NewRatio=2  Ratio of new/old generation sizes.
    -XX:MaxPermSize=64m     Size of the Permanent Generation.
    
  3. Информация, используемая для отслеживания загрузки и выгрузки классов
    -XX:+TraceClassLoadingа также-XX:+TraceClassUnloadingИспользуется для вывода информации о процессе загрузки и выгрузки классов, что очень полезно для диагностики утечек памяти в приложениях.
  4. JVM switches related to logging
    -XX:+PrintCompilation: prints out the name of each Java method Hotspot decides to JIT compile.
  5. Аргументы переключения JVM для целей отладки
    параметр имея в виду
    -XX:HeapDumpPath=./java_pid.hprof Path to directory or file name for heap dump.
    -XX:-PrintConcurrentLocks Print java.util.concurrent locks in Ctrl-Break thread dump.
    -XX:-PrintCommandLineFlags Print flags that appeared on the command line.

3.7 Структура памяти объектов Java

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

对象内存结构

//32bit
class A{
   byte b1;
}

8 байт заголовка + 1 байт b1
Для выравнивания, поэтому 16 байт

  1. Расположение свойств объекта отношения наследования
    Во внутренней структуре свойства родительского класса по-прежнему должны быть присвоены соответствующим объектам подкласса, чтобы к его свойствам можно было обращаться через родительский класс в программе. Свойства родительского класса нельзя смешивать со свойствами дочернего класса, они должныОговаривается индивидуальнов одном месте
class A{byte b;}
class B extends A{byte b;}
class C extends B{byte b;}

对象结构图

  1. Экземпляр занятого пространства массива (32 бита)
int size = 100 * 1024 * 1024;
//1
int[] values = new int[size];
for (int i = 0; i < size; i++) {
    values[i] = i;
}
//2
Integer[] valueIntegers = new Integer[size];
for (int i = 0; i < size; i++) {
    valueIntegers[i] = i;  // 自动装箱了 new Integer(i)
}
  • Пара 1:
    массив int[] занимает место
    8 байтов заголовка + 4 байта длины массива описания + 4X100x1024X1024 = 400 МБ (целое значение 4 байта) + padding4 байта ≈ 400 МБ
  • Пара 2:
    Каждый объект Integer занимает 8 байтов заголовка + 4 байта значения int и должен быть выровнен, поэтому 16 байтов
    Объект экземпляра занимает общее пространство 16 X 100x1024X1024 = 1600 МБ.
    Массив Integer[] занимает место
    8 байтов заголовка + 4 байта длины массива описания + пространство ссылок 4X100x1024X1024 = 400 МБ (4 байта для каждой ссылки) + padding4 байта ≈ 400 МБ
    Общее пространство 1600+400=2000 МБ
  1. Int[2][100] PK int[100][2]
    измерение Int[2][100] int[100][2]
    массив первого измерения голова объекта 8 8
    первое измерение дескриптор длины массива 4 4
    первое измерение Ширина котировки 2X4=8 100X4=400
    первое измерение Padding 4 4
    первое измерение Всего 24 416
    второе измерение голова объекта 8 8
    второе измерение дескриптор длины массива 4 4
    второе измерение Ширина котировки 100X4=400 2X4=8
    второе измерение Padding 4 4
    второе измерение Всего 416 24
    Всего 24+2X416=856 416+100X24=2816

3.8 Общий ООМ

  1. java.lang.OutOfMemoryError: Java heap space
public static void main(String[] args) {
	List<String> list = new ArrayList<String>();
	while (true) {
	    list.add("内存溢出了");
	}
}
  • Решение
    1. Для больших объектов, которые могут существовать дольше: object = null
    2. Ускорение кода: код работает быстрее и сокращает жизненный цикл объекта.
    3. Изменить размер кучи
  1. java.lang.OutOfMemoryError: PermGen space
    1. jdk1.6 пространство PermGen
    int i = 0;
    while (true) {
        ("在JDK 1.6下运行,在JDK 1.7中运行的结果将完全不同 "
        	+ "string常量在jdk1.7以上就不再存放在PermGen中" + i++).intern();
    }
    
    1. Динамическая загрузка классов, например, с использованием технологии улучшения байт-кода, CGlib всегда создавала и загружала классы.
      Если вам нужно динамически загружать классы и динамически компилировать java-код, лучше иметь отдельный classLoader.При замене класса исходный класс может быть выброшен как мусор.
      Условием освобождения класса является то, что класс под classLoader не имеет живых объектов.
  2. DirectBuffer OOM
    java.lang.OutOfMemoryError: Direct buffer memory
    Область DirectBuffer — это не куча java, а часть кучи C, которая обычно перерабатывается при FULL GC
    // -XX:MaxDirectMemorySize=26m
    public static void main(String[] args) {
    	ByteBuffer.allocateDirect(27 * 1024 * 1024);
    }
    
  3. StackOverflowError
    public void testStackOver() {
    	testStackOver();
    }
    
    Обратите внимание на количество рекурсивных слоев, возьмите количество рекурсивных вызовов в качестве параметра и завершите рекурсию после достижения определенного количества раз
    Методы вызова подкласса и суперкласса друг от друга

В-четвертых, Java-коммуникация

4.1 Преобразование кодировки символов

Если методы кодирования и декодирования символов несовместимы, исходные символы, вероятно, будут повреждены, что приведет к неправильному чтению.
Например, кодировка UTF-8 с переменной длиной может состоять из 3 байтов для формирования китайского символа, а GBK состоит из 2 байтов для формирования китайского символа.Когда GBK читается в 2 единицах длины, используйте ? или другие символы, если он не находится в диапазоне кодирования. Вместо этого изменяет исходную строку

4.2 Вложение наследования потоков

  1. наследовать
    Конкретная реализация некоторых потоков будет наследовать FilterInputStream, а FilterInputStream предоставляет реализацию InputStream по умолчанию.Поток может переопределять только определенные методы.
  2. вложенный
    Вы можете использовать несколько классов реализации потока для одного и того же потока для вложения.Обратите внимание, что когда один из них реализует закрытие потока, базовый базовый поток закрывается, а другие потоки не вызывают свои методы закрытия, что может вызвать ошибки.
    Например, несколько BufferedInputStreams вложены в поток.После закрытия одного из BufferedInputStreams базовый ввод закрывается, но оставшиеся другие BufferedInputStreams не выполняют метод закрытия, и данные буфера не будут сброшены на диск, что приведет к проблемы.

4.3 Ввод/вывод и память

  • Чтение файлов и чтение  
    文件读入与读出

 Что плохого в том, что поток не закрывается?Переполнение памяти?

  • Блокирующие и неблокирующие Синхронные и асинхронные
    Синхронный и асинхронный фокус на механизме передачи сообщений, фокус на вызываемомрезультат
    Блокирующий и неблокирующий фокус на состоянии программы при ожидании результата вызова (сообщение, возвращаемое значение), фокус на программесам
    1. Синхронизировать
      выпускаетперечислить, прежде чем получить результат,перечислитьне возвращаются. Но как только вызов возвращается, вы получаете возвращаемое значение,абонентактивно жду этогоперечислитьрезультат
    2. асинхронный
      перечислитьПосле выдачи вызов возвращается напрямую, поэтому результат не возвращается. существуетперечислитьПосле выпуска,вызываемый абонентСообщите вызывающему абоненту о статусе, уведомлении или обработайте вызов с помощью функции обратного вызова.
    3. блокировать
      Блокирующий вызов означает, что текущий поток приостанавливается до тех пор, пока не будет возвращен результат вызова. Вызывающий поток не возвращается, пока не получит результат.
    4. неблокирующий
      Неблокирующий вызов означает, что вызов не будет блокировать текущий поток до тех пор, пока результат не может быть получен немедленно, а текущий поток продолжает выполняться.

5. База данных

5.1 Основные принципы базы данных

数据库基本结构层次

  1. блок данных/страница
    Блок, единица хранения данных: 4 КБ, 8 КБ, 16 КБ, блок также виртуализирован, это спецификация базы данных и может быть распознана базой данных
    Каждый блок может хранить несколько фрагментов данных, и блок имеет идентификатор (не уникальный, уникальный только в сочетании с идентификаторами более высокого уровня).
    Каждая часть данных внутри блока обычно имеет свой номер строки.
    Узким местом производительности данных является дисковый IOPS при чтении 1 КБ и 1 МБ.непрерывныйданные, отнимающие много времени
    Причина медленной работы: каждый запрос дискового ввода-вывода сериализуется, и каждый запрос ввода-вывода требует адресации дорожки, поэтому он медленный.
    Оптимизация: данные нескольких блоков могут непрерывно объединяться для формирования набора данных.
    Когда некоторые данные в непрерывных блоках обычно используются, а некоторые редко используются, менее часто используемые данные будут записываться обратно на диск, и когда программа снова загружает эти блоки, загружаются только незагруженные части, что приводит к при прерывистой загрузке и становится случайным чтением
  • Словарь данных
    Обычно хранится в таблице, записывающей информацию базы данных, включая смещение каждого блока в файловой системе.
    Небольшой объем данных, мало обновлений, обычно загружаемых в память для обеспечения доступа
    База данных обычно управляет блоками с помощью алгоритма LRU, оставляя некоторые блоки с большим количеством доступов в памяти или позволяя освобождать из памяти блоки с меньшим количеством доступов.
  1. группа расширяется
    Сгруппируйте несколько блоков в группу, которая теоретически хранится непрерывно.
  2. segments
    Несколько расширений образуют сегмент, а табличный объект можно разделить на несколько сегментов для обеспечения независимого управления секционированными таблицами.
  3. Изменить таблицу
    Добавить поле формы
    Некоторые базы данных заранее резервируют небольшое количество места при записи каждого блока, чтобы его можно было использовать при добавлении полей.
    Когда поля зарезервированного пространства недостаточно, определенная часть строки данных будет записана в другой блок.Как правило, если он не находится в непрерывном блоке, требуется несколько данных чтения ввода-вывода.
    Некоторые базы данных с открытым исходным кодом не имеют концепции словаря данных, и большая часть информации описания хранится в заголовке файла на основе таблицы.При изменении структуры таблицы обычно создается новая таблица, и все данные в ней исходная таблица копируется в новую.В таблице для сохранения согласованности данных таблица обычно блокируется при копировании
    Для хранения больших данных обычно используется стратегия подбазы данных и подтаблицы.
  4. удалить таблицу
    Псевдоудаление: удалите таблицы в некоторых базах данных, чтобы предотвратить случайное удаление, когда обрабатывается действие удаления по умолчанию, просто измените имя и сделайте простое сопоставление между измененным именем таблицы и исходным именем таблицы, а также измените ее имя. статус метаданных
  5. выполнение SQL
    Проанализируйте, чтобы получить соответствующую информацию о структуре, план выполнения и т. д.
    • мягкий разбор
      Кэшируйте процесс разбора SQL, тот же SQL, только параметры разные, вы можете напрямую запускать проанализированные результаты напрямую для повышения эффективности
    • жесткий разбор
      Параметры в месте склейки не компилируются, а SQL не используется повторно, что неэффективно.
    • Место для хранения SQL
      Объем памяти SQL ограничен, используйте LRU-подобный алгоритм для управления областью памяти.
    • План реализации
      Независимо от того, индексируется ли отдельная таблица, является ли она jion или union при наличии нескольких таблиц, выбор метода сортировки, определение минутной стратегии и т. д.
    select * from table small,table big where small.id =big.id and small.type=’1’;
    
    small.id =big.id: Используйте небольшой стол в качестве дискового стола, быстрее
    Для условий с хорошей фильтрацией вы можете просмотреть план выполнения и сначала выполнить условие (порядок выполнения Oracle и mysql несовместим)
  6. замок
    При чтении и записи таблицы в словарь данных обычно добавляется блокировка, чтобы гарантировать, что структура таблицы не будет изменена, что в целом похоже на блокировку чтения-записи, но также может быть прочитано при записи, что может вызвать проблема чтения грязных данных.Решение - увеличить Timestamp или номер версии для идентификации
    Для некоторых баз данных заблокированными строками могут быть не только строки, отфильтрованные окончательным условием where, но могут быть все строки, отфильтрованные по полям индекса в условии where.
    update table set … where a=xx and b=xxxx
    
    Если у a есть индекс, а у b нет, он может заблокировать все данные, отфильтрованные по условию a, и область блокировки будет больше. Чтобы повысить скорость блокировки некоторых баз данных, они будут заблокированы в «блочных» единицах.Заголовок блока содержит внутреннюю информацию о строке, и каждая строка имеет 1 бит, чтобы определить, была ли она заблокирована или нет.
    Из-за большого количества модификаций данных проблемы с последовательной скоростью могут быть вызваны блокировками, и вместо блокировок можно использовать механизм cas.
  7. представить
    При выполнении операции Commit журнал будет записан на диск
    База данных выделит буфер журнала в памяти и сохранит его на диск через определенный период времени/когда журнал достигнет определенной емкости.
    Существование журнала может обеспечить функцию отката для базы данных.
    Кроме того, также возможно, что база данных записывает соответствующую версию каждого блока в определенное пространство.Пока места достаточно, данные соответствующей версии не будут очищены, а данные соответствующего номера версии/ момент времени будет напрямую запрашиваться во время отката.

5.2 Принцип индекса

Индексный метод: дерево B+, также хэш
Индексы хранятся отдельно от данных
Цель индекса — быстро найти данные. Индекс связан с исходной таблицей (также называемой таблицей возврата) с помощью некоторого идентификатора. Идентификатором может быть первичный ключ, значение поля индекса или физическое расположение данных (для этого Oracle использует rowid).表空间编号+文件编号+对象编号+块号+块内行号)
Если вся запрошенная информация не находится в индексе, индекс будет выполнять по крайней мере две операции (индекс + таблица возврата), поэтому производительность мелкомасштабного индекса данных невелика.
При обновлении индекса он сначала удаляется, а затем вставляется.Удаление является псевдоудалением, и пространство индекса не становится меньше.
Перекомпиляция индекса фактически удалит индекс

  • Управление индексами
    Древовидный индекс управления, чем больше объем данных, чем больше слоев, тем большеаккуратный, все листовые блоки внизу проходят черезДвусвязный списоквзаимосвязанный

    三层索引管理
    Когда SQL проходит через индекс, он будет искать от корня дерева, и блок индекса обычно кэшируется в кеше (если объем данных блока индекса слишком велик, кэшируется только блок индекса высокого уровня). , ввод-вывод может не потребоваться.Кроме того, поскольку индекс упорядочен, вы можете быстро искать по дихотомии, если вам все еще нужно запрашивать неиндексные поля после проверки индекса, вернитесь к таблице в это время, в противном случае перейдите непосредственно к внутренним данным индекса
    Некоторые статистические операции SQL могут выполняться с помощью индексов (таких как подсчет), и могут быть подсчитаны только листовые блоки, и может быть получена вся информация таблицы.
    Минимальные, максимальные операции, с условиями where, затем нормально обходят индекс, без условий, напрямую проверяют первый и последний блоки
    Подобный индекс префикса можно искать по диапазону, в то время как индекс суффикса может быть полным сканированием таблицы

  • Поле имеет индекс и не обязательно должно идти в индекс
    При поиске в он обычно анализируется как метод ИЛИ. Поиск выполняется в нескольких дискретных блоках. Каждое условие нужно искать отдельно. Если условий много, выполняется полное сканирование таблицы (изменение в существует?)
    Другой пример: некоторые поля состояния могут не индексироваться как условия.

  • Битовый индекс bitmap
    Но когда поле имеет только несколько значений, растровое изображение может обеспечить эффективную статистику.
    Структура растрового индекса аналогична дереву B+, которое при сохранении разделяется типом значения поля, и независимо от того, имеет ли каждая строка данных это значение, хранится отдельно в пространстве каждого значения, 1 есть, 0 нет
    Если тип поля — A, индекс может быть примерно сохранен как 101010100, что указывает на то, что строка 1357 имеет значение A.
    Недостаток: слишком большая степень детализации блокировки
    Если состояние модификации 1 равно 2, все строки со значениями 1 и 2 будут заблокированы, а фиксация или откат будут только освобождены.

5.3 Принцип «ведущий-ведомый» базы данных

Основная база данных обновляет данные, а затем синхронизируется с подчиненной базой данных.

  1. Режим синхронизации: логический режим
    Основная база данных выполняет SQL, а подчиненная база данных выполняет тот же SQL.
    Основная библиотека может оптимизировать SQL, например, генерировать SQL на основе обновления первичного ключа, выполнение подчиненной библиотеки будет проще.
    В основном есть только один поток для записи из библиотеки, а остальные для чтения, меньше нагрузки и более эффективно
    Недостатки: SQL-запросов больше, а скорость записи подчиненной библиотеки даже ниже, чем у основной библиотеки, что приводит к несогласованности
  2. физический режим
    Репликация на основе измененных блоков данных
    Извлеките блоки данных с более высоким номером версии, чем у подчиненной библиотеки, и скопируйте их в подчиненную библиотеку без синтаксического анализа SQL, блокировки, планирования и других проблем, что более эффективно.

5.4 План выполнения

Маленькая таблица используется как управляющая таблица, а большая — как индексная.

  • Oracle
  1. explain plan for sql,select * from table(DBMS_XPLAN.DISPLAY)
  2. SET AUTOTRACE ON EXPLAIN , SET AUTOTRACE ON, SET AUTOTRACE TRACEONLY STAT
    eg:
    explain plan for select * from tableAA a where a.tt=:vv1;: в начале представляет собой заполнитель
    INDEX UNIQUE SACN: взять уникальный индекс
    INDEX RANCE SCAN: нормальный индекс является индексом диапазона, потому что его можно повторять.
    Если план выполнения Oracle неверен или неидеален, вы можете сообщить Oracle, как индекс должен проходить через метод Hint.
  • Mysql
    explan<sql>

  • План реализации
    Перед таблицей JOIN таблица, которую необходимо объединить, может сначала отфильтровать большую часть данных.
    Маленькая таблица управляет большой таблицей, и упорядочение будет быстрее, когда цикл вложен.
    Чтобы объединить несколько наборов результатов, вы можете использовать метод хэш-соединения.Когда таблица слишком велика и имеется слишком много ключей хэш-соединения, память не сможет поместиться.

  • преобразование функции
    Преобразования функций обычно выходят за рамки планов выполнения.
    select fun1(a),fun(b)… from table
    Путь выполнения — это обработка, которая не может видеть функцию

5.5 Оптимизация структуры модели

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

6. Исходный код

6.1 Путь исходного вызова

Thread.currentThread().getStackTrace();
new Exception().printStackTrace();

6.2 Отражение

Внедрение булевых свойств

Имена атрибутов логического типа не должны начинаться с префикса is

class Node {
    private boolean good;
    public boolean isGood() {
	return good;
    }
    public void setGood(boolean good) {
	this.good = good;
    }
}

При использовании PropertyDescriptor для получения метода чтения/записи свойства логический тип будет иметь префикс is по умолчанию.
Если имя атрибута isGood, то метод isIsGood будет вызываться по умолчанию, и метод isGood в классе работать не будет.

Отражение и общее стирание

List<Integer> list = new ArrayList<Integer>();
Method method = ArrayList.class.getDeclaredMethod("add",Object.class);
method.invoke(list, 7);
method.invoke(list, "dfsd");
method.invoke(list, new A("aa"));
System.out.println(list);
  1. Универсальные аргументы могут сохранять только свои подписи в параметрах класса, поля и метода (то есть фактический тип параметра может быть получен), а конкретные аргументы универсальных экземпляров не могут быть получены динамически через отражение, они будут стерты как объект.
  2. Когда вам нужно получить общие аргументы, есть три способа: ① Путем передачи фактического типа параметра
    ② Определенно определите общий тип параметра и получите подпись посредством отражения.
    ③ Захват связанных общих аргументов через анонимные классы

AOP

Аспектно-ориентированные, динамические прокси и методы улучшения байт-кода

  1. Если целевой объект реализует интерфейс, динамический прокси-сервер JDK будет использоваться для реализации АОП по умолчанию.
  2. Если целевой объект реализует интерфейс, вы можете принудительно использовать CGLIB для реализации АОП.
  3. Если целевой объект не реализует интерфейс, необходимо использовать библиотеку CGLIB, и Spring автоматически преобразует динамический прокси JDK в CGLIB.
  • Динамический прокси
    Когда динамический прокси генерирует динамический байт-код, он создает подклассы не через реализацию классов, а через список интерфейсов, принадлежащих классам, то есть сконструированные классы не имеют ничего общего с классами реализации.
    При построении динамического прокси класс должен реализовать динамический прокси на основе интерфейса.Когда ссылка на экземпляр динамического прокси наконец получена, она может быть получена только интерфейсом.
    По сути, класс реализации передается в Handler как ссылка, либо вызывается метод класса реализации, но он просто заворачивается в слой.
    Реализуйте метод интерфейса, а затем вызовите метод класса реализации по ссылке внутри метода.
    Если во внутреннем методе снова вызывается внутренний метод, то врезка АОП не может быть завершена во внутреннем методе второго слоя, он уже вызывается напрямую
  • Усовершенствования байт-кода
    Если внутренний метод вызывается снова, включение АОП может выполняться все время. Это связано с тем, что расширение байт-кода предназначено для создания подкласса или прямого изменения байт-кода класса. Если это подкласс, потому что подкласс переопределяет метод родительского класса, он всегда будет вызывать модифицированный метод подкласса, вы всегда можете использовать АОП; если вы напрямую изменяете байт-код, это модификация метода

Annotation

Аннотации по-прежнему в основном реализуются путем отражения

7. JDBC

7.1 Регистрация JDBC

Драйвер нужно загрузить только один раз, его не нужно загружать повторно, и он не должен быть сам по себе новым.Зарегистрированные драйверы сохраняются в виде списка.Загрузка драйвера также связана с загрузчиком классов Все также могут загружать разные версии одного и того же драйвера в разные загрузчики классов.
Когда в программе есть несколько драйверов, DriverManager находит все драйверы в своем загрузчике классов путем обхода, сопоставляет jdbcurl и возвращает, если он соответствует