[java의 병렬 프로그래밍] complete 할 수 있는 Future -CompletableFuture 의 원리와 사용법
·
JAVA
자바 병렬 프로그래밍 시리즈[java의 병렬 프로그래밍] JVM 의 스레드 구조 및 원리[java의 병렬 프로그래밍] 경쟁상태의 2가지 패턴과 Java 동기화 기본[java의 병렬 프로그래밍] JAVA 동기화와 옳은 사용 가이드[java의 병렬 프로그래밍] Thread를 사용하지 말자 - Executor, Executors, ExecutorService 원리 와 사용법 Future 의 단순 활용지난 글에서 Thread API 없이 Executor API 를 사용해서 고수준 비동기 프로그래밍을 설명했다. Executor 는 비동기 연산의 결과를 나타내는 Future 라는 반환값을 사용하는데 Future는 비동기 연산에 관한 많은 편의성을 제공해준다. 다음은 Future를 사용한 예제이다.@Testvoi..
[java의 병렬 프로그래밍] Thread를 사용하지 말자 - Executor, Executors, ExecutorService 원리 와 사용법
·
JAVA
자바 병렬 프로그래밍 시리즈[java의 병렬 프로그래밍] JVM 의 스레드 구조 및 원리[java의 병렬 프로그래밍] 경쟁상태의 2가지 패턴과 Java 동기화 기본[java의 병렬 프로그래밍] JAVA 동기화와 옳은 사용 가이드 예제 병렬 프로그래밍을 다루기 전에 예로 들 예제를 설명하겠다. f(x)와 g(x) 라는 독립적인 연산이 있다 해당 연산의 결과에 대해 main 스레드는 합을 구해서 출력한다. f(x) 와 g(x)를 main 과 별개의 스레드에서 실행한다.Thread 의 단점Thread를 이용해서 위 예제를 구해보자. public static void main(String[] args) throws InterruptedException { Integer fResult = 0; Thread thr..
[java의 병렬 프로그래밍] JAVA 동기화와 옳은 사용 가이드
·
JAVA
자바 병렬 프로그래밍 시리즈[java의 병렬 프로그래밍] JVM 의 스레드 구조 및 원리[java의 병렬 프로그래밍] 경쟁상태의 2가지 패턴과 Java 동기화 기본 동시성과 동기화락을 이용해 동기화하면 완전 해결일까?이전 글에서 경쟁상태가 생기는 이유는 모두 데이터의 일관성을 해치는 원자적이지 않은 실행 코드 때문이었다. 그래서 락을 사용하여 원자성을 보장을 통해 데이터의 일관성을 유지했다.이를 통해 모든게 해결됐을까?현대 애플리케이션은 성능이 엄청 중요해졌다. 그러다 보니 데이터의 일관성을 챙기기 위해 락을 통한 동시성 제어는 동시성 성능을 많은 영향을 준다. 자바 코드에서 데이터의 일관성도 챙기면서 최대한 동시성 성능을 높일지에 대해 이야기 해본다.(물론 일관성을 아예 신경 안쓰는 것보단 성능이 좋지..
[java의 병렬 프로그래밍] 경쟁상태의 2가지 패턴과 Java 동기화 기본
·
JAVA
자바 병렬 프로그래밍 시리즈[java의 병렬 프로그래밍] JVM 의 스레드 구조 및 원리 Race Condition멀티 스레딩과 같은 병렬 작업으로 비동기처리를 하는 프로그래밍 방식은 싱글 스레드보다CPU 자원을 보다 효율적으로 사용함으로써 높은 병렬성으로 성능을 높일 수 있다. 하지만 공유자원이 있다면 개발 난이도가 상승하고 잘못 구현하면 원치 않는 결과가 나오거나 심하면 장애를 유발할 수 있다.이렇게 공유 자원에 여러 스레드가 동시에 접근하여 데이터 정합성 이슈가 발생할 수 있는 상황을 Race Condition이라고 한다. Race Condition 이 발생하는 패턴은 2가지가 있는데 같이 확인해보자Read-Modify-Write공유 자원의 값을 읽고 그에 대한 값을 수정하고 공유 자원에 다시 쓰는..
[java의 병렬 프로그래밍] JVM 의 스레드 구조 및 원리
·
JAVA
프로세스와 스레드프로세스는 별개의 프로그램으로써 2개의 프로세스는 별개의 기억공간을 OS로부터 할당 받는다.별개의 스택, 메서드, 힙, PC 공간을 가짐을 의미 스레드는 프로세스 내에 작업의 단위라고 생각하면 된다.스레드는 힙과 메서드영역을 공유한다. 따라서 멀티 스레딩 환경에서는 공유자원에 대한 동시성 문제를 신경써야 한다.이렇게만 보면 스레드가 프로그래밍 난이도가 높아서 비효율적인거 처럼 보이지만 프로세스는 context switching 비용이 멀티 스레드에 비해 높아서 성능 저하를 야기한다. WAS 같은 응답시간이 중요한 서비스는 성능이 중요하기 때문에 멀티 스레딩을 주로 사용한다.하나의 WAS 프로그램에 여러 작업(client의 request)이 동시에 실행된다.성능을 위해 멀티스레드를 이용할 ..
JAVA enum을 왜 사용하는 걸까?
·
JAVA/언어
java 의 enum 이란상수가 필요해!public class EnumClient { private static final int ONE = 1; public static void main(String[] args) { System.out.println(ONE); }}우리는 프로그래밍 하는 도중에 상수가 필요하다면 위에 처럼private static final 키워드를 사용해서 상수 선언을 한다.추상화 된 상수가 필요해!public class EnumClient { private static final int ONE = 1; private static final int TWO = 2; private static final int THREE = 3; public static void main(String..
[JAVA] Reflection을 알아보자
·
JAVA/언어
리플랙션을 알기위한 사전 준비자바 프로그램은 어떻게 실행 될까?제일 처음 우리가 작성한 자바 소스 코드는 javac (jdk 포함되어 있음)에 의해 컴파일 된다.그럼 이제 JVM이 이해 할 수 있는 JAVA Byte Code (.class) 로 변환된다.그리고 이제 main 함수부터 클래스 로딩되어 Method Area 라는 메모리 영역에 올라간다.클래스 내부에 다른 클래스를 의존하면 해당 클래스는 처음에는 심볼릭 링크의 형태로 클래스를 참조한다.해당 심볼릭 링크 부분이 실행될 때 물리 주소로 변환된다.다음 클래스를 호출하면 해당 클래스가 런타임(실행 중)에 로딩되는 구조이다.우리가 작성한 코드가 변경된다고?위에는 우리가 작성한 소스코드가 실행될 때 과정을 아주 요약하였다.그런데 요약된 내용을 보면 작성..
JVM 가비지 컬렉터(GC) 기초
·
JAVA/JVM
GC이란C/C++ 같은 OS 의존도 높은 Native 언어와 Java 언어의 차이C/C++ 같이 프로그램 한 언어가 직접 OS가 실행하는 언어들은 Memory Leak 문제를 많이 겪는다. Memory Leak 란? “동적으로 할당한 메모리가 free(할당 해제)될 수 없는 상태가 된 것.” 이다. 즉, C/C++ 같은 Native 언어들은 heap을 할당하고 해제하는 해동을 오로지 개발자들의 코드로 이루어진다. 따라서 이러한 heap 메모리 관리를 잘못하여 동적으로 할당한 메모리가 더이상 free 할 수 없어서 사용하지도 않는 데이터가 메모리를 차지하여 성능 저하 및 심하면 프로그램 강제 종료가 되는 상황을 말한다. Java 언어에서는 메모리 해제한 적 없는데? 위 문제를 보고 이런 생각이 들 것이다...
JVM 클래스 로딩 과정
·
JAVA/JVM
JVM의 클래스 로딩 과정JVM 의 바이트 코드 실행 전체 구조자바 소스 파일을 컴파일 하여 자바 바이트 코드로 변환하면 제일 먼저 메인 메서드의 클래스가 클래스 로더에 의해 로드 된다.클래스 로더에 의해 클래스의 정보 멤버 변수, 전역 변수, 상수, 메서드,, 등등이 Method Area에 점유하게 된다.실행 엔진에 의해서 실행을 한다이때 실행을 진행하다가 클래스가 참조 되어 있는 부분을 발견하면 클래스 로더로 로드 된 클래스인지 확인한다 (로드 된 클래스라면 그냥 Method Area에 가져다 쓸 것)만약 로드 되지 않았다면 클래스 로더가 해당 클래스를 로드하고 초기화 한다.다음 모든 경우에 클래스를 로드하고 초기화 한다.생성자 호출(클래스 생성)클래스의 메서드 호출(당연)클래스의 전역 메서드 호출클..
JVM 메모리 구조
·
JAVA/JVM
JVM Run Time Data AreaJVM 전체 구조JVM 은 다음 구조를 따른다Javac 가 컴파일한 자바 바이트 코드(.class) 를 Class Loader가 Load 한다.→ Load 할때Run Time Data Area 에 올린다.Load 된 데이터를 기반으로 Execution Engine (실행 엔진) 은 프로그램을 실행한다.실행할때 RunTimeDataArea를 실행시에 메모리로 사용하는데 이를 RunTimeDataArea 를 사용한다.이때 GC 가 힙 메모리에 불필요한 메모리를 삭제하고 메모리 주소 관리를 하는 등에 작업을 한다. RunTime Data AreaJVM의 메모리 구조이다.JVM이 실행되면 OS로 부터 메모리를 할당 받고 JVM은 메모리를 위 구조로 나누어 용도에 맞게 사용..