네이버를 만든 기술, 읽으면서 배운다 - 자바편
- 강경태, 강운덕, 구태진, 김민수, 김택수, 박세훈, 송기선, 이상민, 정상혁, 최동순 지음
- TECH@NAVER 시리즈_010
- ISBN: 9788998139780
- 20,000원 | 2015년 3월 5일 발행 | 304쪽
네이버 개발자들이 전하는 실전 자바
이 책은 네이버 기술 블로그인 헬로월드(http://helloworld.naver.com)에 올라왔던 자바와 관련된 글을 엄선해서 엮은 책이다. 헬로월드는 네이버 사내 기술 지식을 외부 개발자에게 공유할 목적으로 2011년 12월에 개설된 블로그다.
국내 소프트웨어 개발 환경에서 자바 개발의 비중이 높고 다양한 언어와 플랫폼을 사용하는 네이버에서도 자바 개발은 개발의 큰 축을 담당하고 있다. 네이버 자바 개발자들이 축적한 개발 지식과 문제 해결 경험, 실험 결과를 담은 이 책은 자바 라이브러리를 설계하거나 사용자가 많은 시스템을 운영하는 등 자바를 더 깊이 이해하고 싶은 독자에게 도움이 될 것이다.
★ 이 책에서 다루는 내용 ★
- 자바 문법이나 라이브러리의 불편한 점, API와 라이브러리를 사용할 때 조심할 점, JDK에서 개선된 점
- 애플리케이션에 문제가 생겼을 때 오류 분석에 필요한 지식과 JVM이 남기는 정보를 분석하는 방법, JVM 자체의 오류에 대처한 경험
- 시스템의 성능과 안정성을 개선하기 위해 깊이 알아야 할 영역인 가비지 컬렉션에 관한 지식
- 자바에서의 데이터베이스 연결 설정 분석
추천의 글
"시중에 자바 입문서는 많이 나와 있지만 자바의 API와 내부 작동 구조를 설명하는 책은 그리 많지 않다. 이 책은 최신 자바 8의 특징부터 이와 관련된 자바 주요 API의 작동 원리, JVM의 구조와 명세, 가비지 컬렉션 작동 원리 등 자바 개발자가 중고급 개발자로 성장하는 데 필수적인 내용으로 구성돼 있다. 무엇보다도 네이버의 현업 개발자들이 실제로 네이버 서비스를 개발하면서 겪은 자바 관련 기술 경험을 모은 책이어서 알기 쉬우면서도 전문성이 깊이 느껴지는 책이다."
-- 옥상훈(okgosu) 네이버 D2 에반젤리스트/제4대 한국자바개발자협의회 회장
상세 이미지
강경태
SK C&C에서 근무했으며 현재는 네이버 스포츠 개발의 리더 역할을 하고 있다. CI(continuous integration)에 대한 지식과 경험이 많으며 ICT 전 분야에 관심이 있다.
강운덕
네이버에서 비동기 네트워크 라이브러리와 전사 자바 프레임워크, 트러블슈팅 업무를 수행했다. 현재는 Naver Labs에서 애플리케이션 성능 관리 플랫폼인 Pinpoint를 개발하고 있다.
구태진
2009년 네이버에 입사해 네트워크 라이브러리, 메시지 큐, 게이트웨이 서버 등을 개발했다. 현재는 Naver Labs에서 애플리케이션 성능 관리 플랫폼인 Pinpoint를 개발하고 있다.
김민수
현대정보기술, 야후!코리아와 벤처 기업에서 보안과 웹 서비스, 모바일 분야의 개발을 했다. 지금은 네이버에서 UGC 서비스를 담당하고 있다.
김택수
NHN에서 모바일 검색, 오픈캐스트, 지식백과, 네이버 캐스트 등의 서비스를 만들었고 지금은 다음카카오에서 카카오톡 서버를 개발하고 있다.
박세훈
자바 가상 머신에 관심이 많은 개발자. 네이버에서 위치 기반 서비스, 메시지 큐 등의 플랫폼 개발자로 근무하고 있다. 최근에는 분산 데이터 저장소, 빅데이터 분석 등으로 관심 분야를 넓히고 있다.
송기선
마법의 성에서 마법의 코드를 작성하는 마법과도 같은 남자(아마도). Naver Labs에서 일하고 있다.
이상민
현재 SK플래닛에서 근무 중이며 삼성SDS와 NHN에서 근무했다. 자바와 성능에 관련된 기술 지원이 주 업무다. 저서로 "자바의 신", "개발자가 반드시 알아야 할 자바 성능 튜닝 이야기", "프로그래머로 산다는 것"(공저) 등이 있다.
정상혁
JVM과 리눅스를 둘러싼 오픈소스 생태계에 관심이 많은 개발자다. 네이버의 여러 조직에서 신규 서비스와 라이브러리 개발, 문제 해결 지원, 교육 업무를 수행했다. 업무 자동화의 일환으로 가끔씩 긴 글을 쓴다.
최동순
새로운 아이디어를 얻을 수 있는 여행을 좋아하고 이것저것 작은 것들을 손으로 직접 만들어 보는 것을 좋아한다. 요즘은 분산 환경에서의 효율적인 협업을 위한 컨센서스 프로토콜(consensus protocol)에 관심이 많다.
- [1부] 자바의 API 이해하기
- ▣ 01장: 자바의 날짜와 시간 API
- 자바 클래스에 담긴 제도의 역사
- 1582년 10월 4일의 다음 날은?
- 서울 1988년 5월 7일 23시의 1시간 후는?
- 서울 1961년 8월 9일 23시 59분의 1분 후는?
- 협정세계시 2012년 6월 30일 23시 59분 59초의 2초 후는?
- JDK 기본 날짜 클래스의 문제점
- 불변 객체가 아니다
- int 상수 필드의 남용
- 헷갈리는 월 지정
- 일관성 없는 요일 상수
- Date 클래스와 Calendar 클래스의 불편한 역할 분담
- 오류에 둔감한 시간대 아이디 지정
- java.util.Date 하위 클래스의 문제
- 자바의 개선된 날짜, 시간 API, Joda-Time
- JSR-310, 새로운 자바의 날짜 API
- 마치며
- 자바 클래스에 담긴 제도의 역사
- ▣ 02장: 자바의 HashMap은 어떻게 작동하는가?
- HashMap과 HashTable
- 해시 분포와 해시 충돌
- 자바 8 HashMap에서의 separate chaining
- 해시 버킷의 동적 확장
- 보조 해시 함수
- String 객체에 대한 해시 함수
- 자바 7에서 String 객체에 대한 별도의 해시 함수
- 마치며
- ▣ 03장: 자바에서 외부 프로세스를 실행할 때
- java lang Process 클래스를 생성하는 2가지 방법
- 외부 프로세스가 전달하는 스트림 처리 문제
- 특정 환경에서 발생하는 메모리 할당 실패 문제
- fork-exec 호출이 문제가 되는 경우
- 대처 방안
- Security Manager 클래스를 이용한 실행 제한
- 정책 설정 파일 위치와 실행 옵션
- 정책 설정 방법
- 마치며
- ▣ 04장: 람다가 이끌어 갈 모던 자바
- 컬렉션 처리
- 클래식 자바
- 기본 컬렉션 처리 API
- 자바의 기본 컬렉션을 개선한 라이브러리
- JVM에서 실행되는 다른 언어의 익명 함수
- 모던 자바
- 클로저와 람다 표현식을 둘러싼 논란
- 람다 표현식과 Stream 인터페이스의 도입
- 람다 표현식의 내부 구현
- 애플리케이션 코드의 개선
- 람다 표현식을 활용한 프레임워크
- 마치며
- ▣ 01장: 자바의 날짜와 시간 API
- [2부] 문제 분석과 사례
- ▣ 05장: JVM 이해하기
- 가상 머신
- 자바 바이트코드
- 현상
- 원인
- 클래스 파일 포맷
- JVM 구조
- 클래스 로더
- 런타임 데이터 영역
- 실행 엔진
- 자바 SE 7의 JVM 명세
- String in switch Statements
- 자바 SE 8의 JVM 명세
- 마치며
- ▣ 06장: 스레드 덤프 분석하기
- 자바 그리고 스레드
- 자바 스레드 배경 지식
- 스레드 동기화
- 스레드 상태
- 스레드의 종류
- 스레드 덤프 생성
- jstack을 이용하는 방법
- 자바 VisualVM을 이용하는 방법
- kill을 이용하는 방법
- 스레드 덤프의 정보
- 스레드 덤프 유형별 패턴
- 잠금을 소유하지 못하는 경우(BLOCKED)
- 교착 상태인 경우
- 원격 서버로부터 메시지를 수신받기 위해 계속 대기하는 경우
- WAIT 상태에 있는 경우
- 스레드 리소스를 정상적으로 정리하지 못하는 경우
- 스레드 덤프를 이용한 문제 해결 사례
- 상황1: CPU 사용률이 비정상적으로 높을 때
- 상황2: 실행 성능이 비정상적으로 느릴 때
- 스레드 덤프 분석을 쉽게 만드는 코딩
- 스레드에 이름 부여하기
- MBean으로 더 자세한 정보 얻기
- 마치며
- ▣ 07장: 자바 애플리케이션 분석을 위한 BTrace
- BTrace란?
- 특정 메서드 호출 시의 스택 트레이스 확인
- 실행 시간과 횟수 측정
- 객체의 필드값 확인
- BTrace의 제약사항
- 마치며
- ▣ 08장: 하나의 메모리 누수를 잡기까지
- 장애 징조 - 상반기의 장애 처리 일지
- 모니터링 개선
- 나 혼자 죽을 수 없다
- 문자 메시지 스트레스
- 문제 원인 찾기
- 문제 해결
- 히스토그램 비교
- 힙 덤프 분석
- 마치며
- ▣ 09장: 고맙다 JVM, 사과해라 JVM 크래시
- JVM 오류 현상
- JVM의 명백한 버그
- 버그 리포트와 릴리스 노트
- 마치며
- ▣ 05장: JVM 이해하기
- [3부] 가비지 컬렉션
- ▣ 10장: 자바 가비지 컬렉션의 작동 과정
- 가비지 컬렉션 과정 - Generational Garbage Collection
- Young 영역의 구성
- Old 영역에 대한 가비지 컬렉션
- Serial GC(-XX:+UseSerialGC)
- Parallel GC(-XX:+UseParallelGC)
- Parallel Old GC(-XX:+UseParallelOldGC)
- CMS GC(-XX:+UseConcMarkSweepGC)
- G1 GC
- 마치며
- ▣ 11장: 가비지 컬렉션 모니터링 방법
- 가비지 컬렉션 모니터링이란?
- 가비지 컬렉션을 모니터링하는 방법은?
- jstat
- -verbosegc 옵션
- VisualVM과 Visual GC
- HPjmeter
- 마치며
- ▣ 12장 가비지 컬렉션 튜닝
- 가비지 컬렉션 튜닝을 꼭 해야 할까?
- Old 영역으로 넘어가는 객체의 수 최소화
- Major GC 시간 줄이기
- 가비지 컬렉션의 성능을 결정하는 옵션
- 가비지 컬렉션 튜닝의 절차
- 1.가비지 컬렉션 상황 모니터링
- 2.모니터링 결과 분석 후 가비지 컬렉션 튜닝 여부 결정
- 3.가비지 컬렉션 방식과 메모리 크기 지정
- 4.결과 분석
- 5.결과가 만족스러울 경우 전체 서버에 반영 및 종료
- 가비지 컬렉션 상황 모니터링 및 결과 분석하기
- 가비지 컬렉션 방식 지정과 메모리 크기 지정
- 가비지 컬렉션 방식 지정
- 메모리 크기 지정
- 가비지 컬렉션 튜닝 결과 분석
- 튜닝 사례
- 튜닝 사례 1
- 튜닝 사례 2
- 마치며
- 가비지 컬렉션 튜닝을 꼭 해야 할까?
- ▣ 13장 자바의 Reference 클래스와 가비지 컬렉션
- 가비지 컬렉션과 접근 가능성
- soft reference, weak reference, phantom reference
- Reference 클래스와 접근 가능성
- 접근 가능성의 세기
- softly reachable과 SoftReference
- weakly reachable과 WeakReference
- ReferenceQueue
- phantomly reachable과 PhantomReference
- 마치며
- ▣ 14장 가비지 컬렉션과 Statement Pool
- HTTP 요청에서 응답까지 가비지 컬렉션 발생 과정
- Statement 객체의 크기
- Statement Pool의 캐시 적중률이 Major GC에 미치는 영향
- 마치며
- ▣ 15장 아파치 MaxClients와 톰캣의 Major GC
- 서비스 운영 환경
- stop the world와 503 오류
- MaxClients와 backlog
- MaxClients 설정 계산 방법
- 마치며
- ▣ 10장: 자바 가비지 컬렉션의 작동 과정
- [4부] 데이터베이스 연결 설정
- ▣ 16장 JDBC의 타임아웃 이해하기
- 어느 날 발생한 DDoS 공격, 그 뒤로 먹통이 된 WAS
- 왜 JDBC 드라이버에 대해 알아야 하는가?
- WAS와 DBMS의 통신 시 타임아웃 계층
- 트랜잭션 타임아웃이란?
- Statement 타임아웃이란?
- JDBC 드라이버의 Statement 타임아웃 작동 방식
- JDBC 드라이버의 소켓 타임아웃이란?
- 운영체제 수준의 소켓 타임아웃 설정
- 마치며
- ▣ 17장 Commons DBCP 이해하기
- 버전 선택과 속성 설정 방법
- JDK 버전과 Commons DBCP 버전
- Commons DBCP 속성 설정
- 커넥션의 개수
- 커넥션 풀의 저장 구조
- 커넥션 개수 관련 속성
- 커넥션을 얻기 전 대기 시간
- TPS(transaction per seconds)
- TPS와 커넥션 개수와의 관계
- 적절한 maxWait 값은?
- 커넥션의 검사와 정리
- 유효성 검사 쿼리 설정
- Evictor 스레드와 관련된 속성
- statement pooling 관련 옵션
- 기본값을 그대로 쓰기를 권장하는 옵션
- removeAbandoned 옵션
- defaultAutoCommit 속성
- 마치며
- 버전 선택과 속성 설정 방법
- ▣ 16장 JDBC의 타임아웃 이해하기
1부 자바의 API 이해하기
01 자바의 날짜와 시간 API
예제 코드 관련 GitHub 페이지
- GitHub 페이지: https://github.com/benelog/java-date-time
- ZIP 형식으로 다운로드: https://github.com/benelog/java-date-time/archive/master.zip
예제별 GitHub 페이지
- TimeZoneChangePoint.java
- OldJdkDateTest.java
- JodaTimeTest.java
- Jsr310BackportTest.java
- Jsr310Test.java
03 자바에서 외부 프로세스를 실행할 때
Jetty와 Commons Exec로 만든 전용 데몬
- GitHub 페이지: https://github.com/benelog/shell-proxy
- ZIP 형식으로 다운로드: https://github.com/benelog/shell-proxy/archive/master.zip
04 람다가 이끌어 갈 모던 자바
예제 코드 관련 GitHub 페이지
- GitHub 페이지: https://github.com/benelog/lambda-resort
- ZIP 형식으로 다운로드: https://github.com/benelog/lambda-resort/archive/master.zip
예제별 GitHub 페이지
- 예제 4-1 Guest 객체의 속성(Guest.java)
- 예제 4-2 GuestRepository 인터페이스(GuestRepository.java)
- 예제 4-3 ResortService 인터페이스(ResortService.java)
- 예제 4-4 클래식 자바로 구현한 ResortService 인터페이스의 구현체(ClassicJavaResort.java)
- 예제 4-5 Guava를 활용한 ResortService 인터페이스의 구현체(GuavaResort.java)
- 예제 4-6 TotallyLazy를 활용한 ResortService 인터페이스의 구현체(TotallyLazyResort.java)
- 예제 4-7 GS Collections를 활용한 ResortService 인터페이스의 구현체(GsCollectionsResort.java)
- 예제 4-8 Bolts를 활용한 ResortService 인터페이스의 구현체(BoltsResort.java)
- 예제 4-9 op4j를 활용한 ResortService 인터페이스의 구현체(Op4JResort.java)
- 예제 4-10 lambdaj를 활용한 ResortService 인터페이스의 구현체(LambdaJResort.java)
- 예제 4-12 Functional Java를 활용한 ResortService 인터페이스의 구현체(FunctionalJavaResort.java)
- 예제 4-13 Groovy를 활용한 ResortService 인터페이스의 구현체(GroovyResort.groovy)
- 예제 4-14 Groovy의 it 키워드 활용(GroovyAdvancedResort.groovy)
- 예제 4-15 Scala를 활용한 ResortService 인터페이스의 구현체(ScalaResort.scala)
- 예제 4-16 Scala의 '_' 기호 이용(ScalaAdvancedResort.scala)
- 예제 4-17 Kotlin을 활용한 ResortService 인터페이스의 구현체(KotlinResort.kt)
- 예제 4-18 Kotlin의 it 키워드 활용(KotlinAdvancedResort.kt)
- 예제 4-19 Xtend를 활용한 ResortService 인터페이스의 구현체(XtendResort.xtend)
- 예제 4-20 Xtend에서 함수 파라미터를 생략한 익명 함수 정의(XtendAdvancedResort.xtend)
- 예제 4-21 Ceylon을 활용한 ResortService 인터페이스의 구현체(resort.ceylon)
- 예제 4-22 람다를 활용한 ResortService 인터페이스의 구현체(ModernJavaResort.java)
- 예제 4-23 메서드 레퍼런스를 이용한 구현(ModernJavaAdvancedResort.java)
- 예제 4-25 익명 함수의 인터페이스 확인(ModernJavaBreak2Resort.java)
- 예제 4-26 함수 인터페이스 활용 사례(FunctionParameterExam.java)
- 예제 4-28 직접 정의한 인터페이스를 람다 표현식으로 할당(CustomFunctionReference.java)
- 예제 4-29 익명 클래스와 람다에서 this의 차이(ThisDifference.java)
- 예제 4-30 간단한 람다 활용 예제(SimpleLambda.java)
- 예제 4-31 익명 클래스를 활용한 비동기 서블릿(ClassicAsyncServlet.java)
- 예제 4-32 람다를 활용한 비동기 서블릿(ModernAsyncServlet.java)
- 예제 4-33 익명 클래스로 RowMapper 선언(ClassicJdbcRepository.java)
- 예제 4-34 람다 표현식을 이용한 RowMapper 선언(ModernJdbcRepository.java)
- 예제 4-36 익명 클래스로 안드로이드 이벤트 처리 메서드 지정(ClassicFragment.java)
- 예제 4-37 람다 표현식을 이용한 안드로이드 이벤트 처리 메서드 지정(ModernFragment.java)
- 예제 4-38 Lambda Behave를 이용한 ResortService 테스트(ResortServiceSpec.java)
- 예제 4-39 Jinq를 활용한 ResortService 인터페이스의 구현체(JinqResort.java)
- 예제 4-40 Spark를 이용한 웹 요청 처리(SparkServer.java)
- 예제 4-41 Spark와 Spring Boot를 활용한 ResortService 구현 클래스 연동(ResortServer.java)
- JEDI 활용 예제(JediResort.java)
- Commons Collections 활용 예제(CommonsCollectionsResort.java)
48쪽, 위에서 7번째 줄
캐시 적중률(
cash
hit ratio)이--->
캐시 적중률(
cache
hit ratio)이89쪽, 각주 20
Commons Collections를 활용하는 예제는 깃허브 저장소의 예제에서 CommonsCollectionsResort.java 파일을 참고한다(파일 URL: https://github.com/benelog/lambda-resort/blob/master/src/main/java/com/naver/helloworld/resort/service/JediResort.java).
--->
Commons Collections를 활용하는 예제는 깃허브 저장소의 예제에서 CommonsCollectionsResort.java 파일을 참고한다(파일 URL: https://github.com/benelog/lambda-resort/blob/master/src/main/java/com/naver/helloworld/resort/service/CommonsCollectionsResort.java).
163쪽, ps 실행 결과 단락
LWP가 10039인 행의 %CPU를 0.1에서 95.5로 수정, 그 아래의 LWP가 10040인 행의 %CPU를 95.5에서 0.1로 수정
하단 그림 참고
170쪽, 두 번째 단락
스프링(Spring) AOP(aspect oriented programming) 같은 AOP 프레임워크도 근본적으로는
BCI를 사용한다. ==>AspectJ 같은 AOP(aspect oriented programming) 프레임워크도
BCI를 사용한다.
110쪽, 본문 첫 번째 단락
AOP(aspect oriented
progmramming
)를 구현하는 ==> AOP (aspect orientedprogramming
)를 구현하는
1부 자바의 API 이해하기
01 자바의 날짜와 시간 API
- JUnit
- "Fest Assertions 2.0 documentation"
- "Class GregorianCalendar"
- 서머타임' 내년 4월 부활?", 머니투데이, 2009. 7. 28.
- Java SE Platform Support Team, "Timezone Updater Tool"
- Java SE Platform Support Team, "Timezone Data Versions in the JRE Software"
- 위키백과,"한국 표준시"
- "내일부터 서머타임... 새벽2시를 3시로", 매일경제, 1988. 5. 7.
- "시간대 DB에서 우리나라 시간의 오류"
- "[JDK-8064560] (tz) Support tzdata2014j"
- "조명철, 한국표준시 우리 고유 시간으로 변경 추진", 연합뉴스, 2013. 11. 21.
- "전문가들 시간 미세조정 '윤초' 폐지 논쟁 지속", 연합뉴스, 2013. 09. 21.
- Foursquare
- Yelp
- Cassandra
- Hadoop
- Elasticsearch
- "윤초 때문에… 포스퀘어-링크드인 장애", 지디넷, 2012. 7. 2.
- "1초가 하둡을 죽였다."
- Christopher Pascoe,"Time, technology and leaping seconds"
- "Class Date"
- Stack Overflow, "Do Java system milliseconds take account of leap seconds?"
- Martin Folwer,"ValueObject"
- Sun Microsystems,"Core J2EE Patterns - Transfer Object"
- Martin Folwer,"Data Transfer Object"
- "EI: May expose internal representation by returning reference to mutable object (EI_EXPOSE_REP)"
- "EI2: May expose internal representation by incorporating reference to mutable object (EI_EXPOSE_REP2)"
- Commons Lang
- "Class DateUtils"
- Joda-Time
- Time and Money Code Library
- CalendarDate
- date4j
- 정상혁, "Effective & Agile Java Generics"
- Joshua Bloch, "How to Design a Good API & Why it Matters"
- "Spring 3 Type Conversion and Validation"
- Hibernate
- Joda-Time-Hibernate
- JSR-310
- "[SPR-9641] Support Date and Time API (JSR-310)"
02 자바의 HashMap은 어떻게 작동하는가?
03 자바에서 외부 프로세스를 실행할 때
- "Class Process"
- Michael C. Daconta, "When Runtime.exec() won't"
- anders pearson, "Subprocess Hanging: PIPE is your enemy"
- ProcessWrapper.java
- Alvin Alexander, "Java exec - execute system processes with Java ProcessBuilder and Process (part 1)"
- Alvin Alexander, "Java exec - execute system processes with Java ProcessBuilder and Process (part 3)"
- ant/PumpStreamHandler.java
- commons-exec/PumpStreamHandler.java
- ExecMojo.java
- Stack Overflow, "Runtime.exec causes duplicate JVM to hang indefinitely until killed (Solaris 10)"
- Greg Nakhimovsky, "Minimizing Memory Usage for Creating Application Subprocesses"
- 이승배, "JVM에서 외부 프로그램을 수행할 때 무슨 일이?"
- Java Service Wrapper
- java_posix_spawn
- "[EXEC-51] Integrate using "java_posix_spawn" into commons-exec"
- "OpenJDK / jdk8 / jdk8 / jdk - changeset 7875:a4b0be7341ef"
- "POSIX 1003.1 - man page for vfork (posix section 3posix)"
- Wikipedia, "Fork (system call)"
- "vfork"
- Greg Nakhimovsky, "Minimizing Memory Usage for Creating Application Subprocesses"
- "Ubuntu Manpage: vfork - create a child process and block parent"
- "Bug 18006 - Please replace vfork() with fork()"
- Jenkins
04 람다가 이끌어 갈 모던 자바
- Guava
- TotallyLazy
- Clojure
- Scala
- Haskell
- F#
- GS Collections
- GS Collections Wiki
- Bolts
- Yandex
- op4j
- lambdaj
- Java Hamcrest
- JUnit
- Functional Java
- 이터너티, "고차 함수(Higher-Order Function)를 이용한 설계 개선"
- Commons Collections
- Jedi
- Trove
- Commons Functor
- JRuby
- Jython
- Groovy
- Grails
- Gradle
- Play
- Akka
- Kotlin
- IntelliJ
- JetBrains
- Xtend
- Ceylon
- Hibernate
- The Perl Review, "Interview with Mark Jason Dominus"
- Codehaus Groovy Community, "Groovy User Guide - Closures"
- 이터너티, "언어별 행위 매개변수 구현 방식"
- InfoQ, "Joshua Bloch on Closures, Resource Management, Google"
- InfoQ, "Josh Bloch on Java and Programming"
- "Package java.util.stream"
- Ryan Slobojan, "Josh Bloch on Java and Programming"
- Wikipedia, "Corner case"
- Brian Goetz, "Lambda: A Peek Under the Hood"
- "[SI-8359] Use invokedynamic for lambdas"
- Retrolambda
- Scaloid
- Xtendroid
- Lambda Behave
- Spock
- 백기선, "Spock으로 테스트하기"
- Jinq
- Spark
- Sinatra
- Jetty
- Spring Boot
2부 문제 분석과 사례
05 JVM 이해하기
- Tim Lindholm, Frank Yellin, "The Java Virtual Machine Specification, Second Edition"
- Tim Lindholm, Frank Yellin, Gilad Bracha, Alex Buckley, "The Java Virtual Machine Specification, Java SE 7 Edition"
- Tim Lindholm, Frank Yellin, Gilad Bracha, Alex Buckley, "The Java Virtual Machine Specification, Java SE 8 Edition"
- Tim Lindholm, Frank Yellin, "The Java Virtual Machine Specification, Second Edition"
- Tim Lindholm, Frank Yellin, "The Java Virtual Machine Specification, Second Edition"
- Tim Lindholm, Frank Yellin, "The Java Virtual Machine Specification, Second Edition"
07 자바 애플리케이션 분석을 위한 BTrace
- BTrace
- BTrace: Downloads
- DTrace
- SolrCloud
- "BTrace User's Guide"
- "[BTRACE-91] Btrace 1.2.3 no longer supports Java 1.6"
08 하나의 메모리 누수를 잡기까지
09 고맙다 JVM, 사과해라 JVM 크래시
- "JDK-6896647 : card marks can be deferred too long"
- "JDK-6913441 : CMS: SIGSEGV in CompactibleFreeListSpace::compact"
- "Java SE 6 Update Release Notes - Changes in 1.6.0_18 (6u18)"
3부 가비지 컬렉션
10 자바 가비지 컬렉션의 작동 과정
- Sun Microsystems, "Memory Management in the Java HotSpotTM Virtual Machine"
- Tony Printezis, Paul Ciciora, "The Garbage-First Garbage Collector"
- Apache Lucene Core
- "[JDK-8024830] SEGV in org.apache.lucene.codecs.compressing.CompressingTermVectorsReader.get"
- "[LUCENE-5212] java 7u40 causes sigsegv and corrupt term vectors"
- Elasticsearch
- Apache HBase
- "Part #1 - Tuning Java Garbage Collection for HBase"
11 가비지 컬렉션 모니터링 방법
12 가비지 컬렉션 튜닝
- Poonam-Oracle, "Understanding CMS GC Logs"
- SlideShare
- Attila Szegedi, "Everything I Ever Learned About JVM Performance Tuning @Twitter"