생각없이, 목표없이 늙어가는건 무서운 일이다. 
  이정표 없이 길을 걷다가 문득 정신을 차렸을때,
그때의 나 자신의 독백은 소스라치게 놀랍다. 
 흔들리는 목표라도 계속 세우고, 이루지 못하면 수정하면서 이어나가면 된다.
잊지말아라. 내가 걷고 있는 길에 도착지를.  


'THINK' 카테고리의 다른 글

이해  (1) 2018.09.04
2018-09-01  (0) 2018.09.01
온도의 차이  (0) 2018.08.30
2018-08-30  (0) 2018.08.30
2018-08-29   (0) 2018.08.29
hotspot vm은 어떻게 구성되어 있는가 자바 1.3 버전부터 기본 vm으로 사용되어 왔다 
 자바를 만든 sun에서 자바의 성능을 개선하기 위해 just in time( JIT )컴파일러를 만들었고 hots spot이라고 지었다.
자바에서 컴파일을 하면 바이트코드로 변환된다( java complier)

 이 바이트코드는 기계가 바로 읽을 수 있는 형태가 아니며 실제 실행될때 다시 한번 기계가 읽을 수 있는 형태(native code)로 interpreter를 통해 해석된다.
 이때 반복되는 내용을 컴퍼일을 해서 사용한다. 이 과정을 JIT 컴파일링 이라고 한다.  JIT 컴파일이 실행될때 최초 시행되기 최초 실행에서 조금 느릴수 있다.하지만 컴파일 없이 interpret 만 하는 경우보다 반복적인 작업을 할때 훨씬 높은 성능을 낼수있다.

 Jit컴파일링은 어떻게 진행될꺄?
각 메서드들에 있는 카운터를 통해서 통제되며 수행카운터( Invocaiont count), 백에지 카운터( backage counter )를 사용한다. 
이 카운터들이 인터프리터에 의해 증가될때마다 그 값들이 한계치에 도달했는지 확인하고 도달했을 경우 인터프리터는 컴파일을 요청한다. 

컴파일이 요청되면 컴파일 대상 목록에 큐가 쌓이고 하나 이상의 컴파일러 스레드가 이 큐를 모니터링한다. 그동안 수행카운터를 리셋한다. 
 Hotspot은 osr이라는 특별한 컴파일도 수행한다. 인터프리터에서 수행한 코드중에 오랫동안 루프가 지속되는 경우에 사용된다. 


동기와 비동기 
동기 : 호출이 종료된 이후에 처리 결과를 응답 받을 수있다. 서비스 처리가 완료 된 후에 처리 결과를 알 수 있는 방식을 동기식 호출이라고 한다. 
비동기 : 실제로 처리가 완료되지 않았음에도 종료가 이루어 지며 그 응답을 호출자에게 전달한다. 
비동기 호출을 지원하는 패턴은 다양하다. 퓨쳐 패턴, 이벤트 리스너는 옵저버 패턴,  node.js는 콜백함수 , 네티는 리액터 패턴을 사용한다. 

블로킹과 논 블로킹
소켓 동작 방식은 블로킹 모드와 논블로킹 모드로 나눈다. 
블로킹은 요청한 작업이 성공하거나 에러가 밠행하기 전까지 응답을 돌려주지 않는 것을 의미하여 논 블로킹은 요청한 작업의 성공 여부와 상관없이 바로 결과를 돌려준다. 이때 요청의 응답값에 의해서 에러나 성공 여부를 판단한다. 
 블로킹 소켓은 serverSocket, socket 클래스, 논블로킹 소켓은 serverSocketChannel, SocketChannel 클래스를 사용한다. 

블로킹 소켓은 데이터입출력에서 스레드의 블로킹이 발생하기 때문에 동시에 여러 클라이언트에 대한 처리가 불가능하다. 이 단점을 보완하기 위해 해결한 모델이 연결된 클라이언트 별로 스레드를 할당한다. 
 접속 클라이언트별 스레드르 생성한다면 OOM뿐 아니라 대기시간이 길어질 수 있다. 이를 방자하기 위해 서버에 생성되는 스레드 수를 제한하는 방법인 스레드 풀링을 사용하기도 한다. 
 처음부터 너무 많은 풀링을 사용하게 되면 시간이 흐름에 따라 가비지 콜렉션이 작동하고 자바 프로세스는 가비지를 작동시키는 동안 다른 스레드를 멈추는데 이때  어플리 케이션이 먹통이 된것처럼 보일 수 있다.
 특히 힙의 크기가 클수록 가비지 컬렉션에 드는 시간이 길어진다.
 힙 크기와 생성 가능한 스레드 수는 비례하고 힙에 할당된 메모리가 클수록 가비지 컬렉션이 수행되는 횟수는 줄어들지만 수행시간은 상대적으로 길어진다. 
  
 두번째는 컨텍스트 스위칭에 대한 고찰이다. 한 프로세스에 수행되는 스레들이 cpu점유를 위해서 자신의 상태를 변경하는 작업이다. 이때 수많은 스레드가 cpu자원을 획득하기 위하여 경쟁하면서 cpu 자원을 소모하기 때문에 실제로 작업에 사용할 cpu가 줄어들게 된다. 

>> Blocing / NonBlocking
호출된 함수가 바로 리턴해서 호출한 함수에게 제어권을 넘기는가? 
제어권은 메인프로세스에서 어디로 가고 있는가? 
=제어권의 문제 

>>Synchronous / Asynchronous
호출되는 함수에게 callback을 전달해서 사용하고 있는가?
=작업 완료 여부 


'STUDY > PROGRAMMING' 카테고리의 다른 글

웹 개발 공략서  (0) 2018.09.02
failover cluster / LoadBanlancing  (0) 2018.08.30
2. GRADLE ( 도서: gradle 철저입문 )  (0) 2018.08.27

+ Recent posts