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 메소드를 호출
- indy botstrap 메소드 호출
- 장점
- 펌젬이오버플로우 되는 문제를 해결
- 첫실행에는 시간이 조금 더걸리나, 첫실행후에는 빠르다.
- 리플렉션에 비해 절반정도 빠르다.
- 특징
- 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로 바뀌게된다. (대중화가 이뤄지는 시기가 아닐까 하는 관측)
'java' 카테고리의 다른 글
바코드 체크 비트 검증 Java 코드 (0) | 2015.03.06 |
---|---|
리플렉션을 사용한 두 객체의 차이점 저장 메소드 (0) | 2015.02.03 |
Java MethodHandle Example (Java 1.7) (0) | 2014.10.07 |
Java reflection example. (0) | 2014.10.07 |
Java String equals / == 속도 비교 (0) | 2014.07.14 |