-
멀티프로세스와 멀티스레드Java 2023. 10. 31. 17:59
# 정의프로세스는 운영체제로부터 자원을 할당받는 작업의 단위이고 스레드는 프로세스가 할당받은 자원을 이용하는 실행의 단위이다.# 멀티 스레드 vs 멀티 프로세스멀티 스레드는 멀티 프로세스보다 적은 메모리 공간을 차지하고 Context Switching이 빠른 장점이 있지만, 동기화 문제와 하나의 스레드 장애로 전체 스레드가 종료 될 위험을 갖고 있다.멀티 프로세스는 하나의 프로세스가 죽더라도 다른 프로세스에 영향을 주지 않아 안정성이 높지만, 멀티 스레드보다 많은 메모리공간과 CPU 시간을 차지하는 단점이 있다.두 방법은 동시에 여러 작업을 수행하는 점에서 동일하지만, 각각의 장단이 있으므로 적용하는 시스템에 따라 적합한 동작 방식을 선택하고 적용해야 한다.# 멀티 스레드장점운영체제가 시스템 자원을 효율..
-
JIT(Just In Time)이란?Java 2023. 10. 31. 11:33
# JIT란? JIT(Just-In-Time) 컴파일러는 런타임 시 바이트코드를 기본 기계어 코드로 컴파일하여 Java™ 애플리케이션의 성능을 향상시키는 런타임 환경의 구성요소이다. JIT 컴파일러는 런타임 시 바이트코드를 기본 기계 코드로 컴파일하여 Java 프로그램의 성능을 향상시키는 데 도움이 된다. # JIT의 특징 메소드가 컴파일되면 JVM은 메소드를 해석하는 대신 해당 메소드의 컴파일된 코드를 직접 호출합니다. JIT 컴파일에는 프로세서 시간과 메모리 사용량이 필요합니다. JIT 컴파일러는 Cold, Warm, Hot, VeryHot 또는 Scorching 등 다양한 최적화 수준에서 메서드를 컴파일할 수 있습니다 최적화 수준이 높을수록 더 나은 성능을 제공할 것으로 예상되지만 CPU 및 메모리..
-
ArrayBlockingQueue vs LinkedBlockingQueueJava 2023. 10. 24. 23:36
FeatureArrayBlockingQueueLinkedBlockingQueueImplementationIt’s backed by an arrayIt uses linked nodesQueue SizeIt’s a bounded queue. Therefore, it’s mandatory to specify the initial capacity while creating it.It’s not mandatory to mention size.Fairness PolicyWe can set a fairness policy in itThere’s no option to set a fairness policy in thisNumber of LocksIt uses one ReentrantLock. The same lock..
-
[소스 까보기] AsyncRestTemplate 편Java 2023. 10. 22. 18:49
AsyncRestTemplate 사용 이유? API 통신할 때, 비동기로 빠르게 통신하여 성능을 개선하는 경우에 성능 튜닝을 목적으로 사용한다. ex) 알림톡 중계서버에 API로 알림 내역을 전송시 활용 AsyncRestTemplate 핵심 내용 디버깅하여 소스를 깊게 들어가보면 아래와 같은 로직을 볼 수 있다. 주목할 점은 저 submitListenable 메소드가 핵심 역할이다. @Override protected ListenableFuture executeInternal( HttpHeaders headers, byte[] bufferedOutput) throws IOException { return this.taskExecutor.submitListenable(() -> { SimpleBufferi..
-
[동시성] Thread 테스트용 코드Java 2023. 10. 22. 17:50
설명 업무를 수행하다보면 멀티 쓰레드 환경에서 동시성을 고려해볼법한 일들이 간혹 존재한다. 동시성 테스트를 하는 경우에 아래와 같은 샘플코드로 테스트를 수행하기 위해 샘플 코드를 적어놨다. 환경 JDK 11 Version\ import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger; public class Main { volatile static int cnt = 0 ; AtomicInteger cnt2 = new AtomicInteger() ; pu..