๐Ÿ’ป
Albert's Til
GitHub
  • ๋งค์ผ๋งค์ผ ์กฐ๊ธˆ์”ฉ ์„ฑ์žฅํ•˜๊ธฐ
    • README
    • CS
      • Network
      • HTTP
        • NO-CACHE
      • ์˜ค๋ฅ˜ ์ฝ”๋“œ
      • ORM ๋„๊ตฌ
      • Design Pattern
        • CQRS Pattern
          • Event Sourcing and CQRS pattern
        • Builder Pattern
    • DB
      • MySQL
        • Timeline
        • Pagination
        • Index
        • Database Performance Optimization Strategies
        • B+ tree
        • MySQL Connectors VS MySQL Shell(Scripting) VS MySQL Workbench
        • MySQL Storage Engine Architecture
      • Normalization & Denormalization
      • JPA
        • @Transactional
        • Why JPA?
        • About JPA
        • N+1 Issue
        • Index
        • ElementCollection&CollectionTable
        • orphanRemoval
        • CascadeType
        • Use Subselect
        • Dynamic Instance Creation
        • Paging
        • Order
        • Spefication
        • mappedBy
      • MongoDB
        • ObjectId
      • Why MySQL?
      • ACID properties of transactions
      • Between JPA and JDBC
      • Identifiers in Hibernate/JPA
    • Java
      • Jackson de/serialize
      • Collections.singletonList() vs List.of()
      • Manage dependencies in Gradle
      • Logging Level
      • Bean Validation
      • JVM Internals
        • Threads
          • Frame
        • Shared Between Threads
          • Classloader
            • Class Loader Hierarchy
            • Loading Linking Initialization
      • Java Collection Framework
      • Annotation
      • Generic
      • ๋””๋ฏธํ„ฐ ๋ฒ•์น™
    • Spring
      • Caching
      • Spring Integration Overview
        • ThreadPollTaskExecutor
        • Messaging Bridge
        • Channel Adapter
        • Poller
        • Configuration and @EnableIntegration
        • Message Endpoints
        • Message Channels
      • HATEOAS
      • @Autowired vs Constructor Dependency Injection
      • Spring Security
        • JWT ํ† ํฐ ์‚ฌ์šฉํ•œ ์ธ๊ฐ€
        • OAuth 2 Login
        • OAuth 2 ์ธ์ฆ
        • ์ธ๊ฐ€
        • ์ธ์ฆ
        • PasswordEncoder
      • IoC Container
      • Filter,Interceptor,AOP,Argument Resolver
      • Spring Annotation
      • About Spring
    • Kafka
      • Error Channel
    • Infra
      • Scale Up || Scale Out
      • Docker
        • Dockerfile
        • Docker Hub Deploy
        • Command
      • Cloud ์œ ํ˜•
        • Infrastructure as a Service
        • Platform as a Service
        • Software as a Service
      • ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ
        • ์—”์ง„์—‘์Šค(Nginx)
      • ์ฝ”๋“œ ์ž๋™ ๋ฐฐํฌ
        • Technical
      • AWS EC2
        • PEM(Privacy Enhanced Mail) ํ‚ค
      • AWS RDS
      • AWS S3
    • CodeSquad
      • Spring Boot Project 1์ฃผ์ฐจ ํšŒ๊ณ 
      • Spring Boot Project 2์ฃผ์ฐจ ํšŒ๊ณ 
      • Spirng Boot Project 3์ฃผ์ฐจ ํšŒ๊ณ 
      • Spring Boot Project 4์ฃผ์ฐจ ํšŒ๊ณ 
    • Foody Moody ํ”„๋กœ์ ํŠธ
      • Query Performance Comparison
      • HeartCount Asynchronous Issue
      • DeferredResult
      • ResponseBodyEmitter
      • SseEmitter (Spring)
      • Server-Sent Events (SSE)
      • ๊ธฐ์ˆ  ์Šคํƒ ์ ์šฉ ์ด์œ 
      • NO-CACHE(HTTP)
      • Transactional
    • DDD
      • AggregateId
    • Test
      • RestAssured
    • Coding and Algorithmic Problems
      • 819. Most Common Word
      • 344. Reverse String
      • 125. Valid Palindrome
      • 937. Reorder Data in Log Files
    • Node
      • Async... Await...
      • Custom Transactional Decorator Challenger
    • Python
      • Python Basic Grammar
        • Comments and Input/Output
        • Variable
        • Data type
        • Operations and syntax
        • List,Tuple,Dictionary,Set
        • Function
        • Conditional statement
        • Loop
    • HTML
      • HTML Basic
      • HTML Basic Tags
      • HTML Form Tags
      • HTML Table Tags
    • CSS
      • CSS Basic
      • CSS Practice
Powered by GitBook
On this page
  • JVM System Threads
  • Per Thread
  • Program Counter (PC)
  • Stack
  • Native Stack
  • Stack Restrictions
  • Frame

Was this helpful?

  1. ๋งค์ผ๋งค์ผ ์กฐ๊ธˆ์”ฉ ์„ฑ์žฅํ•˜๊ธฐ
  2. Java
  3. JVM Internals

Threads

์Šค๋ ˆ๋“œ๋Š” ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‹คํ–‰๋˜๋Š” ์Šค๋ ˆ๋“œ์ž…๋‹ˆ๋‹ค. JVM์„ ์‚ฌ์šฉํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ์—ฌ๋Ÿฌ ์‹คํ–‰ ์Šค๋ ˆ๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Hotspot JVM์—๋Š” Java ์Šค๋ ˆ๋“œ์™€ ๊ธฐ๋ณธ ์šด์˜ ์ฒด์ œ ์Šค๋ ˆ๋“œ ๊ฐ„์— ์ง์ ‘ ๋งคํ•‘์ด ์žˆ์Šต๋‹ˆ๋‹ค. Thread-local storage, allocation buffers, synchronization objects, stacks ๋ฐ program counter์™€ native thread๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. The native thread๋Š” Java thread๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ํšŒ์ˆ˜๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์šด์˜ ์ฒด์ œ๋Š” ๋ชจ๋“  thread๋ฅผ schedulingํ•˜๊ณ  ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ CPU๋กœ ๋ณด๋‚ด๋Š” ์ฑ…์ž„์ด ์žˆ๋‹ค. The native thread๊ฐ€ ์ดˆ๊ธฐํ™”๋˜๋ฉด Java thread์—์„œ run() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. run() ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ˜ํ™˜๋˜๋ฉด ํฌ์ฐฉ๋˜์ง€ ์•Š์€ ์˜ˆ์™ธ๊ฐ€ ์ฒ˜๋ฆฌ๋˜๊ณ  native thread๋Š” thread ์ข…๋ฃŒ์˜ ๊ฒฐ๊ณผ๋กœ JVM์„ ์ข…๋ฃŒํ•ด์•ผ ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค(์ฆ‰, ๋งˆ์ง€๋ง‰ non-deamon thread์ธ์ง€). Thread๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด native thread์™€ Java thread ๋ชจ๋‘์— ๋Œ€ํ•œ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๊ฐ€ ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค.

JVM System Threads

jconsole ํ˜น์€ any debugger๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰ ์ค‘์ธ ์ˆ˜๋งŽ์€ threads๊ฐ€ ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ threads๋Š” purblic static void main(String[]) ํ˜ธ์ถœํ•œ part๋กœ ์ƒ์„ฑ๋˜๋Š” main thread ๋ฐ main thread์— ์˜ํ•ด ์ƒ์„ฑ๋œ ๋ชจ๋“  thread์™€ ํ•จ๊ป˜ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. Hotspot JVM์˜ ๊ธฐ๋ณธ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์‹œ์Šคํ…œ ์Šค๋ ˆ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Threads
Description

VM thread

์ด ์Šค๋ ˆ๋“œ๋Š” JVM์ด safe-point์— ๋„๋‹ฌํ•ด์•ผ ํ•˜๋Š” ์ž‘์—…์ด ๋‚˜ํƒ€๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ž‘์—…์ด ๋ณ„๋„์˜ thread์—์„œ ๋ฐœ์ƒํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ๋ชจ๋“  ์ž‘์—…์ด JVM์ด heap์— ๋Œ€ํ•œ ์ˆ˜์ •์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์—†๋Š” safe point์— ์žˆ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด ์Šค๋ ˆ๋“œ๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—… ์œ ํ˜•์€ "stop-the-world" ์ด ์Šค๋ ˆ๋“œ๋Š” ์ฃผ๊ธฐ์  ์ž‘์—…์˜ ์‹คํ–‰์„ scheduleํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํƒ€์ด๋จธ ์ด๋ฒคํŠธ(์˜ˆ: ์ธํ„ฐ๋ŸฝํŠธ)๋ฅผ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.garbage collections, thread stack dumps, thread suspension ๋ฐ biased locking revocation์ž…๋‹ˆ๋‹ค.

Periodic task thread

์ด ์Šค๋ ˆ๋“œ๋Š” ์ฃผ๊ธฐ์  ์ž‘์—…์˜ ์‹คํ–‰์„ scheduleํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” timer events(์˜ˆ: interrupts)๋ฅผ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

GC thread

์ด๋Ÿฌํ•œ ์Šค๋ ˆ๋“œ๋Š” JVM์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ garbage collection ํ™œ๋™์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

Compiler threads

์ด๋Ÿฌํ•œ ์Šค๋ ˆ๋“œ๋Š” ๋Ÿฐํƒ€์ž„์— ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค.

Signal dispatcher thread

์ด ์Šค๋ ˆ๋“œ๋Š” JVM ํ”„๋กœ์„ธ์Šค๋กœ ์ „์†ก๋œ ์‹ ํ˜ธ๋ฅผ ์ˆ˜์‹ ํ•˜๊ณ  ์ ์ ˆํ•œ JVM ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ JVM ๋‚ด๋ถ€์—์„œ ์‹ ํ˜ธ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Per Thread

๊ฐ ์‹คํ–‰ ์Šค๋ ˆ๋“œ์—๋Š” ๋‹ค์Œ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Program Counter (PC)

๊ธฐ๋ณธ ๋ช…๋ น์–ด๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ํ˜„์žฌ ๋ช…๋ น์–ด(๋˜๋Š” opcode)์˜ ์ฃผ์†Œ์ด๋‹ค. ํ˜„์žฌ ๋ฉ”์„œ๋“œ๊ฐ€ natice์ผ ๋•Œ PC๋Š” ์ •์˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  CPUs์—๋Š” PC๊ฐ€ ์žˆ์œผ๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ PC๋Š” ๊ฐ ๋ช…๋ น ํ›„์— ์ฆ๊ฐ€ํ•˜๋ฏ€๋กœ ์‹คํ–‰ํ•  ๋‹ค์Œ ๋ช…๋ น์˜ ์ฃผ์†Œ๋ฅผ ๋ณด์œ ํ•ฉ๋‹ˆ๋‹ค. JVM์€ PC๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋Š” ์œ„์น˜๋ฅผ ์ถ”์ ํ•˜๋ฉฐ PC๋Š” ์‹ค์ œ๋กœ ๋ฉ”์„œ๋“œ ์˜์—ญ์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.

Stack

๊ฐ ์Šค๋ ˆ๋“œ์—๋Š” ํ•ด๋‹น ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฐ ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ frame์„ ๋ณด์œ ํ•˜๋Š” ์ž์ฒด stack์ด ์žˆ์Šต๋‹ˆ๋‹ค. Stack์€ LIFO(Last In First Out) ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ด๋ฏ€๋กœ ํ˜„์ œ ์‹คํ–‰ ์ค‘์ธ ๋ฉ”์„œ๋“œ๊ฐ€ stack์˜ ๋งจ ์œ„์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์— ๋Œ€ํ•ด ์ƒˆ frame์ด ์ƒ์„ฑ๋˜๊ณ  stack ๋งจ ์œ„์— ์ถ”๊ฐ€(ํ‘ธ์‹œ)๋ฉ๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋ฐ˜ํ™˜๋˜๊ฑฐ๋‚˜ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์ค‘์— ํฌ์ฐฉ๋˜์ง€ ์•Š์€ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด frame์ด ์ œ๊ฑฐ(ํŒ)๋ฉ๋‹ˆ๋‹ค. stack์€ frame ๊ฐ์ฒด๋ฅผ ํ‘ธ์‹œํ•˜๊ณ  ํŒํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ์ง์ ‘ ์กฐ์ž‘๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ frame ๊ฐ์ฒด๋Š” heap์— ํ• ๋‹น๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์—ฐ์†์ ์ผ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

Native Stack

๋ชจ๋“  JVM์ด native ๋ฉ”์„œ๋“œ๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ thread ๋ณ„ native ๋ฉ”์„œ๋“œ ์Šคํƒ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. JVM์ด JNI(Java Native Invocation)์šฉ C-linkage ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„๋œ ๊ฒฝ์šฐ native stack์€ C stack์ด ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์ธ์ˆ˜ ๋ฐ ๋ฐ˜ํ™˜ ๊ฐ’์˜ ์ˆœ์„œ๋Š” ์ผ๋ฐ˜์ ์ธ C ํ”„๋กœ๊ทธ๋žจ์˜ native stack๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. Native ๋ฉ”์„œ๋“œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ(JVM ๊ตฌํ˜„์— ๋”ฐ๋ผ) JVM์œผ๋กœ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜๊ณ  Java ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ native Java ํ˜ธ์ถœ์€ stack(์ผ๋ฐ˜ Java ์Šคํƒ)์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. Thread๋Š” native stack์„ ๋– ๋‚˜ stack(์ผ๋ฐ˜ Java ์Šคํƒ)์— ์ƒˆ frame์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

Stack Restrictions

Stack์€ ๋™์  ๋˜๋Š” ๊ณ ์ • ํฌ๊ธฐ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.Thread์— ํ—ˆ์šฉ๋œ ๊ฒƒ๋ณด๋‹ค ๋” ํฐ stack ํ•„์š”ํ•œ ๊ฒฝ์šฐ StackOverflowError๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. Thread์— ์ƒˆ frame์ด ํ•„์š”ํ•˜๊ณ  ์ด๋ฅผ ํ• ๋‹นํ•  ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์œผ๋ฉด OutOfMemoryError๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์— ๋Œ€ํ•ด ์ƒˆ frame์ด ์ƒ์„ฑ๋˜๊ณ  stack ๋งจ ์œ„์— ์ถ”๊ฐ€(ํ‘ธ์‹œ)๋ฉ๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋ฐ˜ํ™˜๋˜๊ฑฐ๋‚˜ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์ค‘์— ํฌ์ฐฉ๋˜์ง€ ์•Š์€ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด frame์ด ์ œ๊ฑฐ(ํŒ)๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์™ธ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜ ์˜ˆ์™ธ ํ…Œ์ด๋ธ” ์„น์…˜์„ ์ฐธ์กฐํ•˜์„ธ์š”.

Last updated 2 years ago

Was this helpful?

Frame