분류 전체보기
자바 스레드 덤프 Thread Dump 분석
Synchronized Block 키워드는 다음 네가지 유형의 블록에 쓰인다. 인스턴스 메소드에 Synchorinzed 키워드: 인스턴스를 기준으로 이뤄짐. 스태틱메소드에 Synchronized 키워드 : 클래스를 기준으로 이뤄짐. JVM안애 클래스 객체는 클래스당 하나만 존재 가능하므로, 오직 한 스레드만 동기화된 스태틱 메소드를 실행할 수 있다. 인스턴스 메소드 코드블록 : 특정 블록에 대해서만 동기화. 동기화 블록 안에 전달된 모니터 객체를 기준으로 동기화 됨. 스태틱 메소드 코드블록 : synchronzied 블록의 매개변수에 클래스를 넘겨, 해당 클래스를 기준으로 동기화 된다. 위를 기반으로 아래의 4가지 시나리오 대로 스레드 덤프를 분석해보고자 한다. 일반메서드에서 synchronized 블록..
Blocking Queue 블락킹 큐
특정 상황에 스레드를 대시하도록 하는 큐. 멀티 스레드 환경에서 사용되는 자료구조. 큐의 상태에 따라 자원의 생성과 소비를 제어할 수 있는 큐. 가득차있거나, 비어있을 경우 예외를 방지하기 위해 각각의 상황에서 큐를 블록킹함. 큐에서 원소를 빼려고 시도했는데 큐가 비어있거나, 큐에 원소를 넣으려 했는데 큐에 넣을 수 있는 공간이 없을 때, 디큐/인큐 호출 스레드를 대기하도록 한다. 비어있는 큐에서 원소를 빼려고 시도하는 스레드의 대기 상태는다른 스레드가 이 큐에 원소를 넣을 때까지 지속된다. 꽉 찬 큐에 원소를 넣으려고 시도하는 스레드의 대기 상태는 다른 스레드가 큐에서 우너소를 빼거나 큐를 클리어하거나 큐의 공간이 확보될 때 까지 지속된다.
LockSupport.park()란
병렬 프로그래밍에서 Thread의 성능 향상을 위해 가능한 블록되거나 컨텍스트 스위칭 되지 않도록 애쓴다. Lock-Free 알고리즘 같은 것들은 이런 노력의 일환이다. 그러나 이런 Lock-Free 알고리즘 같은 것들은 Thread의 활동성을 제한하지 않도록 하다 보니 결합이 발생했을 경우 Spin-Waiting 형태로 구현되는 경향이 있다. 경합이 많거나 구간이 큰 경우는 CPU의 낭비를 가져오는 요인이 된다. 그래서 현실적으로는 일정조건 동안의 Spin-Waiting후에는 스레드를 블록시키는, 즉 잠재우는 형태로 알고리즘을 만든다. 기존의 Java에서는 synchronizd도구 없이는 Thread를 임의로 블록시키고 다시 재기동 시킬만한 도구가 없었다. 따라서 synchronized 없이 Lock-..
CountDownLatch란
어떤 쓰레드가 다른 쓰레드에서 작업이 완료될 때 까지 기다릴 수 있도록 해주는 클래스입니다. 쓰레드를 여러개 실행했을 때, 일정 갯수의 스레드가 모두 끝날 때까지 기다려야만 다음으로 진행할 수 있거나, 다른 스레드를 실행시킬 수 있는 경우 사용한다. CountDownLatch는 생성할 대 1 이상의 카운트를 인자값으로 받는다. 특정 메소드 내부에서 await() 메소드로 대기 상태를 만들어 주고, count가 0이 되는 순간 대기 상태를 해제한다.
스프링 스터디 3주차 회고
1주차때 배운 개념과 연결지으며 공부해야겠다고 생각했다 예를 들어 쓰레드를 생성할 때 어떤 오버헤드가 발생하나요? 라는 질문에 대한 모범적인 답은 컨텍스트 스위칭으로 인한 오버헤드가 발생하고 쓰레드의 어떤 영역을 차지하는지 (힙 스택) 등 힙을 차지하긱 때문에 GC발생 확률이 올라가고 언젠간 GC의 대상이 됨 자바에서 스레드는 OS의 스레드와 1대1 매핑이 된다. 결국 OS에서 관리할 스레드도 늘어나게 되는 것이다. 그래서 미리 정해진 갯수만큼 생성해서 재활용 하는 것이다. 이처럼 명확하게 설명할 줄 알아야 한다. 특히 JVM에 대해서 구체적으로 알아야 한다. 이해가 부족하다고 생각한 개념 : 블락킹 큐 -> 이게 무엇이고 언제쓰지? 풀이 넘치면 어떤 예외가 발생하는지 디비용 스레드 풀 블락킹 개념 Lo..
스프링 스터디 2주차에 공부한 것들
힙덤프 OOM는 메모리 누수 상황이 발생했을 때 일어남 OOM의 종류 Java heap space : 힙 공간에 새로운 객체를 생성할 수 없는 경우. 지정한 힙크기가 애플리케이션에 충분하지 않을 경우 발생. 혹은 생명주기가 긴 애플리케이션의 경우. 혹은 finalize를 과도하게 사용하는 애플리에키션에서 발생하기도 함. GC Overhead limit exceede : GC에서 자바 프로그램이 느려지는 경우 발생함. GC후 자바 프로세스가 컬렉션 수행하는데 걸리는 시간의 약 98% 이상을 소비하고 힙의 2% 미만이 복구된 상태에서 지금가지 수행하는 과정에서 GC중 OOM이 5번 이상 생성되는 경우 발생. 힙의 크기를 늘리면 해결됨. -XX:-UseGCOverheadLimit 선택사항을 추가하여 GC제한 ..
서블릿이란
CGI (Common Gateway Interface) 웹서버와 프로그램 사이의 데이터를 주고받는 규칙 1990년 초반 초기 HTML문서는 웹서버에서 클라이언트로의 일방적인 정보전달만 했다. 정적인 데이터(HTML, XML, 이미지 등)를 전달하는 것만으로 충분. 웹사이트에 필요한 정보를 올려두면 그 정보를 원하는 측에서 받아가거나 참조하는 단방향의 정보전달만 했었기 때문에 정보제공측과 수해측 의사효관이나 정보교환을 이뤄지지 않음 웹서버와 클라이언트간에 필요한 정보교환을 가능하게 해주는 일종의 프로그램 웹이 발달하여 입력을 받아 처리하고 그 결과를 화면에 보여주는 동적인 페이지가 필요하게 됨 사용자의 요청을 받아 정보를 동적으로 생성하고 이를 다시 클라이언트로 보내주기 위해, 서버에서 다른 프로그램을 불..
MVC 패턴
JSP로 구성할 수 있는 아키텍쳐는 모델1, 모델2로 나뉜다. 모델1 뷰와 로직을 모두 JSP 페이지 하나에서 처리하는 구조 자바빈(자바 클래스)이나 서비스 클래스를 사용해서 웹브라우저가 요청한 작업을 처리하고 그 결과를 클라이언트에 출력한다. 장점 구조가 단순하여 익히기 쉽다 단점 출력을 위한 뷰 로직과, 비지니스 로직을 위한 자바 코드가 함께 섞이기 때문에 코드가 복잡해짐 모델 2 JSP페이지와 서블릿, 로직을 위한 클래스가 나뉘어 브라우저 요청을 처리함 서블릿은 웹브라우저의 요청에 맞게 그 결과를 보여줄 JSP 페이지로 포워딩한다. 포워딩을 통해 컨텍스트를 받은 JSP 페이지를 결과 화면을 클라이언트에 전송한다. 이 과정에서 서블릿이 로직을 처리한다 특징 모든 요청을 단일 진입점, 하나의 서블릿에서..
ServletContextListener
- 웹 어플리케이션이 시작되거나 종료될 때 호출할 메서드를 정의한 인터페이스. - public void contextInitialized(ServletContextEvent sce) : 웹어플리케이션을 초기화할 때 호출 - public void contextDestroyed(ServletContextEvent sce) : 웹 어플리케이션을 종료할 때 호출. 서블릿은 다양한 시점에서 발생하는 이벤트와 이벤트를 처리하기 위해 인터페이스를 정의하고 있다. 이들 이벤트와 인터페이스를 이용하면 데이터의 초기화, 요청처리 등을 추적할 수 있게 된다. 웹 컨테이너는 컨텍스트가 시작되거나 종료되는 시점에 특정 클래스의 메서드를 수행할 수 있는 기능 제공 1. javax.servlet.ServletContextListe..
JSP 필터
필터란? 필터는 이름에서도 알 수 있듯 정수기 필터, 에어컨 필터, 담배의 필터와 같이 무언가를 걸러내는 필터를 말합니다. JSP/Servlet 에서도 필터의 개념은 같지만 걸러내는 대상이 다릅니다. Jsp/Servlet에서의 필터는 서블릿 2.3 부터 추가된 기능으로 클라이언트(브라우저)가 서버로 요청을 보내올때 요청이 서블릿으로 전달되기 전, 후에 필터링하기 위한 기술을 의미합니다. Jsp/Servlet 스펙에서 필터는 사용하기 쉽도록 javax.servlet.Filter 인터페이스로 제공하고 있으며 이것을 구현하고 web.xml에 등록하기만 하면 간단하게 사용할 수 있습니다. 인터페이스의 구현 메서드는 서블릿의 service() 메서드나 doGet() doPost() 메서드와 유사하기때문에 매우 익..