왜 JVM GC는 디스크,램과 달리 파편화/단편화 문제를 압축(memory compression)으로 해결한걸까?
·
JAVA
궁금증GC 알고리즘 중, 마크-스윕 알고리즘은 회수 대상에 대해서 마킹을 진행하고, 마킹된 대상들을 쓸어담아서 회수한다. 따라서 메모리에 살아남은 객체들 사이사이에 파편화된 공간이 남게 된다.이런 방식의 문제점은 메모리의 파편화가 생긴다는 것이다. 살아남은 객체 사이사이 공간들은 일정한 크기가 아니라 들쭉날쭉한 크기로 남게 될 것이고, 큰 객체가 생겨났을 때 해당 공간을 활용하지 못할 것이다.GC 알고리즘에서는 마크-컴팩트 알고리즘 혹은 마크-카피 알고리즘을 통해 이 단편화 문제를 해결한다. 컴팩트 알고리즘은 살아남은 객체들을 메모리공간의 첫 번째 구역부터 차례로 차곡차곡 쌓고 남은 영역을 회수한다. 마크-카피 알고리즘은 살아남은 객체들을 사용하지 않는 공간에 차곡차곡 쌓고 남은 영역을 회수한다. 이 알..
[JAVA] 객체를 넘겨주지 않고, 외부에서 객체를 사용하기!
·
JAVA
들어가며우테코 프리코스 4주차에서 예외 발생시 재시도 로직을 RetryHandler를 만들어서 구현했다.public T retryUntilNotException(final Supplier logic, final OutputView outputView) { while (true) { try { return logic.get(); } catch (IllegalArgumentException e) { outputView.printErrorMessage(e); } }}하지만, 이 메서드는 outputView를 받아와서 이를 참조하도록 구현했기 때문에 outputView의 변경사항이 전파된다는 문제점이 있었다.결합도 상승그래..
[JAVA] 생산자 소비자 문제와 자바의 Object.wait() notify()
·
JAVA
개요 김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성 강의 | 김영한 - 인프런김영한 | 멀티스레드와 동시성을 기초부터 실무 레벨까지 깊이있게 학습합니다., 국내 개발 분야 누적 수강생 1위, 제대로 만든 김영한의 실전 자바[사진][임베딩 영상]단순히 자바 문법을 안다?www.inflearn.com김영한 강사님의 강의를 듣고 정리하였다.생산자 소비자 문제는 여러 스레드가 동시에 데이터를 생산하고 소비하는 경우 발생하는 문제이다.알아보자!.본론개념생산자, Producer는 데이터를 생산하는 역할을 한다.소비자, Consumer는 데이터를 소비하는 역할을 한다.버퍼, Buffer는 생산자가 생성한 데이터를 소비자가 소비하기 전까지 임시로 저장하는 공간이다.문제만약 생산자가 너무 빠르게 데이터를 생산할..
[JAVA] ReentrantLock이 뭔가요?
·
JAVA
개요 김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성 강의 | 김영한 - 인프런김영한 | 멀티스레드와 동시성을 기초부터 실무 레벨까지 깊이있게 학습합니다., 국내 개발 분야 누적 수강생 1위, 제대로 만든 김영한의 실전 자바[사진][임베딩 영상]단순히 자바 문법을 안다?www.inflearn.com 김영한 강사님의 강의를 듣고 정리하였다.본론자바는 1.5버전 부터 Lock 인터페이스와 ReentrantLock 구현체를 제공한다.이는 LockSupport 기능을 활용하여 만들어졌다.public interface Lock { void lock(); void lockInterruptibly() throws InterruptedException; boolean tryLock(); b..
[JAVA] java.util.concurrent.LockSupport 알아보자
·
JAVA
개요 김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성 강의 | 김영한 - 인프런김영한 | 멀티스레드와 동시성을 기초부터 실무 레벨까지 깊이있게 학습합니다., 국내 개발 분야 누적 수강생 1위, 제대로 만든 김영한의 실전 자바[사진][임베딩 영상]단순히 자바 문법을 안다?www.inflearn.com김영한 강사님의 강의를 듣고 정리하였다.본론synchronized 키워드를 이용한 락은 편리하게 임계 영역을 보호할 수 있지만 다음의 문제가 존재한다.임계 영역에서 락을 획득하길 기다리는 스레드들은 BLOCKED 상태에 들어가서 락을 획득할 때까지 대기한다. 이때, 타임아웃 혹은 인터럽트가 불가능하다.임계 영역에서 락을 획득할 때 스레드들은 공정하게 락을 획득하지 못하고 우리는 어떤 스레드가 락을 획득하..
[JAVA] 자바의 임계 영역과 동기화, synchronized
·
JAVA
개요 김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성 강의 | 김영한 - 인프런김영한 | 멀티스레드와 동시성을 기초부터 실무 레벨까지 깊이있게 학습합니다., 국내 개발 분야 누적 수강생 1위, 제대로 만든 김영한의 실전 자바[사진][임베딩 영상]단순히 자바 문법을 안다?www.inflearn.com김영한 강사님의 강의를 듣고 정리하였다.본론임계 영역이란?임계 영역(critical section)이란 여러 스레드가 동시에 접근하게 된다면 데이터의 불일치나 우리가 예상하지 못한 결과가 발생할 수 있는 위험하고 중요한 코드 부분을 뜻한다.여러 스레드들이 동시에 접근해서는 안되는 공유 자원을 접근(조회)하거나 수정하는 부분을 의미한다.출금 예제@Overridepublic boolean withdraw(i..
[JAVA] 자바의 volatile 키워드와 메모리 가시성
·
JAVA
개요 김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성 강의 | 김영한 - 인프런김영한 | 멀티스레드와 동시성을 기초부터 실무 레벨까지 깊이있게 학습합니다., 국내 개발 분야 누적 수강생 1위, 제대로 만든 김영한의 실전 자바[사진][임베딩 영상]단순히 자바 문법을 안다?www.inflearn.com김영한 강사님의 강의를 듣고 정리하였다.본론자바에는 volatile 이라는 키워드가 존재한다.volatile은 메인 메모리에 값을 읽고쓴다는 의미이다.왜 이런 키워드가 존재하고 어디서 사용하는 것일까?문제 상황public class VolatileFlagMain{ public static void main(String[] args){ MyTask task = new..
[JAVA] 스레드의 양보 Thread.yield()
·
JAVA
개요 김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성 강의 | 김영한 - 인프런김영한 | 멀티스레드와 동시성을 기초부터 실무 레벨까지 깊이있게 학습합니다., 국내 개발 분야 누적 수강생 1위, 제대로 만든 김영한의 실전 자바[사진][임베딩 영상]단순히 자바 문법을 안다?www.inflearn.com김영한 강사님의 강의를 듣고 정리하였다.스레드의 작업이 바쁘지 않은 경우 다른 스레드에게 CPU를 양보하는 것이 효율적일 것이다.어떻게 하면될까?본론스레드가 CPU를 할당받아 실행하는 것은 운영체제의 스케줄러가 담당한다.하지만 스레드의 작업이 그렇게 바쁘지 않은 경우 다른 스레드가 작업을 하는 것이 효율적일 것이다.어떤 방법을 사용할 수 있을까?1. Thread.sleep(1)Thread.sleep() ..