Skip to content

Вопросы на собеседовании: Java-разработчик

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

Смотреть пример резюме: Java-разработчик

Тренировка флешкарточками

Интервальное повторение · Hunter Pass

Вопросы

springcontainersjvm

Я бы сначала рассчитал весь 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.

memorydata-structures

Я бы сначала 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.

memorydata-structures

Я бы записал 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.

memorydata-structures

Я бы тестировал 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.

pricing

Я бы держал 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.

cachingmemorydata-structures

Я бы сравнил 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.

designdeployment

Я бы дал каждому 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.

containersconcurrency

Я бы считал 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.

gateway

Я бы использовал 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.

jvmmemorydata-structures

Я бы проверил, отключил ли 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.

immutabilityrecordsprimitives

Я бы 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.

load-testingasync

Я бы 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.

concurrencyconfigmemory

Я бы 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.

concurrencymonitoring

Я бы использовал `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.

concurrency

Я бы начал с `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.

concurrency

Я бы вынес 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.

concurrency

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