CS/개발 언어 (JAVA)
-
[JAVA] GC 튜닝CS/개발 언어 (JAVA) 2021. 6. 26. 11:27
GC 튜닝의 두 가지 목적 Old 영역으로 넘어가는 객체의 수 최소화 하기 G1 GC를 제외한 Oracle JVM에서 지원하는 모든 GC는 Generational GC이다. Eden 영역에서 객체가 처음 만들어지고, Survivor 영역을 오가다가, 끝까지 남아 있는 객체는 Old 영역으로 이동한다. Old 영역의 GC는 Young 영역의 GC에 비하여 상대적으로 시간이 오래 소요되기 때문에 Old 영역으로 넘어가는 객체의 수를 줄이면 Full GC가 발생하는 빈도를 줄일 수 있다. Young 영역의 크기를 잘 조절함으로써 효과를 볼 수 있다. Full GC 시간 줄이기 Full GC 실행에 시간이 오래 소요되면(1초 이상) 연관된 여러 부분에서 타임아웃이 발생 할 수 있다. Old 영역의 크기를 줄이면..
-
[JAVA] Garbage Collection 모니터링CS/개발 언어 (JAVA) 2021. 6. 21. 23:36
GC 모니터링 JVM이 어떻게 GC를 수행하고 있는지 알아내는 과정 Young 영역에 있는 객체를 Old 영역에 언제 얼마나 이동했는지, stop-the-world가 언제 얼마나 일어났는지에 대한 정보를 알 수 있음 GC 모니터링 방법 jstat VMID (Virtual Machine ID) 동작하고 있는 VM을 가리키는 ID jstat을 통해서 모니터링을 하기 위해서는 vmid 정보를 argument로 전달 필요 VMID를 확인하기 위해서는 아래와 같이 jps 명령어를 통해서 확인 가능 $ jsp 2981 auth-api.jar GC 관련 jstat 옵션 옵션 기능 gcutil 각 힙 영역에 대한 사용 정도를 백분율로 보여준다. 아울러 총 GC 수행 횟수와 누적 GC 시간을 알 수 있다. gc 각 힙(..
-
[개발언어] @Controller vs @RestControllerCS/개발 언어 (JAVA) 2021. 6. 4. 13:41
@Controller 전통적인 스프링 MVC의 컨트롤러 View를 반환하기 위해 사용하고 Restful 웹 서비스를 반환하기 위해서는 @ResponseBody 어노테이션을 붙여야한다. Controller가 View를 반환하기 위해서는 ViewResolver가 사용되며, ViewResolver 설정에 맞게 View를 찾아 랜더링한다. @RestController Restful 웹서비스 컨트롤러 데이터를 반환하기 위해 사용한다. RestController가 데이터를 반환하기 위해서는 ViewResolver 대신에 HttpMessageConverter가 동작한다. 스프링은 클라이언트의 HTTP Accept 헤더와 서버의 컨트롤러 반환 타입 정보를 조합하여 적합한 HttpMessageConverter를 선탱하여..
-
[JAVA] Reactive StreamsCS/개발 언어 (JAVA) 2021. 5. 16. 19:01
Reactive Streams Reactive 프로그램을 위한 명세 Non-Blocking과 Back-Pressure를 이용하여 비동기 스트림 처리의 표준을 제공하는 것이 목적 Back-Pressure 컴포넌트가 대처할 수 없고 장애가 발생하면 안되기 때문에 컴포넌트는 상위 컴포넌트들에 자신이 과부하 상태라는 것을 알려 부하를 줄일 수 있도록 해야한다. Subscriber가 Publisher에 Request()하는 과정 push하는 데이터의 흐름을 제어 Publisher 무한한 data를 제공하고, 제공되는 data는 Subscriber에 의해 구독되는 형태로 처리 subscribe() : subscriber를 받아들이는 메소드 Subscriber onSubscrive() : Publisher가 생산하는..
-
[JAVA] 자바 가상 머신 (Java Virtual Machine)CS/개발 언어 (JAVA) 2021. 5. 12. 09:54
JVM이란? JVM의 역할은 자바 애플리케이션을 클래스 로더를 통해 읽어들여 자바 API와 함께 실행하는 것 JAVA와 OS 사이의 중개자 역할을 수행하여 JAVA가 OS에 구애받지 않고 재사용 가능하게 해준다. 메모리 관리, Garbage Collection, 스택 기반의 가상 머신 자바 프로그램 실행과정 프로그램이 실행되면 JVM은 OS로부터 이 프로그램이 필요로하는 메모리를 할당받는다. 자바 컴파일러가(javac)가 자바 소스코드(.java)를 읽어들여 자바 바이트코드(.class)로 변환시킨다. Class Loader를 통해 class 파일들을 JVM으로 로딩한다. 로딩된 class 파일들은 execution engine을 통해 해석된다. 해석된 바이트코드는 Runtime Data Area에 배치..
-
[JAVA] JVM MemoryCS/개발 언어 (JAVA) 2021. 4. 22. 19:08
Runtime Data Area Java 프로그램이 실행 될 때 JVM이 실행되면서 OS로부터 할당받은 메모리영역 메모리 용도에 따라 크게 5개로 구분 1. Method Area (Static Area) 클래스 정보를 처음 메모리 공간에 올릴 때 초기화되는 대상을 저장하기 위한 메모리 공간 클래스의 구성요소인 Field, Method, Type 정보들이 이 위치에 올라간다. (클래스 데이터를 위한 공간) 2. Heap Area 자바 프로그램이 실행되면서 동적으로 생성된 객체가 저장되는 공간이다. (객체 데이터를 위한 공간) 3. Stack Area 메소드가 호출되면 할당되었다가 메소드를 빠져나가면 바로 소멸되는 특성의 데이터를 저장하기 위한 영역 호출된 메소드의 매개변수, 지역변수, 리턴 값 등을 임시로..
-
[JAVA] Garbage CollectionCS/개발 언어 (JAVA) 2021. 4. 21. 13:18
stop-the-world GC을 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것이다. stop-the-world가 발생하면 GC를 실행하는 쓰레드를 제외한 나머지 쓰레드는 모두 작업을 멈춘다. 대개의 경우 GC 튜닝이란 이 stop-the-world 시간을 줄이는 것이다. Java는 프로그램 코드에서 메모리를 명시적으로 지정하여 해지하지 않기 때문에 가비지 컬렉터(Garbage Collector)가 더 이상 필요없는 객체를 찾아 지우는 작업을 한다. 이 가비지 컬렉터는 두 가지 가정하에 만들어졌다. 대부분의 객체는 금방 접근 불가능 상태(unreacheable)가 된다. 오래된 객체에서 젊은 객체로의 참조는 아주 적게 존재한다. 이 가정의 장점을 최대한 살리기 위해 HotSpot VM에서는 크게 ..
-
스프링의 핵심 3요소CS/개발 언어 (JAVA) 2021. 4. 5. 13:13
제어의 역전 (Inversion of Control) 기본 : 자기가 사용할 의존성은 직접 만들어 사용 IoC : 자기가 사용할 의존성을 누군가가 만들어서 주입 (DI) IoC 컨테이너 Bean 객체를 생성 의존성을 주입 Bean 객체의 Life Cycle을 관리 관점 지향 프로그래밍 (Aspect-Oriented Programming) 횡단 영역의 공통된 부분을 분리 (cross-cutting) Proxy 패턴 적용? 실제 기능을 수행하는 객체(real object)가 아니라 가상 객체(proxy object)를 사용하여 로직의 흐름을 제어하는 디자인 패턴 PSA (Portable Service Abstration) SA? 추상화 계층을 사용하여 어떤 기술을 내부에 숨기고 개발자에게 편의성을 제공해주는..