본문 바로가기

Java/Advanced5

Java Invocation API를 사용한 JVM 내장화(Embedded) / Native 프로그램에서 Java 코드 호출하기 기존에 C언어 기반으로 개발된 프로그램에서 NoSQL, 메시지 서버, 분산 저장소 등에 데이터를 저장해야 할 일이 생겼다. 이들 저장소는 C언어 기반의 인터페이스(라이브러리)를 제공하긴 하지만, 대부분이 인터프리터 기반 언어의 API를 기본으로 제공하기 때문에 기능 확장과 안정성 측면에서 자바 기반의 인터페이스를 사용하고자 한다. 대부분의 기능(데이터 추출 및 가공)이 C 기반의 애플리케이션(프로세스)에서 수행되고 그 결과를 자바 자바 기반의 프로그램(프로세스)을 사용하여 목적(Target) 저장소에 데이터를 저장하고자 한다. 이 두 프로세스 간의 통신을 위해서 파일, 소켓, 표준입출력(Standard Input/Output) 채널, 그 밖의 운영체제에서 제공하는 IPC 기능을 사용할 수 도 있다. 하지.. 2020. 7. 23.
Java의 Atomic, Adder, Accumulator의 이해 / AtomicInteger, AtomicLong, LongAdder, LongAccumulator 동작 방식 자바에서 병렬 프로그래밍에서 데이터에 대한 동시 접근을 제어하기 위해서 Lock(Intrinsic Lock vs Explicit lock)을 사용할 수 있을 것이다. 하지만, 공유 데이터가 Primitive 타입일 경우 값을 읽거나 업데이트 하는 경우가 전부인데 이때에는 Lock 보다는 원자성(Atomic) 변수가 더 효율적인 것을 다들 알고 있을 것이다. 소 잡는 칼로 닭을 굳이 잡을 필요는 없을 테니 말이다. 이번 포스팅에서는 기존의 Atomic 계열의 클래스(AtomicInteger, AtomiLong,. …)와 Java 8부터는 추가된 원자성의 데이터 타입(클래스)인 LongAdder와 LongAccumulator에 대해서 알아보고 이들의 차이점에 대해서 이야기하고자 한다. Atomic 계열의 클.. 2020. 6. 24.
Java Monitor(Intrinsic Lock)와 Explicit Lock의 이해 – Biased/Lightweight/Heavyweight Lock vs ReentrantLock 자바에서 스레드 간의 동기화를 위해서 synchronized 키워드를 사용하는 것이 가장 기본적인 방법일 것이다. 이 synchronized 키워드를 사용하는 Lock을 Intrinsic Lock 혹은 Built-in Lock이라 하며, Java 1.5부터 java.util.concurrent.locks 패키지를 통해서 제공되는 Explicit Lock과 대비된다. 둘 다 공유 자원을 접근하는 Critical Section을 보호하기 위한 목적으로 사용하긴 하는데, 이 둘의 차이는 무엇일까? 이 포스팅에서는 가장 기본적인 두 가지 Lock, 자바의 Built-in(Intrinsic) Lock인 Monitor와 명시적 Lock인 ReentrantLock에 대해서 비교해 보고자 한다. Oracle Hotsp.. 2020. 6. 23.
Java VisualVM의 Sampler와 Profiler 사용법 / JVisualVM's Sampler and Profiler 자바 어플리케이션의 성능과 관련된 문제를 해결하거나 CPU와 메모리의 사용량과 관련된 모니터링을 위해서 가장 쉽게 접근할 수 있는 툴은 VisualVM일 것이다. 오늘은 Java VisualVM의 Sampler와 Profiler를 보는 법에 대해서 간략히 정리하고자 한다. Sampler와 Profiler 모두 자바 어플리케이션의 CPU와 메모리 사용량을 분석하는 툴이지만 그 동작 방식에서는 차이를 보인다. Sampling 샘플링은 주기적(20 ms ~ 10000 ms)으로 메소드 콜 정보(스레드 덤프 사용)와 메모리 사용 정보를 스냅샷하고 그 결과를 분석하여 메서드 별 혹은 스레드 별 CPU 실행 시간을 수집하는 것을 말한다. 그렇기 때문에 정확한 분석은 아니지만 분석 대상 어플리케이션의 성능에 큰 영향.. 2020. 6. 20.