고급 자바 8 교육 (6일 중 2일차)
티맥스소프트 연구소에 연구소장으로 재직 중이던 2013년 10월에 진행한 자바 언어 강의 내용입니다.
JVM에 대한 이해와 Java 8에 대한 소개를 포함하려고 노력하였습니다.
아래 강의 동영상이 있습니다.
http://javadom.blogspot.com/2017/07/8-6.html
2. 오늘 내용
Hello, World & Review
finalize and reference objects
Garbage Collections
java.util.Collection
2
213년 10월 10일 목
3. Hello, World
HelloWorld.java
one public outer class in one source file
entry point : public static void main(String[])
package name
classpath
javac : bytecode compiler (.java -> .class)
java : virtual machine launcher
-server (sever VM)
3
313년 10월 10일 목
6. finalizer 관점에서 Object 상태
reachable 관점 (다른 객체에서 access할 수 있느냐)
1. reachable : live thread에서 언제든지 액세스할 수 있는 상태
2. finalizer-reachable : finalizable 객체에서 결과적으로 액세스할 수 있으나 live
thread에서는 액세스할 수 없는 상태
3. unreachable : finalizable 객체도 액세스할 수 없는 상태
finalized 관점 (finalizer가 완료되었느냐)
1. unfinalized : VM이 finalizer를 호출하지 않은 상태
2. finalizable : VM이 finalizer를 호출할 수 있는 상태
3. finalized : VM이 finalizer를 호출한 상태
6
613년 10월 10일 목
7. more on reachables
java.lang.ref 패키지
SoftReference : gc가 메모리 부족 판
단 시 제거. 메모리에 민감한 캐시 용도
WeakReference : gc가 언제든지
finalize. 주로 WeakHashMap 구현을
위해 필요
PhantomReference : gc로부터
reachable 상태를 벗어난 객체로부터
noti를 받기 위함 (finalizer 대체)
7
strongly reachable
softly reachable
weakly reachable
phantom reachable
unreachable
713년 10월 10일 목
8. ReferenceQueue
각 Reference들이 해당 reachable 상태에 이르면 garbage
collector가 지정된 ReferenceQueue로 enqueue
Soft/WeakReference의 경우는 referent object가 Softly/
Weakly Reachable의 상태에서 gc에 의해 자동으로 clear되
지만, PhantomReference의 경우는 Phantom Reachable
의 상태에서 명시적으로 clear되어야 한다.
PhantomReference의 referent는 enqueue될 때
reclaimable 상태여야 하므로 이를 get할 수 없다.
8
813년 10월 10일 목
9. Garbage Collection
live object가 아닌 dead object를 garbage
기본 알고리즘
serial vs parallel
concurrent vs stop-the-world
compacting vs non-compacting vs copying
non-compacting releases object in-place and can
cause fragmentation
9
913년 10월 10일 목
10. HotSpot Memory Model
Object references are direct pointers
gc will update the pointer on relocation
Two-word Object Headers (array는 3-word)
identity hash code and GC status information
a reference to the object's class
[array size]
Object packing : reordering fields
10
1013년 10월 10일 목
11. Basics on HotSpot JVM GC
Conventional Generational Collection (Before JDK 7 G1 GC)
11
PERMANENT
1113년 10월 10일 목
12. young to old promotion
처음에 객체가 만들어지면 Eden에 위치 (일부 큰 객체는 바로
old로 갈 수도 있음)
한번의 young generation collection(minor gc)를 넘어가면
survivor space 둘 중 하나로 이동 (항상 두 survivor space
중 하나만 사용됨)
survivor space에는 tenuring threshold를 넘을 때까지 위치
할 수 있음 (매 collection마다 다른 space로 이동되거나
tenure로 promotion)
12
1213년 10월 10일 목
13. Young Generation Collector
serial collector (default in Client JVM)
-XX:+UseSerialGC
parallel collector (thruput collector)
-XX:+UseParallelGC
-XX:+UseParallelOldGC (old 에도 parallel 적용)
concurrent collector (shorter gc pause time)
-XX:+UseConcMarkSweepGC
minor, major 모두 적용되며 minor collection에서도 짧은 pause가 발생
large tenured data set에서 많이 사용
13
1313년 10월 10일 목
15. G1(Garbage First) GC
since JDK 7u4
–XX:+UseG1GC
regions : 1MB~32MB
incremental parallel
compacting GC
가장 garbage가 많은
region부터 collect
more predictable
pause times
15
1. initial mark phase : mark
root and young gc (STW)
2. root region scanning
phase : survivor to old
3. concurrent mark phase :
find reachable across
entire heap
4. remark phase :
completing marks
5. cleanup phase : free all-
dead region (partly STW)
1513년 10월 10일 목
20. Fail-fast
ArrayList<String> list = ...
DO
Iterator<String> iter = list.iterator();
while (iter.hasNext()) {
String v = iter.next();
if (“abc”.equals(v)) {
iter.remove();
}
}
20
ArrayList<String> list = ...
DO NOT
Iterator<String> iter =
list.iterator();
while (iter.hasNext()) {
String v = iter.next();
list.remove(“abc”);
}
2013년 10월 10일 목
21. DO NOT
HashMap<String, String> map = ...;
DO NOT
for (String key : map.keySet()) {
String v = map.get(key);
}
DO
for (Map.Entry<String, String> entry : map.entrySet()) {
String key = entry.getKey();
String v = entry.getValue();
}
21
2113년 10월 10일 목