프로그래밍 38

Metaspace

JVM의 여러 메모리 영역 중에 PermGen 메모리 영역이 없어지고 Metaspace 영역이 생겼다. PermGen permanent generation, 클래스 메타데이터를 담는 곳. Heap 영역에 속함. 기본값으로 제한된 크기를 가지고 있음. -XX:PermSize=N, PermGen 초기 사이즈 설정 -XX:MaxPermSize=N, PermGen 최대 사이즈 설정 Metaspace 클래스 메타데이터를 담는 곳. Heap 영역이 아니라, Native 메 영역이다. 기본값으로 제한된 크기를 가지고 있지 않다. (필요한 만큼 계속 늘어난다.) 자바 8부터는 PermGen 관련 java 옵션은 무시한다. -XX:MetaspaceSize=N, Metaspace 초기 사이즈 설정. -XX:MaxMetas..

배열 Parallel 정렬

Arrays.parallelSort() Fork/Join 프레임워크를 사용해서 배열을 병렬로 정렬하는 기능을 제공한다. 병렬 정렬 알고리듬 배열을 둘로 계속 쪼갠다. 합치면서 정렬한다. sort()와 parallelSort() 비교 int size = 1500; int[] numbers = new int[size]; Random random = new Random(); IntStream.range(0, size).forEach(i -> numbers[i] = random.nextInt()); long start = System.nanoTime(); Arrays.sort(numbers); System.out.println("serial sorting took " + (System.nanoTime() - s..

CompletableFuture (5)

지난 시간에 이어 진행해보자. 이번엔 CompletableFuture 를 가지고 여러 작업을 조합하는 방법과 예외를 처리하는 방법에 대해 살펴보자. Future 만 가지고는 특정 작업들을 이어서 처리하는게 힘들었다. (예를들면, 이벤트 정보 가져온 다음 이벤트에 참석하는 회원 목록 가져오기 등.) 콜백을 줄 수 없었기 때문에 비동기적인 작업을 이어서 처리하기가 힘들었던 것이다. 조합하기 thenCompose( ) 두 작업이 서로 이어서 실행하도록 조합 public class CompletableFutureStudy { public static void main(String[] args) throws ExecutionException, InterruptedException { CompletableFutur..

CompletableFuture (4)

자바에서 비동기(Asynchronous) 프로그래밍을 가능케하는 인터페이스이다. Future 인터페이스는 java5부터 java.util.concurrency 패키지에서 비동기의 결과값을 받는 용도로 사용했지만 비동기의 결과값을 조합하거나, error를 핸들링할 수가 없었다. 자바8부터 CompletableFuture 인터페이스가 소개되었고, Future 인터페이스를 구현함과 동시에 CompletionStage 인터페이스를 구현한다. CompletionStage 는 비동기 연산 Step을 제공해서 계속 체이닝 형태로 조합이 가능하다. CompletionStage 란, 하나의 비동기 작업을 수행하고 완료가 되었을때 여기에 의존적으로 또 다른 작업을 수행할 수 있도록하는 명령들을 가지고있는 인터페이스 Fut..

CompletableFuture (2) - Excutors

쓰레드를 만들고 관리하는 작업을 기존 Thread 를 생성하여 Runnable 를 구현하는 방식보다 보다 고수준의 API 에게 위임. (내부적으로 Runnable 방식을 쓰는것은 맞다.) Excutors 가 쓰레드를 만들고, 우린 Runnable 만 제공해주면 된다. (Runnable 안에 우리가 해야할 일만 정의해주면 됨) Excutors 를 만들고, 필요없으면 종료 시키는 작업은 Excutors 가 직접 해준다. 다시 위 내용을 정리해보자. 고수준 (High-Level) Concurrency 프로그래밍 쓰레드를 만들고 관리하는 작업을 애플리케이션에서 분리 그런 기능을 Executors 에게 위임 Executors 가 하는 일 쓰레드 만들기 : 애플리케이션이 사용할 쓰레드 풀을 만들어 관리한다. 쓰레드..

CompletableFuture (1) - 자바 Concurrent 프로그래밍 소개

CompletableFuture 을 학습하려면 이전까지의 Java Concurrent 프로그래밍을 알아야한다. Concurrent 소프트웨어 동시에 여러 작업을 할 수 있는 소프트웨어 ex) 웹 브라우저로 유튜브를 보면서 키보드로 문서에 타이핑을 할 수 있다. ex) 녹화를 하면서 인텔리J로 코딩을 하고 워드에 적어둔 문서를 보거나 수정할 수 있다. Java 에서 지원하는 Concurrent 프로그래밍 멀티 프로세싱 (ProcessBuilder) 멀티 쓰레드 이번 시간에는 멀티 쓰레드에 관한것만 보자. Java 멀티 쓰레드 프로그래밍 Thread / Runnable 아래는 쓰레드를 구현하는 두가지 방법이다. 1. Thread 를 상속받아 구현하는 방법 // Thread 상속 public static vo..

Date와 Time API

기존에 사용하던 날짜와 시간 Api 는 아래와같다. Date date = new Date(); Calendar calendar = new Gregoriancalendar(); SimpleDateFormat dateFormat = new SimpleDateFormat(); Java8 에 새로운 날짜와 시간 API 가 생긴 이유 그 전까지 사용하던 java.util.Date 클래스는 mutable 하기 때문에 thread safe 하지 않다. .setTime( ) 시 변경이 가능하며, 멀티 쓰레드 환경에서 안전하게 쓰기 어렵다. 클래스 이름이 명확하지 않다. Date 인데 시간까지 다룬다. 버그 발생할 여지가 많다. 타입 안정성이 없고, 월이 0부터 시작한다거나 등 날짜 시간 처리가 복잡한 애플리케이션에서는..

Optional

Optional Java8 에 추가된 새로운 인터페이스. 비어있을수도 있고, 값 하나를 담고 있을수도 있는 컨테이너 인스턴스의 타입이다. 즉, 오직 값 한 개가 들어있을 수도 없을 수도 있는 컨테이너. 자바 프로그래밍에서 NullPointerException 을 보는 이유. null 를 리턴하니까! ( null 이 리턴되는 자체가 문제이다. ) null 체크를 깜빡했으니까! 메소드에서 작업 중 특별한 상황에서 값을 제대로 리턴할 수 없는 경우 선택할 수 있는 방법 예외를 던진다. 에러가 발생하게되면 자바는 스택 트레이스를 찍는데, ( 이 에러가 발생하기 전까지의 어떠한 콜 스택을 거쳐서 에러가 발생하게 되었는지에 대한 정보) 이 자체로 리소스를 사용하는거여서 부담이 가기 때문에 필요할 때에만 사용해야지 ..

Stream

Stream 이란? 연속된 데이터를 처리하는 Operation(조작)의 모임. 컬렉션 이나 배열 등에 저장되어 있는 요소들을 하나씩 참조하며 반복적인 처리를 가능케 하는 기능이다. Stream 을 이용한다면 불필요한 반복문이나 분기처리를 쓰지 않고도 직관적인 코드를 작성할 수 있다. Stream 특징 데이터를 담고 있는 저장소(컬렉션)이 아니다. Functional in nature, 즉 Stream 이 처리하는 데이터 소스를 변경하지 않는다. 무제한일 수도 있다. 실시간으로 계속해서 Stream 으로 들어온 데이터를 Stream 으로 받아 처리할 수 있다. Short Circuit 메소드를 사용해서 제한하는 것도 가능하다. 중개 오퍼레이션들은 근복적으로 Lazy 하다. Stream API 는 크게 중계..

Lombok 동작원리

Lombok 은 컴파일 시점에 바이트코드를 변환하여 원하는 부분을 주입해주는 방식으로 동작한다. 조금 더 구체적으로 설명하자면, 컴파일 시점에 애노테이션 프로세서를 사용하여 소스코드의 AST(abstract syntax tree)를 조작한다. Lombok이 처리되는 과정은 다음과 같다 javac는 소스파일을 파싱하여 AST트리를 만든다. Lombok은 AnnotaionProcessor에 따라 AST 트리를 동적으로 수정하고 새 노드(소스코드)를 추가하고 마지막으로 바이트 코드를 분석 및 생성한다. (컴파일 과정에서 생성된 Syntax Tree는 com.sun.source.tree.*에서 public accesss를 제공한다.) 최종적으로 javac는 Lombok Annotation Processor에 의..