Вопросы на собеседовании: Java-разработчик
100 реальных вопросов с образцовыми ответами и пояснениями для уровня Senior.
Смотреть пример резюме: Java-разработчик →Тренировка флешкарточками
Интервальное повторение · Hunter Pass
Вопросы
Я бы сначала рассчитал весь process и load-test несколько heap sizes вместо выдачи всех 8 GiB в `-Xmx`.
- Резервируется measured space для metaspace, code cache, thread stacks, direct buffers, native libraries и примерно 10%-15% container headroom.
- Начну около `-Xms4g -Xmx4g`, затем сравню allocation stalls, GC CPU, live-set margin, pause percentiles, RSS и p99 под sustained allocation 1,2 GiB/s.
- Оставлю smallest heap, выполняющий p99 120 мс и throughput без old-generation growth или container memory pressure.
Зачем это спрашивают: Интервьюер проверяет, следует ли heap sizing полному process budget, live set, allocation rate и service latency.
Я бы сначала benchmark ZGC, потому что pause target 10 мс на 32 GiB favore concurrent relocation, сохранив G1 как throughput baseline.
- ZGC обычно держит short pauses на large heaps, но потребляет concurrent CPU и extra memory, поэтому available headroom 25% проверяется.
- G1 может дать лучший throughput, если young и mixed collections остаются ниже 10 мс при measured live set и allocation rate.
- Решение использует p99 и p99.9 pauses, application throughput, GC CPU, RSS, allocation stalls и recovery после traffic bursts.
Зачем это спрашивают: Сильный ответ выбирает collector по heap scale, pause objective и measured CPU cost, а не reputation.
Я бы записал steady workload и unified GC logs до изменения одного flag за раз.
- Собираются allocation rate, live set после full marking, young и mixed pause distributions, remembered-set work, promotion, evacuation failures, concurrent-cycle timing и GC CPU.
- Lower `MaxGCPauseMillis` может уменьшить young collections и повысить frequency, а manual young sizing может конфликтовать с G1 ergonomics.
- Change остаётся только при improvement end-to-end p99, throughput и CPU через warm-up, steady state и old-generation pressure.
Зачем это спрашивают: Интервьюер оценивает, основан ли G1 tuning на phase-level telemetry и application outcomes вместо flag folklore.
Я бы тестировал Generational ZGC, когда большинство objects die young, а non-generational ZGC тратит лишнюю работу на весь allocation stream.
- Supported Java 21 option включается в isolated benchmark с одинаковыми heap, workload, warm-up и container limits.
- Измеряются pause percentiles, allocation stalls, concurrent GC CPU, remembered-set overhead, live-set recovery, throughput и RSS несколько часов.
- Adopt только если workload 3 GiB/s выигрывает CPU или throughput без regression latency или operational supportability.
Зачем это спрашивают: Сильный ответ связывает generational collection с object lifetime distribution и эмпирически проверяет Java 21 implementation.
Я бы держал temporary objects local и nonescaping, чтобы C2 мог scalar-replace их после inlining.
- Return object, store в field, передача opaque code или lost inlining могут заставить allocation escape и остаться в heap.
- JFR или async-profiler allocation profiles проверяют allocations compiled code, а JIT compilation logs объясняют failed inlining или deoptimization.
- JMH benchmark с consumed results и warmed forks должен показать lower allocation и equal behavior до переписывания readable domain code.
Зачем это спрашивают: Интервьюер проверяет, понимается ли escape analysis как JIT optimization с observable preconditions, а не source-level guarantee.
Я бы сокращал allocation только в measured hot paths, потому что 900 MiB/s всё равно тратит GC CPU и memory bandwidth при short pauses.
- TLAB делает отдельные allocations cheap, но refills, young-region turnover, survivor copying и promotion потребляют shared resources.
- Profile bytes и objects по allocation site, затем target boxing, temporary collections, string formatting и oversized buffers с clear ownership.
- Change принимается только при improvement CPU, throughput или capacity без unsafe pooling или readability cost выше gain.
Зачем это спрашивают: Сильный ответ признаёт allocation throughput resource cost, не считая каждый young object performance bug.
Я бы отделил time to reach safepoint от stop-the-world operation 12 мс.
- Threads в native calls, long counted loops или paths с delayed polling могут задержать global synchronization при коротком collector work.
- Safepoint logs, JFR thread states и stack samples находят slow thread и involvement JNI, compiler activity или diagnostic action.
- Fix направлен на blocking native или polling path; collector pause flags не удалят 168 мс достижения safepoint.
Зачем это спрашивают: Интервьюер оценивает, диагностирует ли кандидат JVM pauses до garbage-collector work.
Я бы сравнил dominators и GC-root paths в equivalent workload points и связал growth с explicit retention policy.
- Leak обычно растёт через listeners, static collections, thread locals, class loaders или keys, которые должны expire.
- Legitimate cache должна иметь configured maximum, eviction metrics, hit value и retained size, correlated с expected key cardinality.
- MAT histograms и dominator deltas находят owners extra 2,3 GiB, а forced full GC подтверждает только reachability, не usefulness.
Зачем это спрашивают: Сильный ответ отделяет object reachability от business usefulness и использует comparable heap evidence.
Я бы дал каждому deployment один disposable child class loader и удалял strong references при stop plugin.
- Threads, thread locals, JDBC drivers, logging registries, executors, MBeans и static parent caches часто retain old loaders.
- Class-unload и Native Memory Tracking metrics плюс `jcmd VM.classloader_stats` проверяют disappearance loader generations после full marking.
- Churn test должен load и unload значительно больше 400 versions с bounded metaspace до acceptance lifecycle.
Зачем это спрашивают: Интервьюер проверяет, строится ли class unloading вокруг loader reachability и common framework retention points.
Я бы считал 2 GiB measured native budget, а не guaranteed spare memory.
- Учитываются direct buffers, metaspace, JIT code cache, thread stacks, GC structures, JNI libraries, memory mappings и allocator fragmentation.
- Monitor RSS, NMT categories, Netty allocator metrics, thread count и `BufferPoolMXBean`, затем cap direct memory и pools по observed peak.
- Оставляется container headroom для bursts и kernel accounting; если native peak выше budget, heap или concurrency уменьшается до OOM kill.
Зачем это спрашивают: Сильный ответ size весь JVM process и связывает off-heap consumers с container enforcement.
Я бы использовал bounded direct-buffer pool networking library, если profiling показывает copy или allocation cost, а не custom unbounded pool.
- Direct buffers снижают native I/O copies, но имеют allocation и cleanup costs и потребляют memory outside Java heap.
- Arenas и maximum retained capacity size по concurrency и payload percentiles, oversized buffers не возвращаются common pools.
- Throughput, CPU, RSS, allocator fragmentation, pool hit rate и tail latency сравниваются с heap buffers на 40 000 RPS.
Зачем это спрашивают: Интервьюер оценивает, ограничено ли off-heap pooling workload и measured native-memory risks.
Я бы отделил startup capacity от steady-state и warmed real hot paths до ready replica.
- JFR и compilation logs показывают tiered compilation, code-cache pressure, inlining, uncommon traps и repeatedly deoptimized methods.
- Representative warm-up сохраняет branch и type profiles; synthetic calls с другими receivers могут создать misleading compiled code.
- Capacity planning включает readiness 90 секунд, rollout surge и cold-replica routing, а compiler flags вторичны к unstable profiles.
Зачем это спрашивают: Сильный ответ связывает adaptive compilation behavior с readiness, benchmarking и real traffic profiles.
Я бы проверил, отключил ли larger heap compressed ordinary object pointers или изменил object alignment.
- Compressed oops часто работают ниже JVM-dependent addressable threshold около 32 GiB, уменьшая reference и header width.
- `jcmd VM.info`, startup logs, JOL и class histogram подтверждают pointer mode и actual object layout вместо nominal threshold.
- Сравниваются total RSS, live-set bytes, cache locality, pause behavior и p99; heap 40 GiB может дать меньше effective capacity, чем ожидалось.
Зачем это спрашивают: Интервьюер проверяет знание compressed references и причины роста cost каждого object на larger heap.
Я бы benchmark primitive-oriented layout, потому что 30 млн object headers и references могут доминировать actual price data.
- Records улучшают immutability и API clarity, но остаются heap objects и не удаляют headers или pointer chasing автоматически.
- Parallel primitive arrays или packed off-heap structure улучшают density и locality, но добавляют indexing, lifecycle и safety complexity.
- Выбор делается по measured bytes per entry, scan throughput, update pattern, GC pressure, serialization cost и maintainability.
Зачем это спрашивают: Сильный ответ отличает language-level compact syntax от physical memory layout и учитывает scale.
Я бы continuously записывал low-overhead JFR и trigger async-profiler во reproduced burst для higher-resolution stacks.
- JFR связывает CPU, allocation, locks, threads, GC, safepoints, I/O и application events на одной timeline.
- async-profiler добавляет wall-clock, CPU, allocation и lock flame graphs с sampling без safepoint bias.
- Один 30-second window и request IDs должны связать hot stacks с latency, иначе flame graph оптимизирует unrelated background work.
Зачем это спрашивают: Интервьюер оценивает, сочетаются ли profiling tools по потребности time correlation и stack resolution.
Я бы published immutable configuration через volatile reference или другой explicit happens-before edge.
- Volatile write reference happens-before later volatile reads, делая все prior constructor writes visible readers.
- Final fields добавляют initialization guarantees, только если `this` не escapes during construction; сами они reference не publish.
- Replacement complete object не позволяет readers увидеть mix old и new values между fields.
Зачем это спрашивают: Сильный ответ применяет happens-before к concrete publication path вместо abstract visibility.
Я бы использовал `LongAdder`, когда high write throughput важнее atomic instantaneous total.
- `AtomicLong` выполняет CAS на одной cache line, поэтому retries и coherence traffic резко растут под 32-core contention.
- `LongAdder` распределяет updates по cells и sums при read, меняя extra memory и non-linearizable snapshots на write scalability.
- JMH contention benchmark плюс accuracy contract metric решает, полезен ли gain 8 million per second.
Зачем это спрашивают: Интервьюер проверяет, сознательно ли atomicity strength обменивается на contention scalability.
Я бы начал с `synchronized` для simple mutual exclusion и выбрал `ReentrantLock` только ради required capability, proven contention tests.
- `ReentrantLock` добавляет timed и interruptible acquisition, multiple conditions и optional fairness, которая может снизить throughput.
- 40 microseconds на 32 contenders делает lock partitioning или shorter critical sections важнее выбора lock implementation.
- JFR lock events и production-shaped benchmark сравнивают wait time, throughput, p99 и cancellation behavior.
Зачем это спрашивают: Сильный ответ не считает lock classes performance ranking и сначала исправляет contention structure.
Я бы вынес slow I/O из atomic map computation и хранил short-lived future или promise per key.
- First caller installs `CompletableFuture`, выполняет loading на bounded executor, followers share result без duplicate calls.
- Failures намеренно remove или expire placeholder, чтобы один exceptional future не poisoned key forever.
- Total in-flight loads bounded, измеряются bin contention, duplicate suppression, loader p99, memory и timeout behavior на 5 000 keys per second.
Зачем это спрашивают: Интервьюер оценивает safe compound map operations без slow work внутри internal synchronization.
Rough blocking ratio предлагает около 160 running и waiting threads для full CPU utilization, но throughput demand делает downstream capacity real bound.
- Estimate: 16 умножить на 1 плюс 45 делить на 5, получается около 160 threads до scheduling и memory overhead.
- При 2 000 RPS и wait 45 мс Little's Law даёт около 90 concurrent I/O operations, которые должны fit connection pools и downstream limits.
- Load-test queue delay, CPU, thread count, connection use, p99 и rejection, затем bounded queue вместо unlimited work.
Зачем это спрашивают: Сильный ответ сочетает blocking-ratio heuristic с Little's Law и downstream constraints.
Закрытые вопросы
- 21
Request fans out к шести services через `CompletableFuture` и имеет deadline 300 мс. Как structure futures?
estimationconcurrency - 22
Java 21 API делает один blocking HTTP call 80 мс per request и target 50 000 concurrent requests. Использовать virtual threads?
concurrencyhttpapi - 23
Virtual-thread service может создать 100 000 tasks, но PostgreSQL разрешает только 120 connections. Как enforce boundary?
concurrencypostgres - 24
Library submits blocking work в `ForkJoinPool.commonPool`, а 24 CPU-bound parallel-stream tasks делят его. Что изменить?
- 25
Inventory service сериализует updates per SKU для 10 млн SKUs. Создавать один lock per key?
serialization - 26
32 worker threads обновляют independent counters, но throughput перестаёт scale после восьми cores. Как test false sharing?
concurrencyscalingthroughput - 27
Transfer operation требует locks на двух из 1 млн accounts. Как предотвратить deadlock при сохранении concurrency?
concurrencylocking - 28
Spring Boot service имеет 260 beans и три alternative payment implementations. Как сделать dependency injection explicit и testable?
springinjectiondependencies - 29
Public method вызывает другой method того же Spring bean с `@Transactional`, но second transaction policy ignored. Почему?
transactionsspring - 30
Order transaction вызывает audit write, которая должна survive order rollback. Использовать `REQUIRES_NEW`?
transactionsrollback - 31
Два requests читают stock 10 и каждый subtract 7 под `READ_COMMITTED`. Как предотвратить overselling?
- 32
Spring service должен commit order и publish event на 8 000 orders per second без two-phase commit. Как использовать outbox?
spring - 33
Выберите Spring MVC с virtual threads или WebFlux для API с тремя blocking JDBC calls и 15 000 concurrent requests.
concurrencyapispring - 34
WebFlux endpoint производит 1 000 events per second, SSE client потребляет 50, а connection может buffer только 64 MiB. Как model backpressure?
backpressureendpoints - 35
Kubernetes deployment имеет 80 Spring pods, а PostgreSQL разрешает 600 application connections. Как size HikariCP?
kubernetesdeploymentpostgres - 36
Spring Boot application должна start за 800 мс для scale-to-zero workloads. Что измерить до выбора AOT или другого framework?
spring - 37
40 Spring services делят 120 configuration keys в четырёх environments. Как предотвратить silent misconfiguration?
springconfig - 38
Checkout call имеет deadline 900 мс и вызывает dependency с p99 220 мс. Как compose Resilience4j timeout, retry, circuit breaker и bulkhead?
resiliencedependenciesestimation - 39
Method с `@Cacheable` обслуживает 50 000 reads per second, entries должны reflect price changes за 10 секунд. Как design?
designcaching - 40
Java API тратит 38% CPU на `BigDecimal` construction и formatting при 30 000 RPS. Как optimize?
optimizationapi - 41
async-profiler allocation flame graph показывает 6 млн boxed `Long` objects per second из Stream pipeline. Что изменить?
ci-cdasync - 42
Нужно сравнить два Java parsers примерно по 300 ns каждый. Как построить JMH benchmark?
- 43
При 20 000 RPS debug logging строит JSON messages по 4 KiB даже при disabled level. Как удалить cost?
logging - 44
64-thread benchmark тратит 37% wall time в ожидании одного lock. Что сделать до замены на lock-free code?
concurrency - 45
Order API принимает 12 000 commands per second, а clients retry 24 часа. Как implement idempotency?
idempotencyresilience - 46
Order service пишет 5 000 orders per second, reporting joins занимают 2 секунды и могут быть stale 5 секунд. Вводить CQRS?
joinscqrs - 47
Kafka-backed Spring processor должен обрабатывать 60 000 events per second с order per customer. Как выбрать partitions?
kafkaspringpartitioning - 48
Spring call chain имеет deadline 700 мс, а три services настроены на два retries каждый. Как предотвратить retry amplification?
resiliencespringconfig - 49
Один downstream выдерживает 300 concurrent calls, но 40 Spring pods могут создать 4 000. Как применить bulkheads и circuit breaker?
resiliencespringconcurrency - 50
Pricing service имеет 30 country-specific rule sets, меняющихся weekly. Какой pattern использовать вместо conditional method на 2 000 lines?
pricing - 51
Heap Spring service растёт с 2 до 11 GiB за четыре дня, и service restart каждую ночь. Как расследовать leak?
springdata-structuresmemory - 52
Old-generation occupancy остаётся 92% после mixed collections при stable request volume. Что делать до увеличения `-Xmx`?
collections - 53
Heap 14 GiB OOM во время traffic burst две минуты, но heap dump не записан из-за full disk. Как получить useful evidence?
memorydata-structures - 54
Kubernetes OOM-kills Java pod при 8 GiB, heap usage ниже 4,5 GiB, Netty direct memory достигает 2,1 GiB. Как реагировать?
memorykubernetesdata-structures - 55
Metaspace растёт на 120 MiB после каждого application redeploy и достигает limit после шести deploys. Как найти class-loader leak?
deployment - 56
После release G1 stop-the-world p99 растёт с 45 до 480 мс на heap 24 GiB. Как диагностировать?
memorydata-structures - 57
ZGC service держит pauses ниже 5 мс, но показывает allocation stalls и рост CPU с 58% до 91%. Что проверить?
- 58
G1 logs показывают 900 humongous allocations per minute после роста payload с 400 KiB до 3 MiB. Что изменить?
- 59
Batch service запускает full GC каждые 70 секунд после tripled survivor promotion. Как найти cause?
batch - 60
Service падает с `unable to create native thread` на 18 000 threads при healthy heap. Как стабилизировать?
concurrencydata-structuresmemory - 61
Все 240 Tomcat threads ждут один downstream, executor queue имеет 18 000 tasks, API p99 14 секунд. Что делать?
concurrencydata-structuresapi - 62
Blocking SDK calls занимают `ForkJoinPool.commonPool`; 96% `CompletableFuture` tasks ждут при CPU 22%. Как исправить?
concurrency - 63
HikariCP имеет 30 active connections, 400 waiting requests и acquisition timeout 5 секунд при PostgreSQL CPU 95%. Как реагировать?
postgresresilience - 64
Java 21 service использует virtual threads, но JFR показывает 80 carrier threads pinned на 600 мс внутри synchronized block. Что изменить?
concurrency - 65
Два order threads deadlocked; `jstack` показывает, что каждый owns один account monitor и ждёт другой. Как устранить?
concurrencylockingmonitoring - 66
JFR показывает 43% request time в contention на одном `ReentrantLock`, p99 растёт с 90 до 780 мс при 64 threads. Что делать?
concurrency - 67
Function в `ConcurrentHashMap.computeIfAbsent` делает HTTP call 900 мс, и unrelated cache requests stall. Как repair?
concurrencyhttpcaching - 68
Unbounded executor queue растёт до 2,4 млн tasks и потребляет 9 GiB, workers обрабатывают только 8 000 tasks per second. Как восстановиться?
concurrencydata-structures - 69
Scheduled job длится 75 секунд, но runs каждые 60 секунд, создав 180 overlapping executions за три часа. Как исправить?
- 70
WebFlux service имеет low CPU, но event-loop threads проводят 1,4 секунды в JDBC driver и 6 000 requests queue. Как стабилизировать?
concurrencydata-structuresjdbc - 71
Release повышает API p99 с 180 мс до 1,9 секунды, median меняется только на 20 мс. Как использовать JFR?
api - 72
CPU достигает 100% после validation release, async-profiler attributеs 46% одному regular expression. Что изменить?
asyncregexvalidation - 73
Allocation растёт с 450 MiB/s до 2,8 GiB/s после JSON-library upgrade, повышая GC CPU на 19 пунктов. Откатывать?
- 74
Loading 500 orders запускает 501 SQL statements через Hibernate и повышает endpoint latency до 2,6 секунды. Как убрать N+1?
sqln+1orm - 75
JPA repository query scans 18 млн rows и занимает 4,2 секунды после нового optional filter. Как optimize?
queriesormoptimization - 76
Spring Data import вставляет 2 млн rows со скоростью 1 100 rows per second и использует 10 GiB heap. Как улучшить?
springdata-structuresmemory - 77
Controller бросает `LazyInitializationException` после отключения `open-in-view`. Как repair boundary?
- 78
PostgreSQL сообщает deadlocks между двумя Spring transactions, обновляющими orders и inventory в opposite order. Как исправить?
transactionspostgreslocking - 79
Popular cache key expires, 3 000 requests одновременно query PostgreSQL и доводят database до CPU 100%. Как остановить stampede?
databasequeriespostgres - 80
Logging change повышает allocation на 700 MiB/s и p99 на 240 мс, хотя debug logging disabled. Что проверить?
logging - 81
Rolling deploy падает с `NoSuchMethodError` только на 30% pods после library upgrade. Как найти dependency conflict?
deploymentdependencies - 82
После Spring Boot 3 upgrade requests падают с `ClassNotFoundException: javax.servlet.Filter` на 60 services. Как реагировать на migration?
migrationsspring - 83
Hot-reload platform возвращает wrong implementation после 40 redeploys, old class loaders остаются reachable. Что делать?
- 84
Spring release starts с двумя `PaymentClient` beans и падает, потому что один module потерял qualifier. Как предотвратить на 70 services?
spring - 85
Переход Java 17 на 21 заставляет older framework fail reflective access на startup в 25 services. Что делать?
- 86
Native-image deployment starts за 70 мс, но падает только на одном reflection-based serializer в production. Как recover?
serializationdeployment - 87
Rolling deploy смешивает две Java versions, serialized session objects fail на 18% requests. Как repair compatibility?
sessionsdeploymentserialization - 88
Timeout property intended 500 мс parsed как 500 секунд на 12 services после config migration. Как ограничить?
migrationsconfigresilience - 89
Resilience4j retry change превращает 6 000 requests per minute в 31 000 attempts при slow dependency. Как остановить storm?
resiliencedependencies - 90
Kafka lag достигает 18 млн records, потому что один tenant создаёт 62% traffic одной partition. Как исправить hot key?
partitioningkafkarecords - 91
Outbox table накопила 24 млн rows, events опаздывают 47 минут, хотя order commits successful. Как восстановиться?
- 92
Payment endpoint charges 126 customers twice после clients retry timed-out requests. Как реагировать?
resilienceendpoints - 93
Circuit breaker opens после пяти failures на service с 40 000 requests per second и отправляет 70% traffic в costly fallback. Что изменить?
resilience - 94
Kafka producer добавляет required field, 9 из 34 consumers fail deserialization во время rollout. Как recover?
kafka - 95
Mid-level engineer отвечает на leak увеличением heap с 4 до 12 GiB, restarts переходят с daily на каждые три дня. Как mentor?
mentoringdata-structuresmemory - 96
Java engineer использует `parallelStream()` для 300 blocking calls и starves unrelated futures. Как redirect design?
design - 97
Junior engineer fixes race через `synchronized`, снижая throughput с 22 000 до 3 100 RPS. Что делать?
throughputconcurrency - 98
Два senior engineers хотят rewrite blocking JDBC API в WebFlux после p99 1,6 секунды. Как решить proposal?
jdbcapi - 99
Teammate хочет deploy Hibernate migration сегодня, но load test выдаёт в 14 раз больше SQL statements. Как учесть deadline?
sqlmigrationsorm - 100
Java platform outage стоит $430 000 после memory leak, retry storm и missing heap dump между тремя teams. Как провести postmortem?
memoryresiliencedata-structures