Ответ
Уровни кэширования — иерархическая система быстрой памяти между процессором и основной памятью (RAM), предназначенная для уменьшения задержек доступа к данным.
Иерархия кэшей (от быстрого к медленному):
| Уровень | Расположение | Размер | Задержка | Назначение |
|---|---|---|---|---|
| L1 | Внутри ядра процессора | 32-64 КБ | 1-4 нс | Кэш инструкций (L1i) и данных (L1d) |
| L2 | Внутри ядра/общий для ядер | 256 КБ - 1 МБ | 10-25 нс | Универсальный кэш |
| L3 | Общий для всех ядер | 8-32 МБ | 30-50 нс | Кэш последнего уровня (LLC) |
| RAM | На материнской плате | 8-64 ГБ | 80-120 нс | Основная память |
Принцип локальности, используемый кэшами:
- Временная локальность — повторное использование данных
- Пространственная локальность — доступ к соседним данным
Пример влияния на производительность Java:
// ПЛОХО: случайный доступ (cache miss)
int sum = 0;
for (int i = 0; i < N; i++) {
sum += array[randomIndex[i]]; // Частые промахи кэша
}
// ХОРОШО: последовательный доступ (cache friendly)
int sum = 0;
for (int i = 0; i < array.length; i++) {
sum += array[i]; // Использует пространственную локальность
}
Оптимизации для разработчиков:
- Выравнивание данных — структуры, кратные 64 байтам
- Предвыборка (prefetching) — предварительная загрузка данных
- Избегание false sharing — разные ядра не должны модифицировать одну cache line
В контексте Java-приложений также существуют:
- Кэш JVM (пулы строк, метаданные классов)
- Кэш приложения (Ehcache, Caffeine)
- Кэш СУБД (буферный пул, query cache)