기타

애노테이션의 변화

애노테이션 관련 두가지 큰 변화

  • 자바8부터 애노테이션을 타입 선언부에도 사용할 수 있게됨
  • 자바8부터 애노테이션을 중복해서 사용할 수 있게됨

타입 선언부

  • 제네릭 타입
  • 변수 타입
  • 매개변수 타입
  • 예외 타입 등

타입에 사용할 수 있으려면

  • TYPE_PARAMETER: 타입 변수에만 사용할 수 있음
  • TYPE_USE: 타입 변수를 포함해 모든 타입 선언부에 사용 가능

중복 사용할 수 있는 애노테이션 만들기

  • 중복 사용할 애노테이션 만들기

  • 중복 애노테이션 컨테이너 만들기

    • 컨테이너 애노테이션은 중복 애노테이션과 @Retention 및 @Target이 같거나 더 넓어야 함

    • Chicken.java

      @Retension(RetentionPolicy.RUNTIME)
      @Target(ElementType.TYPE_USE)
      @Repeatable(ChickenContainer.class) 
      //여러개의 애노테이션들을 감싸고 있을 컨테이너 애노테이션 타입을 선언함으로써 중복 애노테이션 사용가능
      public @interface Chicken{
          String value();
      }

      ChickenContainer.java

      @Retention(RetentionPolicy.RUNTIME)
      @Target(ElementType.TYPE_USE)
      public @interface ChickenContainer{
          Chicken[] value();
      }

      App.java

      @Chicken("양념")
      @Chicken("마늘간장")
      public class App{
          public static void main(String[] args){
              ChickenContainer chickenContainer= App.class.getAnnotation(ChickenContainer.class);
              Arrays.stream(chickenContainer.value()).forEach(c->{
                  System.out.println(c.value());
              });
          }
      }

배열 Parallel 정렬

Arrays.parallelSort()

  • Fork/Join 프레임워크를 사용해서 배열을 병렬로 정렬하는 기능 제공

병렬 정렬 알고리즘

  • 배열을 둘로 계속 쪼갬

  • 합치면서 정렬

  • sort()와 parallelSort() 비교

    int size=1500;
    int[] numbers= new int[size];
    Random random= new Random();
    IntStream.range(0,size).forEach(i->number[i]=random.nextInt());
    
    long start= System,nanoTime();
    Arrays.sort(numbers);
    System.out.println("serial sorting took "+(System.nanoTime()-start));
    
    IntStream.range(0,size).forEach(i->number[i]=random.nextInt());
    start=System.nanoTime();
    Arrays.parallelSort(numbers);
    System.out.println("parallel sorting took "+(System.nanoTime()-start));
  • 출력

    serial sorting took 648967
    parallel sorting took 343064
  • 둘 다 알고리즘 효율성 O(n logN)(시간), O(n)(공간) 같음. 다만, Parallel이 속도가 좀 더 빠름

Metaspace

GCC 변경사항

JVM의 여러 메모리 영역중 PermGen 메모리 영역이 없어지고 Metaspace 영역이 생김

PermGen

  • Permanent Generation, 클래스 메타 데이터를 담는 곳(클래스에 대한 정보)

  • Heap 영역에 속함

  • 기본값으로 제한된 크기를 가지고 있음(클래스를 많이 쓸수록 공간이 커지고 공간이 꽉 찰 수 있음 -> PermGen 사이즈 늘림(근본적 해결책 x)

    근본적 해결책: 정리가 되지 않는 클래스를 찾아서 정리 해야함)

  • -XX: PermSize=N, PermGen 초기 사이즈 설정

  • -XX: MaxPermSize= N, PermGen 최대 사이즈 설정

Metaspace

  • 클래스 메타데이터를 담는 곳
  • Heap 영역이 아니라(힙 영역에는 Young Generation(얼마전에 만들어진)과 Old Generation(만든지 오래된)만 들어있음), Native 메모리 영역(OS가 제공하는 메모리)
  • 기본값으로 제한된 크기를 가지고 있지 않음. 필요한만큼 계속 늘어남
  • 자바8부터 PermGen 관련 java 옵션은 무시
  • -XX: MetaspaceSize= N, Metaspzce 초기 사이즈 설정
  • -XX: MaxMetaspzceSize= N, Metaspace 최대 사이즈 설정

참고

https://www.inflearn.com/course/the-java-java8

좋은 웹페이지 즐겨찾기