1. naming
위가 아래보다 느리다.
compiler는 log 파일을 이용하는데, this.size와 this.elementData.length는 동일하지 않기 때문이다.(값은 동일하지만.)
this.size = this.elementData.length
for (int i = 0; i < this.size; i++) {
if ( i >= this.elementData.length) throw new AIOBE();
}
// this.size = this.elementData.length
for (int i = 0; i < this.elementData.length; i++) {
if ( i >= this.elementData.length) throw new AIOBE();
}
2. implicit null check
if ( this.elementData == null ) throw new NPE();
this.elementData.length
C언어를 생각해보면
this.element가 null일 때, this.element.length에 접근하면 segmentation fault가 발생한다.
java는 segmentation fault를 NPE로 wrap한다.
이 과정이 쉽고 빠르다고 한다.
3. Garbage Collection(Stop The World)
Garbage collection을 하기 위해서는 모든 thread를 정지시켜야한다.
thread를 정지시키는 방식이 꽤 재미있다.
poison page라는 개념을 이용한다.
JIT은 주기적으로 각 thread에 poison page를 읽으라는 명령어를 집어넣는다.
Garbage Collection이 필요하면 page를 unmap해서,
모든 thread에서 segmentation fault가 발생하도록 한다.
4. loop peeling
youtu.be/oH4_unx8eJQ?t=3161youtu.be/oH4_unx8eJQ?t=3161
5. inlining & iterator is not a synthetic sugar
- inlining: youtu.be/oH4_unx8eJQ?t=3512
- iterator is not a synthetic sugar: youtu.be/oH4_unx8eJQ?t=4075
'언어 > Java' 카테고리의 다른 글
jvm internal - 1. Runtime Data Area (0) | 2021.01.30 |
---|---|
JVM internal - 0.Overview (0) | 2021.01.30 |
what jit likes and dislikes (0) | 2021.01.17 |
java 동작 원리 (0) | 2021.01.17 |
Java ME vs SE vs EE, JRE (0) | 2021.01.12 |