SlideShare uma empresa Scribd logo
1 de 49
JDK 7 출시 기념 (2011.7)JDK 7 소개 #5 invokedynamic 김용환 knight76.tistory.com Knight76 at gmail.com 1
좋은 레퍼런스 http://java.sun.com/developer/technicalArticles/DynTypeLang/index.html http://androidkr.blogspot.com/2010_07_01_archive.html http://cr.openjdk.java.net/~jrose/pres/200906-Cookbook.pdf http://download.oracle.com/javase/7/docs/technotes/guides/vm/multiple-language-support.html Jsr문서 dynamically_typed_lang-jdk7-final-oth-JSpecndex.html
For Who JAVA 1.6부터 다른 언어를 지원 (Rhino) 정적 타입 언어 (非 자바)를 jvm에서 안정적이고, 빨리 실행시켜줄 수 있도록 지원 요청
Java language / JVM Java language 는 JVM과 다르다. 특징 Java compiler 사람이 write한 java code를 JVM에서 실행가능하도록byte 코드를 생성 HelloWorld.java -> HellowWorld.class Java Virtual Machine  byte코드와 class 파일 포맷을 가지고 실행 HellowWorld.class -> 실행 이슈 Java language 이슈가 아닌… 정적 타입 언어를 바로 JVM 상에서 돌아가는 것 자체가 어려움 (interoperability) JVM (java virtual machine)의 실행 속도 이슈! (performance)
기존 사례 Groovy 코드 -> class로 컴파일  -> JVM실행 JRuby코드 -> class로컴파일   (spring의 JRubyScriptUtils.createJRubyObject메소드) -> JVM 실행 단점 JVM에서 돌아갈 수 있도록 작업을 많이 해야 했음. JVM dependent code가 많았음
둘의장점을 이용 Ruby/Python (Dynamic Language) JVM 특징 (고성능, 재활용,  JIT, GC,  다양한 OS 지원)
But, 이슈 동적언어와 정적 언어 특징 정적 타입 언어(java)는Compile 레벨에서 Type Checking이 엄격하게 이루어짐 동적 타입 언어(dynamic type)는 Type Checking이 Runtime때 실행. 변수는 어떤 타입이든지 상관없음 (javascript, ruby, python..)
JVM 이슈 : 메소드 JVM 이슈 : 메소드 동적언어에서는메소드의파라미터 타입을 굳이 알 수 않아도 되지만, JVM은 byte code 명령어들을 이용하기 위해서 method, method안의 클래스 타입, descriptor 형식이 필요  function max (x,y) {       if x.lessThan(y) then y else x  }  동적언어메소드파라미터의 타입정보가 없는 메소드
구현 타입 정보가 없으면, reflection API를이용해서 java.lang.reflect.Method 클래스를 생성하고, Method 클래스의 invoke 메소드로 호출하는 형태(Proxy) Reflection 호출 자체가 실행속도에 안좋은 영향을 줌. 성능 저하 예) Spring에서는  Proxy 개선 : CGLIB Proxy  Reflection 없이 속도 향상!
빠른 속도 Reflection API를 쓰지 않아도 바로 invoke 해 줄 수있고, 속도도 빠른 새로운 API가 필요 JVM 의 invoke 명령어 중 새로운 API를 추가하자!
잠깐.. JVM byte code 공부
JVM byte code JVM에서 동작하는 native language (assembly와 비슷) JVM byte code Stack에 작업(push/pop/dup/swap)을 하고, 실행시키는 machanism Operand stack : byte code가 실행할 수 있는 임시용의 stack (cpu의 register stack)
JVM byte code의 instruction ldc/const : stack에 값을 push  load/store : 로컬 변수 접근 관련 aaload/*aload : array로부터 값을 얻기 iinc : i++ if_icmpge :conditional jump return Invoke  virtual : 인터페이스가 아닌 메소드를 호출. (대부분) interface : 인터페이스 메소드를 호출 static : static 호출 special : 생성자와super class 메소드의 구현 메소드를 호출
Java ByteCode출력방법 javap –c 클래스이름
예제 String s = "Hello World"; System.out.println(s); java ldc #2          // ‘Hello World’ stack에 저장(push)한다. astore_1      //Stack에서 ‘Hellow World’를 꺼내 로컬변수 1에 저장한다. getstatic#3 //System.out에서 static field인 PrintStream클래스를 꺼낸다. aload_1      // 로컬변수 1에서 가르키는Stirng을 읽는다. invokevirtual #4  // PrintStream의 println을 호출한다.  // java/io/PrintStream.println:(Ljava/lang/String;)V jvm
JVM invokevirtualinstuction이슈 invokevirtual instruction은 메소드의파라미터의 클래스타입(descriptor)을 반드시 알아야 함 invokevirtual <method-spec> classname, methodname,descriptor com/google/Myclass/myMethod(Ljava/lang/String;)V -----------------------                 ---------------------                 -------------                   descriptor classname methodname
JVM invokevirtualinstuction예제 Object x;  ...  x.equals("hello");  java aload_1 ; 로컬 변수 ‘x’를 스택첫번째에 저장 ldc"hello"   ; 스택에‘hello’라는 Sting값을 저장 ;  ‘equals’ 메소드 호출 ; 스택에 저장되는 값은 Boolgean값(Z) invokevirtual   java/lang/Object/equals(Ljava/lang/Object;)Z jvm
invokestatic
invokestatic String s = System.getProperty("java.home"); java ldc#2              //String ”java.home”을 stack에 저장 invokestatic#3  //Method java/lang/System.getProperty:                          //  (Ljava/lang/String;)Ljava/lang/String; astore_1 jvm
invokestatic
invokestatic
invokevirtual
invokevirtual PrintStream out = System.out; out.println("Hello World"); java getstatic #16 astore_1 aload_1 ldc#2 invokevirtual #4    //Method java/io/PrintStream.println:                          //(Ljava/lang/String;)V jvm
invokevirtual 출처 : http://cr.openjdk.java.net/~jrose/pres/200906-Cookbook.pdf
invokevirtual
invokevirtual
invokedynamic
invokedynamic function max(x, y) {     if (x.lessThan(y)) then y else x } 동적 타입 언어 aload_1; aload_2 invokedynamic#3 //  NameAndTypelessThan:                          // (Ljava/lang/Object;Ljava/lang/Object;)Z if_icmpeq jvm Boolean 리턴타입. Argument는 타입없는object
invokedynamic C언어의 함수 포인터와 비슷!
invokedynamic이후Bootstrap instruction 부트 로직
JVM 동작 순서 invokedynamic명령어를 실행하기 전에 java.lang.invoke.CallSite를 확인 CallSite가 없다면, 동적 타입 언어의 런타임에서 bootstrap 메소드를 호출 Bootstrap 메소드는CallSite객체를 반환(invokedynamic은 CallSite에 링크됨) invokedynamic은 CallSite에 저장된 java.net.MethodHandle(MH)를 이용해서 메소드 호출 CallSite가 이미 등록된 invokedynamic이 다시 실행되면, 위 과정 없이 바로 메소드 호출(invokedynamic이 구현에 대한 MethodHandle을 한번이라도 사용하면, 그 MethodHandle을 사용)
up call 리눅스 low level 이 high level에 있는 함수를 호출하는 것이죠. signal handler 같은 것 JVM JVM의 invokedynamic이 bootstrap 메소드를 호출하는 것
코드 구현 예제 #1 public class HelloWorld {     public static void main(String[] args) { //PSEUDOCODE FOR A JVM INSTRUCTION         //invokedynamic[#bootstrapDynamic]("Hello World", 2, 3.14);     }     private static void printArgs(Object... args) { System.out.println(java.util.Arrays.deepToString(args));     }     private static MethodHandleprintArgs;     static { MethodHandles.Lookuplookup = MethodHandles.lookup();          Class thisClass = lookup.lookupClass();  try { printArgs= lookup.findStatic(thisClass, "printArgs", MethodType.methodType(void.class,                                                           Object[].class)); } catch (Exception e) { e.printStackTrace(); }     } private staticCallSitebootstrapDynamic(MethodHandles.Lookup caller, String name,  MethodType type) { return new ConstantCallSite(printArgs.asType(type));     } }
코드 구현 예제 #2 public class IntegerOps { public static Integer adder(Integer x, Integer y) {     return x + y;   } } public class Example {   public static CallSitemybsm(MethodHandles.LookupcallerClass, String dynMethodName, MethodTypedynMethodType)  throws Throwable { MethodHandlemh= callerClass.findStatic(Example.class, "IntegerOps.adder",  MethodType.methodType(Integer.class, Integer.class, Integer.class));     if (!dynMethodType.equals(mh.type())) { mh = mh.asType(dynMethodType);     }     return new ConstantCallSite(mh);   } }
코드 구현 예제 #2 InvokeVirtual과 달리 메소드 호출을 위한 클래스 정보가 필요 없다. 대신 길다. Jvmbytecode invokedynamicinvokedynamic REF_invokestatic: Example.mybsm:       "(Ljava/lang/invoke/MethodHandles/Lookup; Ljava/lang/String; Ljava/lang/invoke/MethodType;) Ljava/lang/invoke/CallSite;":     +:       "(Ljava/lang/Integer; Ljava/lang/Integer;) Ljava/lang/Integer;";
코드 구현 예제 #2 invokedynamicinvokedynamic REF_invokestatic: Example.mybsm:       "(Ljava/lang/invoke/MethodHandles/Lookup; Ljava/lang/String; Ljava/lang/invoke/MethodType;) Ljava/lang/invoke/CallSite;":     +:       "(Ljava/lang/Integer; Ljava/lang/Integer;) Ljava/lang/Integer;"; bootstrap 메소드가addr static 메소드를 호출 1 2 Bootstrap의 Full Qualified name인 Example.mybsm 3 bootstrap 메소드가addr static 메소드를 호출
API java.lang.invoke..MethodHandle (MH)  JVM 메소드에 대한 anonymous reference 을 가지고 있음 MethodHandles.Lookup factory for creating method handles java.lang.invoke.CallSite MethodHandler변수를 가지고 있는 Holder ConstantCallSite, MutableCallSite BootstrapMethodError invokedynamic호출후bootstrap 메소드을못찾거나Call site을 리턴하지 못하면 에러 발생
JSR 292 JSR292
JSR 292 -Spec.zip
JSR 292 JRuby팀과협업 enhanced bytecode + a new API invokedynamic java.lang.invoke MethodHandle(일종의 함수 포인터) Combinators provide adhoc classes: ClassValue(캐쉬), SwitchPoint (상태확인)
JVM Spec Changed
참고
JRuby실전 테스트 jruby에서 jvm버전을 변경하고 싶을 때는 JAVA_HOME을 변경하면 된다.  (따로 properties 설정은 없다.) C:ruby-1.6.3-without-jvmin>jruby.exe -v jruby 1.6.3 (ruby-1.8.7-p330) (2011-07-07 965162f) (Java HotSpot(TM) Client VM 1.7.0) [Windows 7-x86-java] C:ruby-1.6.3-without-jvmin>java -classpath.;jruby.jar  a.JRubyExample num: 6 C:ruby-1.6.3-without-jvmin>
JRuby실전 테스트 myruby.rb def max(a,b)   if a < b     b   else     a   end end defgetMax(number1, number2)     f = max(number1, number2)     return f end
JRuby실전 테스트 a.JRubyExample.java public static void main(String[] args) throws Exception { ScriptEnginejruby = new ScriptEngineManager().getEngineByName("jruby"); jruby.eval(new BufferedReader(new FileReader("myruby.rb"))); jruby.put("number1", 6); jruby.put("number2", 9);         long num = (Long) jruby.eval("getMax($number1, $number1)"); System.out.println("num: " + num); }
JRuby실전 테스트 C:ruby-1.6.3-without-jvmin>jrubyc.bat myruby.rb   public static org.jruby.runtime.builtin.IRubyObject method__0$RUBY$max(myruby, org.jruby.runtime.ThreadContext, org.jruby.runtime.builtin.IRubyObject, org.jru by.runtime.builtin.IRubyObject, org.jruby.runtime.builtin.IRubyObject, org.jruby .runtime.Block);     Code:        0: aload_3        1: astore        10        3: aload         4        5: astore        11        7: aload_0        8: invokevirtual #33                 // Method getCallSite0:()Lorg/jruby/ runtime/CallSite;       11: aload_1       12: aload_2       13: aload         10       15: aload         11       17: invokevirtual #39                 // Method org/jruby/runtime/CallSite .call:(Lorg/jruby/runtime/ThreadContext;Lorg/jruby/runtime/builtin/IRubyObject;L org/jruby/runtime/builtin/IRubyObject;Lorg/jruby/runtime/builtin/IRubyObject;)Lo rg/jruby/runtime/builtin/IRubyObject;       20: invokeinterface #45,  1           // InterfaceMethod org/jruby/runtime /builtin/IRubyObject.isTrue:()Z       25: ifeq          33       28: aload         11       30: goto          35       33: aload         10       35: areturn 비슷한 구현이 이미 되어 있음
JRuby의 성능 http://eyweb-images.s3.amazonaws.com/blog_crossimp.jpg
정리 Jruby 1.6.3까지는 invokedynamic사용하지 않음. (invokedynamic테스트 버전은 따로 있음.) 대신 내부적으로 invokedynamic비슷한 구현을 이미 하고 있음  Groovy Jruby처럼 내부적으로는 invokedynamic비슷한 구현 함 앞으로 많은 언어들이 쓸 수 있도록 배려했고, 비슷하게 구현한 것들은 조금 더 빠른 속도가 날 수 있으며, 더 많은 언어들이 이 기능을 사용할 수 있음
To be continued #6 49

Mais conteúdo relacionado

Mais procurados

java 8 람다식 소개와 의미 고찰
java 8 람다식 소개와 의미 고찰java 8 람다식 소개와 의미 고찰
java 8 람다식 소개와 의미 고찰Sungchul Park
 
파이썬 병렬프로그래밍
파이썬 병렬프로그래밍파이썬 병렬프로그래밍
파이썬 병렬프로그래밍Yong Joon Moon
 
Android ndk jni 설치및 연동
Android ndk jni 설치및 연동Android ndk jni 설치및 연동
Android ndk jni 설치및 연동Sangon Lee
 
자바에서 null을 안전하게 다루는 방법
자바에서 null을 안전하게 다루는 방법자바에서 null을 안전하게 다루는 방법
자바에서 null을 안전하게 다루는 방법Sungchul Park
 
골때리는 자바스크립트 발표자료
골때리는 자바스크립트 발표자료골때리는 자바스크립트 발표자료
골때리는 자바스크립트 발표자료욱진 양
 
일단 시작하는 코틀린
일단 시작하는 코틀린일단 시작하는 코틀린
일단 시작하는 코틀린Park JoongSoo
 
안드로이드 스터디 Jni 발표 자료 Rev05 송형주
안드로이드 스터디 Jni 발표 자료 Rev05 송형주안드로이드 스터디 Jni 발표 자료 Rev05 송형주
안드로이드 스터디 Jni 발표 자료 Rev05 송형주iamhjoo (송형주)
 
비전공자의 자바스크립트 도전기
비전공자의 자바스크립트 도전기비전공자의 자바스크립트 도전기
비전공자의 자바스크립트 도전기jeong seok yang
 
[1B4]안드로이드 동시성_프로그래밍
[1B4]안드로이드 동시성_프로그래밍[1B4]안드로이드 동시성_프로그래밍
[1B4]안드로이드 동시성_프로그래밍NAVER D2
 
자바8 람다식 소개
자바8 람다식 소개자바8 람다식 소개
자바8 람다식 소개beom kyun choi
 
0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)Sung-hoon Ma
 
프론트엔드스터디 E03 - Javascript intro.
프론트엔드스터디 E03 - Javascript intro.프론트엔드스터디 E03 - Javascript intro.
프론트엔드스터디 E03 - Javascript intro.Young-Beom Rhee
 
ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!WooYoung Cho
 
GKAC 2015 Apr. - Android Looper
GKAC 2015 Apr. - Android LooperGKAC 2015 Apr. - Android Looper
GKAC 2015 Apr. - Android LooperGDG Korea
 
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출GDG Korea
 
Angular2 router&http
Angular2 router&httpAngular2 router&http
Angular2 router&httpDong Jun Kwon
 

Mais procurados (19)

java 8 람다식 소개와 의미 고찰
java 8 람다식 소개와 의미 고찰java 8 람다식 소개와 의미 고찰
java 8 람다식 소개와 의미 고찰
 
파이썬 병렬프로그래밍
파이썬 병렬프로그래밍파이썬 병렬프로그래밍
파이썬 병렬프로그래밍
 
Android ndk jni 설치및 연동
Android ndk jni 설치및 연동Android ndk jni 설치및 연동
Android ndk jni 설치및 연동
 
자바에서 null을 안전하게 다루는 방법
자바에서 null을 안전하게 다루는 방법자바에서 null을 안전하게 다루는 방법
자바에서 null을 안전하게 다루는 방법
 
골때리는 자바스크립트 발표자료
골때리는 자바스크립트 발표자료골때리는 자바스크립트 발표자료
골때리는 자바스크립트 발표자료
 
일단 시작하는 코틀린
일단 시작하는 코틀린일단 시작하는 코틀린
일단 시작하는 코틀린
 
안드로이드 스터디 Jni 발표 자료 Rev05 송형주
안드로이드 스터디 Jni 발표 자료 Rev05 송형주안드로이드 스터디 Jni 발표 자료 Rev05 송형주
안드로이드 스터디 Jni 발표 자료 Rev05 송형주
 
비전공자의 자바스크립트 도전기
비전공자의 자바스크립트 도전기비전공자의 자바스크립트 도전기
비전공자의 자바스크립트 도전기
 
Java 기초
Java 기초Java 기초
Java 기초
 
[1B4]안드로이드 동시성_프로그래밍
[1B4]안드로이드 동시성_프로그래밍[1B4]안드로이드 동시성_프로그래밍
[1B4]안드로이드 동시성_프로그래밍
 
4-1. javascript
4-1. javascript4-1. javascript
4-1. javascript
 
Java lambda
Java lambdaJava lambda
Java lambda
 
자바8 람다식 소개
자바8 람다식 소개자바8 람다식 소개
자바8 람다식 소개
 
0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)
 
프론트엔드스터디 E03 - Javascript intro.
프론트엔드스터디 E03 - Javascript intro.프론트엔드스터디 E03 - Javascript intro.
프론트엔드스터디 E03 - Javascript intro.
 
ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!
 
GKAC 2015 Apr. - Android Looper
GKAC 2015 Apr. - Android LooperGKAC 2015 Apr. - Android Looper
GKAC 2015 Apr. - Android Looper
 
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
 
Angular2 router&http
Angular2 router&httpAngular2 router&http
Angular2 router&http
 

Semelhante a Jdk(java) 7 - 5. invoke-dynamic

Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기jongho jeong
 
Domain Specific Languages With Groovy
Domain Specific Languages With GroovyDomain Specific Languages With Groovy
Domain Specific Languages With GroovyTommy C. Kang
 
Startup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSStartup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSCirculus
 
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기NAVER Engineering
 
Java 8 & Beyond
Java 8 & BeyondJava 8 & Beyond
Java 8 & BeyondJay Lee
 
Javascript 교육자료 pdf
Javascript 교육자료 pdfJavascript 교육자료 pdf
Javascript 교육자료 pdfHyosang Hong
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs기동 이
 
Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)Choonghyun Yang
 
안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계Leonardo YongUk Kim
 
반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게Sungju Jin
 
Java mentoring of samsung scsc 2
Java mentoring of samsung scsc   2Java mentoring of samsung scsc   2
Java mentoring of samsung scsc 2도현 김
 
Pinpoint spring_camp 2015
Pinpoint spring_camp 2015Pinpoint spring_camp 2015
Pinpoint spring_camp 2015Woonduk-Kang
 
(IT실무교육/국비지원교육/자바/스프링교육추천)#15.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
(IT실무교육/국비지원교육/자바/스프링교육추천)#15.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)(IT실무교육/국비지원교육/자바/스프링교육추천)#15.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
(IT실무교육/국비지원교육/자바/스프링교육추천)#15.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)탑크리에듀(구로디지털단지역3번출구 2분거리)
 
자바와 사용하기2
자바와 사용하기2자바와 사용하기2
자바와 사용하기2destinycs
 

Semelhante a Jdk(java) 7 - 5. invoke-dynamic (20)

Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기
 
Domain Specific Languages With Groovy
Domain Specific Languages With GroovyDomain Specific Languages With Groovy
Domain Specific Languages With Groovy
 
Startup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSStartup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JS
 
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
 
Java(2/4)
Java(2/4)Java(2/4)
Java(2/4)
 
Node.js at OKJSP
Node.js at OKJSPNode.js at OKJSP
Node.js at OKJSP
 
Java 8 & Beyond
Java 8 & BeyondJava 8 & Beyond
Java 8 & Beyond
 
Javascript 교육자료 pdf
Javascript 교육자료 pdfJavascript 교육자료 pdf
Javascript 교육자료 pdf
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs
 
Java_01 기초
Java_01 기초Java_01 기초
Java_01 기초
 
Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)
 
Java(1/4)
Java(1/4)Java(1/4)
Java(1/4)
 
안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계
 
반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게
 
Java mentoring of samsung scsc 2
Java mentoring of samsung scsc   2Java mentoring of samsung scsc   2
Java mentoring of samsung scsc 2
 
Node.js intro
Node.js introNode.js intro
Node.js intro
 
Pinpoint spring_camp 2015
Pinpoint spring_camp 2015Pinpoint spring_camp 2015
Pinpoint spring_camp 2015
 
4-3. jquery
4-3. jquery4-3. jquery
4-3. jquery
 
(IT실무교육/국비지원교육/자바/스프링교육추천)#15.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
(IT실무교육/국비지원교육/자바/스프링교육추천)#15.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)(IT실무교육/국비지원교육/자바/스프링교육추천)#15.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
(IT실무교육/국비지원교육/자바/스프링교육추천)#15.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
 
자바와 사용하기2
자바와 사용하기2자바와 사용하기2
자바와 사용하기2
 

Mais de knight1128

Hancom MDS Conference - KAKAO DEVOPS Practice (카카오 스토리의 Devops 사례)
Hancom MDS Conference - KAKAO DEVOPS Practice (카카오 스토리의 Devops 사례)Hancom MDS Conference - KAKAO DEVOPS Practice (카카오 스토리의 Devops 사례)
Hancom MDS Conference - KAKAO DEVOPS Practice (카카오 스토리의 Devops 사례)knight1128
 
Spring MVC 3 Restful
Spring MVC 3 RestfulSpring MVC 3 Restful
Spring MVC 3 Restfulknight1128
 
Jersey framework
Jersey frameworkJersey framework
Jersey frameworkknight1128
 
Google Protocol buffer
Google Protocol bufferGoogle Protocol buffer
Google Protocol bufferknight1128
 
Jdk(java) 7 - 6 기타기능
Jdk(java) 7 - 6 기타기능Jdk(java) 7 - 6 기타기능
Jdk(java) 7 - 6 기타기능knight1128
 
Jdk 7 4-forkjoin
Jdk 7 4-forkjoinJdk 7 4-forkjoin
Jdk 7 4-forkjoinknight1128
 
공유 Jdk 7-2-project coin
공유 Jdk 7-2-project coin공유 Jdk 7-2-project coin
공유 Jdk 7-2-project coinknight1128
 
공유 Jdk 7-1-short introduction
공유 Jdk 7-1-short introduction공유 Jdk 7-1-short introduction
공유 Jdk 7-1-short introductionknight1128
 
아마존 Aws 서비스_연구
아마존 Aws 서비스_연구아마존 Aws 서비스_연구
아마존 Aws 서비스_연구knight1128
 
구글크롬Os
구글크롬Os구글크롬Os
구글크롬Osknight1128
 
하이브리드앱
하이브리드앱하이브리드앱
하이브리드앱knight1128
 
오픈소스를 활용한 Batch_처리_플랫폼_공유
오픈소스를 활용한 Batch_처리_플랫폼_공유오픈소스를 활용한 Batch_처리_플랫폼_공유
오픈소스를 활용한 Batch_처리_플랫폼_공유knight1128
 
Ssl 하드웨어 가속기를 이용한 성능 향상
Ssl 하드웨어 가속기를 이용한 성능 향상Ssl 하드웨어 가속기를 이용한 성능 향상
Ssl 하드웨어 가속기를 이용한 성능 향상knight1128
 

Mais de knight1128 (19)

Hancom MDS Conference - KAKAO DEVOPS Practice (카카오 스토리의 Devops 사례)
Hancom MDS Conference - KAKAO DEVOPS Practice (카카오 스토리의 Devops 사례)Hancom MDS Conference - KAKAO DEVOPS Practice (카카오 스토리의 Devops 사례)
Hancom MDS Conference - KAKAO DEVOPS Practice (카카오 스토리의 Devops 사례)
 
Comet
CometComet
Comet
 
Apache avro
Apache avroApache avro
Apache avro
 
Apache Thrift
Apache ThriftApache Thrift
Apache Thrift
 
Redis
RedisRedis
Redis
 
Spring MVC 3 Restful
Spring MVC 3 RestfulSpring MVC 3 Restful
Spring MVC 3 Restful
 
Jersey framework
Jersey frameworkJersey framework
Jersey framework
 
Google Protocol buffer
Google Protocol bufferGoogle Protocol buffer
Google Protocol buffer
 
Jdk(java) 7 - 6 기타기능
Jdk(java) 7 - 6 기타기능Jdk(java) 7 - 6 기타기능
Jdk(java) 7 - 6 기타기능
 
Jdk 7 4-forkjoin
Jdk 7 4-forkjoinJdk 7 4-forkjoin
Jdk 7 4-forkjoin
 
Jdk 7 3-nio2
Jdk 7 3-nio2Jdk 7 3-nio2
Jdk 7 3-nio2
 
공유 Jdk 7-2-project coin
공유 Jdk 7-2-project coin공유 Jdk 7-2-project coin
공유 Jdk 7-2-project coin
 
공유 Jdk 7-1-short introduction
공유 Jdk 7-1-short introduction공유 Jdk 7-1-short introduction
공유 Jdk 7-1-short introduction
 
아마존 Aws 서비스_연구
아마존 Aws 서비스_연구아마존 Aws 서비스_연구
아마존 Aws 서비스_연구
 
속도체크
속도체크속도체크
속도체크
 
구글크롬Os
구글크롬Os구글크롬Os
구글크롬Os
 
하이브리드앱
하이브리드앱하이브리드앱
하이브리드앱
 
오픈소스를 활용한 Batch_처리_플랫폼_공유
오픈소스를 활용한 Batch_처리_플랫폼_공유오픈소스를 활용한 Batch_처리_플랫폼_공유
오픈소스를 활용한 Batch_처리_플랫폼_공유
 
Ssl 하드웨어 가속기를 이용한 성능 향상
Ssl 하드웨어 가속기를 이용한 성능 향상Ssl 하드웨어 가속기를 이용한 성능 향상
Ssl 하드웨어 가속기를 이용한 성능 향상
 

Último

MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionKim Daeun
 
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Kim Daeun
 
A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)Tae Young Lee
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스
 
Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Wonjun Hwang
 
Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Wonjun Hwang
 

Último (6)

MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
 
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
 
A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차
 
Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)
 
Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)
 

Jdk(java) 7 - 5. invoke-dynamic

  • 1. JDK 7 출시 기념 (2011.7)JDK 7 소개 #5 invokedynamic 김용환 knight76.tistory.com Knight76 at gmail.com 1
  • 2. 좋은 레퍼런스 http://java.sun.com/developer/technicalArticles/DynTypeLang/index.html http://androidkr.blogspot.com/2010_07_01_archive.html http://cr.openjdk.java.net/~jrose/pres/200906-Cookbook.pdf http://download.oracle.com/javase/7/docs/technotes/guides/vm/multiple-language-support.html Jsr문서 dynamically_typed_lang-jdk7-final-oth-JSpecndex.html
  • 3. For Who JAVA 1.6부터 다른 언어를 지원 (Rhino) 정적 타입 언어 (非 자바)를 jvm에서 안정적이고, 빨리 실행시켜줄 수 있도록 지원 요청
  • 4. Java language / JVM Java language 는 JVM과 다르다. 특징 Java compiler 사람이 write한 java code를 JVM에서 실행가능하도록byte 코드를 생성 HelloWorld.java -> HellowWorld.class Java Virtual Machine byte코드와 class 파일 포맷을 가지고 실행 HellowWorld.class -> 실행 이슈 Java language 이슈가 아닌… 정적 타입 언어를 바로 JVM 상에서 돌아가는 것 자체가 어려움 (interoperability) JVM (java virtual machine)의 실행 속도 이슈! (performance)
  • 5. 기존 사례 Groovy 코드 -> class로 컴파일 -> JVM실행 JRuby코드 -> class로컴파일 (spring의 JRubyScriptUtils.createJRubyObject메소드) -> JVM 실행 단점 JVM에서 돌아갈 수 있도록 작업을 많이 해야 했음. JVM dependent code가 많았음
  • 6. 둘의장점을 이용 Ruby/Python (Dynamic Language) JVM 특징 (고성능, 재활용, JIT, GC, 다양한 OS 지원)
  • 7. But, 이슈 동적언어와 정적 언어 특징 정적 타입 언어(java)는Compile 레벨에서 Type Checking이 엄격하게 이루어짐 동적 타입 언어(dynamic type)는 Type Checking이 Runtime때 실행. 변수는 어떤 타입이든지 상관없음 (javascript, ruby, python..)
  • 8. JVM 이슈 : 메소드 JVM 이슈 : 메소드 동적언어에서는메소드의파라미터 타입을 굳이 알 수 않아도 되지만, JVM은 byte code 명령어들을 이용하기 위해서 method, method안의 클래스 타입, descriptor 형식이 필요 function max (x,y) { if x.lessThan(y) then y else x } 동적언어메소드파라미터의 타입정보가 없는 메소드
  • 9. 구현 타입 정보가 없으면, reflection API를이용해서 java.lang.reflect.Method 클래스를 생성하고, Method 클래스의 invoke 메소드로 호출하는 형태(Proxy) Reflection 호출 자체가 실행속도에 안좋은 영향을 줌. 성능 저하 예) Spring에서는 Proxy 개선 : CGLIB Proxy Reflection 없이 속도 향상!
  • 10. 빠른 속도 Reflection API를 쓰지 않아도 바로 invoke 해 줄 수있고, 속도도 빠른 새로운 API가 필요 JVM 의 invoke 명령어 중 새로운 API를 추가하자!
  • 11. 잠깐.. JVM byte code 공부
  • 12. JVM byte code JVM에서 동작하는 native language (assembly와 비슷) JVM byte code Stack에 작업(push/pop/dup/swap)을 하고, 실행시키는 machanism Operand stack : byte code가 실행할 수 있는 임시용의 stack (cpu의 register stack)
  • 13. JVM byte code의 instruction ldc/const : stack에 값을 push load/store : 로컬 변수 접근 관련 aaload/*aload : array로부터 값을 얻기 iinc : i++ if_icmpge :conditional jump return Invoke virtual : 인터페이스가 아닌 메소드를 호출. (대부분) interface : 인터페이스 메소드를 호출 static : static 호출 special : 생성자와super class 메소드의 구현 메소드를 호출
  • 14. Java ByteCode출력방법 javap –c 클래스이름
  • 15. 예제 String s = "Hello World"; System.out.println(s); java ldc #2 // ‘Hello World’ stack에 저장(push)한다. astore_1 //Stack에서 ‘Hellow World’를 꺼내 로컬변수 1에 저장한다. getstatic#3 //System.out에서 static field인 PrintStream클래스를 꺼낸다. aload_1 // 로컬변수 1에서 가르키는Stirng을 읽는다. invokevirtual #4 // PrintStream의 println을 호출한다. // java/io/PrintStream.println:(Ljava/lang/String;)V jvm
  • 16. JVM invokevirtualinstuction이슈 invokevirtual instruction은 메소드의파라미터의 클래스타입(descriptor)을 반드시 알아야 함 invokevirtual <method-spec> classname, methodname,descriptor com/google/Myclass/myMethod(Ljava/lang/String;)V ----------------------- --------------------- ------------- descriptor classname methodname
  • 17. JVM invokevirtualinstuction예제 Object x; ... x.equals("hello"); java aload_1 ; 로컬 변수 ‘x’를 스택첫번째에 저장 ldc"hello" ; 스택에‘hello’라는 Sting값을 저장 ; ‘equals’ 메소드 호출 ; 스택에 저장되는 값은 Boolgean값(Z) invokevirtual java/lang/Object/equals(Ljava/lang/Object;)Z jvm
  • 19. invokestatic String s = System.getProperty("java.home"); java ldc#2 //String ”java.home”을 stack에 저장 invokestatic#3 //Method java/lang/System.getProperty: // (Ljava/lang/String;)Ljava/lang/String; astore_1 jvm
  • 23. invokevirtual PrintStream out = System.out; out.println("Hello World"); java getstatic #16 astore_1 aload_1 ldc#2 invokevirtual #4 //Method java/io/PrintStream.println: //(Ljava/lang/String;)V jvm
  • 24. invokevirtual 출처 : http://cr.openjdk.java.net/~jrose/pres/200906-Cookbook.pdf
  • 28. invokedynamic function max(x, y) { if (x.lessThan(y)) then y else x } 동적 타입 언어 aload_1; aload_2 invokedynamic#3 // NameAndTypelessThan: // (Ljava/lang/Object;Ljava/lang/Object;)Z if_icmpeq jvm Boolean 리턴타입. Argument는 타입없는object
  • 29. invokedynamic C언어의 함수 포인터와 비슷!
  • 31. JVM 동작 순서 invokedynamic명령어를 실행하기 전에 java.lang.invoke.CallSite를 확인 CallSite가 없다면, 동적 타입 언어의 런타임에서 bootstrap 메소드를 호출 Bootstrap 메소드는CallSite객체를 반환(invokedynamic은 CallSite에 링크됨) invokedynamic은 CallSite에 저장된 java.net.MethodHandle(MH)를 이용해서 메소드 호출 CallSite가 이미 등록된 invokedynamic이 다시 실행되면, 위 과정 없이 바로 메소드 호출(invokedynamic이 구현에 대한 MethodHandle을 한번이라도 사용하면, 그 MethodHandle을 사용)
  • 32. up call 리눅스 low level 이 high level에 있는 함수를 호출하는 것이죠. signal handler 같은 것 JVM JVM의 invokedynamic이 bootstrap 메소드를 호출하는 것
  • 33. 코드 구현 예제 #1 public class HelloWorld { public static void main(String[] args) { //PSEUDOCODE FOR A JVM INSTRUCTION //invokedynamic[#bootstrapDynamic]("Hello World", 2, 3.14); } private static void printArgs(Object... args) { System.out.println(java.util.Arrays.deepToString(args)); } private static MethodHandleprintArgs; static { MethodHandles.Lookuplookup = MethodHandles.lookup(); Class thisClass = lookup.lookupClass(); try { printArgs= lookup.findStatic(thisClass, "printArgs", MethodType.methodType(void.class, Object[].class)); } catch (Exception e) { e.printStackTrace(); } } private staticCallSitebootstrapDynamic(MethodHandles.Lookup caller, String name, MethodType type) { return new ConstantCallSite(printArgs.asType(type)); } }
  • 34. 코드 구현 예제 #2 public class IntegerOps { public static Integer adder(Integer x, Integer y) { return x + y; } } public class Example { public static CallSitemybsm(MethodHandles.LookupcallerClass, String dynMethodName, MethodTypedynMethodType) throws Throwable { MethodHandlemh= callerClass.findStatic(Example.class, "IntegerOps.adder", MethodType.methodType(Integer.class, Integer.class, Integer.class)); if (!dynMethodType.equals(mh.type())) { mh = mh.asType(dynMethodType); } return new ConstantCallSite(mh); } }
  • 35. 코드 구현 예제 #2 InvokeVirtual과 달리 메소드 호출을 위한 클래스 정보가 필요 없다. 대신 길다. Jvmbytecode invokedynamicinvokedynamic REF_invokestatic: Example.mybsm: "(Ljava/lang/invoke/MethodHandles/Lookup; Ljava/lang/String; Ljava/lang/invoke/MethodType;) Ljava/lang/invoke/CallSite;": +: "(Ljava/lang/Integer; Ljava/lang/Integer;) Ljava/lang/Integer;";
  • 36. 코드 구현 예제 #2 invokedynamicinvokedynamic REF_invokestatic: Example.mybsm: "(Ljava/lang/invoke/MethodHandles/Lookup; Ljava/lang/String; Ljava/lang/invoke/MethodType;) Ljava/lang/invoke/CallSite;": +: "(Ljava/lang/Integer; Ljava/lang/Integer;) Ljava/lang/Integer;"; bootstrap 메소드가addr static 메소드를 호출 1 2 Bootstrap의 Full Qualified name인 Example.mybsm 3 bootstrap 메소드가addr static 메소드를 호출
  • 37. API java.lang.invoke..MethodHandle (MH) JVM 메소드에 대한 anonymous reference 을 가지고 있음 MethodHandles.Lookup factory for creating method handles java.lang.invoke.CallSite MethodHandler변수를 가지고 있는 Holder ConstantCallSite, MutableCallSite BootstrapMethodError invokedynamic호출후bootstrap 메소드을못찾거나Call site을 리턴하지 못하면 에러 발생
  • 40. JSR 292 JRuby팀과협업 enhanced bytecode + a new API invokedynamic java.lang.invoke MethodHandle(일종의 함수 포인터) Combinators provide adhoc classes: ClassValue(캐쉬), SwitchPoint (상태확인)
  • 43. JRuby실전 테스트 jruby에서 jvm버전을 변경하고 싶을 때는 JAVA_HOME을 변경하면 된다. (따로 properties 설정은 없다.) C:ruby-1.6.3-without-jvmin>jruby.exe -v jruby 1.6.3 (ruby-1.8.7-p330) (2011-07-07 965162f) (Java HotSpot(TM) Client VM 1.7.0) [Windows 7-x86-java] C:ruby-1.6.3-without-jvmin>java -classpath.;jruby.jar a.JRubyExample num: 6 C:ruby-1.6.3-without-jvmin>
  • 44. JRuby실전 테스트 myruby.rb def max(a,b) if a < b b else a end end defgetMax(number1, number2) f = max(number1, number2) return f end
  • 45. JRuby실전 테스트 a.JRubyExample.java public static void main(String[] args) throws Exception { ScriptEnginejruby = new ScriptEngineManager().getEngineByName("jruby"); jruby.eval(new BufferedReader(new FileReader("myruby.rb"))); jruby.put("number1", 6); jruby.put("number2", 9); long num = (Long) jruby.eval("getMax($number1, $number1)"); System.out.println("num: " + num); }
  • 46. JRuby실전 테스트 C:ruby-1.6.3-without-jvmin>jrubyc.bat myruby.rb public static org.jruby.runtime.builtin.IRubyObject method__0$RUBY$max(myruby, org.jruby.runtime.ThreadContext, org.jruby.runtime.builtin.IRubyObject, org.jru by.runtime.builtin.IRubyObject, org.jruby.runtime.builtin.IRubyObject, org.jruby .runtime.Block); Code: 0: aload_3 1: astore 10 3: aload 4 5: astore 11 7: aload_0 8: invokevirtual #33 // Method getCallSite0:()Lorg/jruby/ runtime/CallSite; 11: aload_1 12: aload_2 13: aload 10 15: aload 11 17: invokevirtual #39 // Method org/jruby/runtime/CallSite .call:(Lorg/jruby/runtime/ThreadContext;Lorg/jruby/runtime/builtin/IRubyObject;L org/jruby/runtime/builtin/IRubyObject;Lorg/jruby/runtime/builtin/IRubyObject;)Lo rg/jruby/runtime/builtin/IRubyObject; 20: invokeinterface #45, 1 // InterfaceMethod org/jruby/runtime /builtin/IRubyObject.isTrue:()Z 25: ifeq 33 28: aload 11 30: goto 35 33: aload 10 35: areturn 비슷한 구현이 이미 되어 있음
  • 48. 정리 Jruby 1.6.3까지는 invokedynamic사용하지 않음. (invokedynamic테스트 버전은 따로 있음.) 대신 내부적으로 invokedynamic비슷한 구현을 이미 하고 있음 Groovy Jruby처럼 내부적으로는 invokedynamic비슷한 구현 함 앞으로 많은 언어들이 쓸 수 있도록 배려했고, 비슷하게 구현한 것들은 조금 더 빠른 속도가 날 수 있으며, 더 많은 언어들이 이 기능을 사용할 수 있음