JVM (Visualizer eclipse plugin 사용시 보기편함)

참고자료 http://www.slideshare.net/javajigi/java-virtual-machine-call-stack-java-byte-code

  • JVM Stacks (N) - Call Stack
    • Operand Stack
      • 자바는 cpu 레지스터를 사용하지 않고 Operand Stack을 사용한다.
      • 논리적으로 연산을 하는데 물리적 연산을 하는 C보다 가끔 빠른 이유는?
        • 내부적으로 컴파일을 했을때 native code로 변환을 하면 최적화가 일어난다.
        • VM에서 외부 시스템에 호출할때 최적화된 CPU레지스터를 사용한다.
        • C로 짜면 성능 최적화가 어렵다. Java로 최적화를 잘하면 역전 현상도 일어난다.
        • Java byte code -> JVM Interpreter Code
        • C byte code -> H/W Code
        • Java는 메모리 매니지먼트가 빠르다
          • 자바는 핫스팟(GC)관리가 메모리 관리에 뛰어나다.
        • C는 malloc
          • 파편화, 쓰레드 세이프, 직렬화
          • 메모리를 빈번하게 생성하면 성능이 떨어진다.
    • Local Variables
    • 호출했다 빠졌다가 하기때문에 Call Stack
    • 명령을 받았을때 실행되기 때문에 Operand Stack
    • opcode
      • dup
        • 메소드를 호출할때 마다 dup opcode를 호출한다 (관례)
      • invoke special 구상메소드에 호출메소드를 알고 있을때 사용하는 호출방식
        • 모든 메소드의 첫번째 인자는 this 이다.
      • load opcode
        • stack에 값을 넣는다.
        • 값을 빼서 처리 후 store로 stack에 넣는다.
      • iconst
      • invokevirtual 다형성이 지원되지 않는다.
        • 런타임에 어떤 오브젝트를 호출할지 결정된다.
      • store opcode
        • stack에서 값을 뺀다.
        • local 변수로 돌려준다.
  • JVM Heap (1)
    • 모두가 공유하는 메모리이다.
  • Method Area (1)

 

주요 주제

  • 어노테이션의 특성
    • 컴파일이 될때 사용처를 알려주어 컴파일
    • 리플렉션 사용을 위한 마킹을 해놓는다.
  • 롬복 Lombok
    • 어노테이션으로 마킹하여 필요한 메소드를 바이트 코드를 적용하여 생성한다.
    • JavaOne Lambda: A peek under the hood (람다 초기 자료)
    • From Lambdas to Bytecode - Brian Goetz
    • 익명 클래스와 다른점은?
      • 익명클래스로 하던일을 쉽게 한다.
    • 익명 클래스로 하던 패턴을 바로 쓰겠다.
    • 메소드 하나만 있는 인터페이스 -> 람다적용 대상이 된다.
      • SAM (Single Abstract Method) -> Functional Abstract Method

  • invoke dynamic
    • 특징
      • 다형성 x
      • 어떤클래스를 사용하는지 런타임에 결정된다
    • 순서
      • indy botstrap 메소드 호출
        • 어떤 bootstrap메소드를 호출할지는 컴파일타임에 정해진다.
      • Callsite 라는 값을 반환한다.
        • 무엇을 호출할지 값을 가지고있다
      • bootstrap 을 통해 callsite 값 을 받은후에는 callsite 메소드를 호출
    • 장점 
      • 펌젬이오버플로우 되는 문제를 해결
      • 첫실행에는 시간이 조금 더걸리나, 첫실행후에는 빠르다. 
      • 리플렉션에 비해 절반정도 빠르다.

  • Method Handle 
    • 최종적으로 Functional Interface 로 Mapping 된다.
    • 어떤메소드를 호출할지 알려준다.
  • 람다 표현식에서 Invoke dynamic의 역할
    • 람다가쓰이는곳에 Invoke dynamic 방식으로 쓰고,
    • bootstrap 이 Method Factory 를 반환한다.
    • 런타임 중 4가지 방법중에 최적화된 방법을 찾아 수행한다.
  • 키워드
    • Lambda
    • Inner class
    • Proxy
    • Method handle
    • Invoke virtual
      • 다형성
    • Invoke interface
      • 다형성
    • invoke static
      • 다형성 x
  • Lambda 의 동작 방식
    • 한번 더 절차를 만들어 desugar
    • 람다를 람다클래스를 사용하는 멤버변수를생성
    • 코드를 Invoke dynamic 으로 생성
    • 메소드 팩토리(부트스트랩)를 생성
    • callsite를 생성하여 4가지 방법 중 가장 좋은것으로 생성
  • 정보
    • 자바닷컴은 내년초에 자바8로 바뀌게된다. (대중화가 이뤄지는 시기가 아닐까 하는 관측)

 

+ Recent posts