Más contenido relacionado La actualidad más candente (20) Similar a SpringとGrarlVM Native Image -2019/12- (20) Más de Takuya Iwatsuka (13) SpringとGrarlVM Native Image -2019/12-2. •
• NTT 2
• Software Engineering, Computer Science
• Spring
– JSUG
– (Spring I/O) (SpringOne) 2 5
–
– Spring
3. • Native Image
– Native Image
• 3
– Native Image
• Spring Native Image
– Spring Native Image
2019/12
5. GraalVM Native Image
GraalVM Native Image allows you to ahead-of-time compile Java
code to a standalone executable, called a native image.
https://graalvm.org/docs/reference-manual/native-image
• Java JVM
• 5 5
– linux : .so
– macOS : .dylib
– Windows : .dll
2019 12 Early Adopter Technology
$ javac Hello.java
$ native-image -cp . Hello
$ ./hello
Hello world!
9. Native Image –
import org.graalvm.nativeimage.IsolateThread;
import org.graalvm.nativeimage.c.function.CEntryPoint;
public class Shared{
@CEntryPoint(name="increment")
public static int increment(IsolateThread thread, int num){
return num+1;
}
}
$ ls
Shared.class Shared.java libincrement.dylib libincrement.h
libincrement_dynamic.h graal_isolate.h graal_isolate_dynamic.h
Native Image
#include<libincrement>
C
10. Native Image
JVM
• JIT
• AOT *
* GraalVM Enterprise Edition Profile-guided Optimizations 0
AdoptOpenJDK 11.0.5 Native Image (GraalVM EE 19.3.0)
https://nowokay.hatenablog.com/entry/2019/06/27/045352
(GraalVM 1 – Hatena)
14. 1 4 4 …
• 4
• Java1
• JVM
AOT
!
15. Closed-World Assumption
To be able to build a highly optimized native executable, we run an
aggressive static analysis that requires a closed-world assumption, …
https://graalvm.org/docs/reference-manual/native-image
Closed-World Assumption
5 1 1
24. 4 4 4
Class Method 4
2
2 4 4
→ “ReflectTarget” (“getMessage()”)
Class[] classes = new Class[0];
String message =
(String)Class.forName("ReflectTarget")
.getMethod("getMessage",classes)
.invoke(null);
25. [
{
"name" : "java.lang.Class",
"allDeclaredConstructors" : true,
"allPublicConstructors" : true,
"allDeclaredMethods" : true,
"allPublicMethods" : true,
"allDeclaredClasses" : true,
"allPublicClasses" : true
},
{
"name" : "java.lang.String",
"fields" : [
{ "name" : "value", "allowWrite" : true },
{ "name" : "hash" }
],
2 2
2 2
2
-H:ReflectionConfigurationFiles json 5
27. 2 2 7
→ 2 2
-H:DynamicProxyConfigurationFiles json
[
["java.lang.AutoCloseable", "java.util.Comparator"],
["java.util.Comparator"],
["java.util.List"]
]
7
28. static
8 8
public class Hoge{
static {
…
}
Native Image
static 8Native Image 8
Native Image
1. Native Image 8
2. *
2 8
* --initialize-at-run-time= xxx.yyy.Hoge, …
3. 2. 8
2 8
29. Class / ClassLoader jar
Hoge.class
.getClassLoader()
.getResource("fuga.txt");
2 Native Image
getResource null
-H:ResourceConfigurationFiles 9 json
"resources": [
{"pattern": ”hoge/.*"},
{"pattern": ”path/to/class/Hoge.class"},
…
36. Spring 3 Native Image
Spring Feature
Spring Feature
https://github.com/spring-projects-experimental/spring-graal-native
Experimental
4 6
• Reflection Handler
• Dynamic Proxy Handler
• Initialization Handler
• Resource Handler
37. Spring
1. Native Image Generator 7 3
2. Handler
Reflection Handler
reflect.json
Spring Feature
…
{
"name":
"org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator",
"allDeclaredConstructors": true,
"allDeclaredMethods": true
},
…
38. Dynamic Proxy Handler
Spring
1. Native Image Generator
8 3
2. Handler 8
3
proxies.json
Spring Feature 3 8
[
…
["org.springframework.web.bind.annotation.RequestMapping"],
["org.springframework.web.bind.annotation.ResponseStatus"],
["org.springframework.web.bind.annotation.RequestBody"],
…
]
8
8 3
3
39. Initialization Handler
Spring
Native Image Generator 9 3 3
initialization.json
Spring Feature 3
{
"runtimeInitialization":
[
…
{"package": "io.netty.handler.codec.http2"},
{"class": "reactor.netty.tcp.TcpClientSecure"},
…
],
"buildTimeInitialization":
[
{"package": "org.springframework.core.env"},
{"class": "org.springframework.util.unit.DataUnit"},
…
40. Resource Handler
Spring
1. Native Image Generator 4
0
2. spring.factories
3. spring.components
resources.json
Spring Feature 04
{
"resources": [
{"pattern": "db/.*"},
{"pattern": "messages/.*"},
{"pattern": "static/.*"},
{"pattern": "templates/.*"},
…
Spring Boot 4
41. Resource Handler spring.factories
spring.factories
Spring Boot 4 Auto Configuration 1
# Auto Configuration Import Filters
org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=¥
org.springframework.boot.autoconfigure.condition.OnBeanCondition,¥
org.springframework.boot.autoconfigure.condition.OnClassCondition,¥
org.springframework.boot.autoconfigure.condition.OnWebApplicationCondition
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=¥
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,¥
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,¥
• spring.factories Reflection Handler
• spring.factories Auto Configuration
•
Auto Configuration spring.factories
Resource Handler
42. Resource Handler spring.components
spring.components
Spring-Context-Indexer 4
• spring.components 2
spring.components
• spring.components Reflection Handler
• spring.components Dynamic Proxy Handler
2 4
Resource Handler
com.example.commandlinerunner.CLR=org.springframework.stereotype.Component
com.example.commandlinerunner.CommandlinerunnerApplication=org.springframework.stereotype.Component
45. • Native Image 4
• Spring Java
• Spring Native
Image 5
– Spring Framework 5.3