Java

[Java] Java 8의 특징(7) - 기타 변화들(어노테이션, 병렬 정렬, Metaspace)

재담 2022. 2. 28. 19:29

어노테이션의 변화

자바 8부터 어노테이션을 타입 선언부에도 사용할 수 있게 되었다. 또한 어노테이션을 중복해서 사용할 수 있게 되었다.

 

타입에 사용할 수 있으려면 @Target에 TYPE_PARAMETER(타입 변수에만)나 TYPE_USE(모든 타입 선언부)를 지정하면 된다.

 

어노테이션을 중복으로 사용하기 위해서는 중복 사용할 어노테이션을 만들고, 중복 어노테이션 컨테이너를 만들면 된다. 이때 컨테이너 어노테이션은 중복 사용할 어노테이션과 @Retention 및 @Target이 같거나 더 넓어야 한다.

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE_USE)
@Repeatable(AnimalContainer.class)
public @interface Animal {
    String value();
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE_USE)
public @interface AnimalContainer {
    Animal[] value();
}
@Animal("멍멍이")
@Animal("야옹이")
public class Main {
    public static void main(String[] args) {
        AnimalContainer chickenContainer = Main.class.getAnnotation(AnimalContainer.class);
        Arrays.stream(chickenContainer.value()).forEach(c -> {
            System.out.println(c.value());
        });
    }
}

위 코드에서 AnimalContainer 어노테이션이 Animal 어노테이션을 배열 형태로 가지고 있다.

 

 

배열 Parallel 정렬 - Arrays.parallelSort()

Fork / Join 프레임워크를 사용해서 배열을 병렬로 정렬하는 기능을 제공한다. 병렬 정렬 알고리즘은 스레드를 이용해 배열을 둘로 쪼개고 합치면서 정렬을 한다. 마치 Merge Sort와 비슷하다. 병렬 정렬은 대량의 데이터에 더욱 효과적이라고 한다.

int size = 1000000;
int[] numbers = new int[size];
Random random = new Random();
IntStream.range(0, size).forEach(i -> numbers[i] = random.nextInt());

long start = System.nanoTime();
Arrays.sort(numbers);
System.out.println("serial sort : " + (System.nanoTime() - start));

IntStream.range(0, size).forEach(i -> numbers[i] = random.nextInt());
start = System.nanoTime();
Arrays.parallelSort(numbers);
System.out.println("parallel sort : " + (System.nanoTime() - start));

 

 

Metaspace의 등장

JVM의 여러 메모리 영역 중에 PermGen 메모리 영역이 없어지고 Metaspace 영역이 생겼다.

 

PermGen은 다음과 같은 특징이 있다.

  • Permanent Generation : 클래스 메타데이터를 담는 메모리 영역
  • Heap 영역에 속한다.
  • 기본값으로 제한된 크기를 가지고 있다.
  • -XX:PermSize=N : PermGen 초기 사이즈 설정
  • -XX:MaxPermSize=N : PermGen 최대 사이즈 설정

 

Metaspace는 다음과 같은 특징이 있다.

  • PermGen과 같이 클래스 메타데이터를 담는 곳이다.
  • Heap 영역이 아니라 Native 메모리 영역이다.
  • 기본값으로 제한된 크기를 가지고 있지 않고, 필요한 만큼 계속 늘어난다.
  • 자바 8부터 PermGen 관련 옵션은 무시한다.
  • -XX:MetaspaceSize=N : Metaspace 초기 사이즈 설정
  • -XX:MaxMetaspaceSize=N : Metaspace 최대 사이즈 설정

Reference