char[]
타입으로 저장된다.
char
는 2바이트(16비트)byte
배열로 나타낼 수 있다.char
배열로 나타닐 때 0으로 채워졌던 바이트 개수만큼 절약 가능String
클래스의 소스 코드에 value
필드 타입이 char[]
에서 byte[]
로 변경되었다.StringBuilder
를 많이 사용해왔다.invokedynamic
을 활용하여 생성되는 바이트코드를 줄일 수 있게 되었다.java -verbose
명령으로 살펴보면 상수 풀에 bootstrap 메서드가 보인다.
StringConcatFactory.makeConcatWithConstants()
var
sun.misc.Unsafe
는 자바 표준 API는 아니지만 자바 8부터 사실상 표준이 되었다.Unsafe
에는 다양한 안전 기능이 버무러져 있다.
sun.misc.Unsafe
기능을 대체할 기술이 없다면 주요 프레임워크와 라이브러리는 더 이상 작동하지 않을 것이다.
—illegal-access
스위치로 이 API에 대한 런타임 엑세스를 조정할 수 있다.
AtomicInteger
를 가변 핸들로 구현하는 예제
public class AtomicIntegerWithVarHandles extends Number {
private volatile int value = 0;
private static final VarHandle V;
static {
try {
MethodHandles.Lookup l = MethodHandles.lookup();
V = l.FindVarHandle(AtomicIntegerWithVarHandles.class, "value", int.class);
} catch (ReflectiveOperationException e) {
throw new Error(e);
}
}
public final int getAndSet(int newValue) {
int v;
do {
v = (int)V.getVolatile(this)
} while (!V.compareAndSet(this, v, newValue));
return v;
}
// ...
}
Object
서브 타입인 참조형에만 적용된다.invokedynamic
명령어의 등장
invokedynamic
을 호출하더라도 invokevirtual
처럼 JIT 컴파일하기 좋고 성능도 좋게 나오도록 하는 것이다.