عبور القنفذ مع القنفذ: OpenJDK-11 + GraalVM

مرحبا يا هبر! في ضوء الأخبار غير الحديثة المتعلقة بسياسة أوراكل فيما يتعلق بترخيص Java ، أصبحت مشكلة الانتقال من إصدارات Oracle إلى OpenJDK أكثر حدة. منذ فترة طويلة يقوم Odanko في OracleLabs بعمل رائع جدًا يسمى GraalVM ، وهو برنامج مترجم JIT رائع مكتوب بلغة Java ، بالإضافة إلى وقت تشغيل لتشغيل التعليمات البرمجية بلغات مثل JavaScript و Ruby و Python و C و C ++ و Scala و Kotlin و ص ، كلوجور. مثير للإعجاب ، أليس كذلك؟ ولكن ليس عن برودة بيئة العمل المتعدد اللغات ، أريد أن أخبرك. سوف نتحدث عن صعوبات الجمع بين أحدث مجموعة من الكأس في نظام OpenJDK 11 ، وقليلا عن الأداء ، إلى حد ما ...

كان أول كلمة


بدأت قصة معرفتي مع graalvm على الجوكر في عام 2017. هناك تحدث كريس سيتون بتفصيل كبير عن المترجم الداخلي وأظهر سحر تجميع AOT باستخدام الصورة الأصلية من تسليم الكأس كمثال (هذه مزحة تجمع كود جافا الخاص بك إلى ثنائي أصلي).

بعد ذلك التقرير ، تدربت لفترة طويلة على تجميع الثنائي الأصلي لمشروعي للحيوانات الأليفة ، ووضع عكاكين وأشعلات من أجل كسب التأمل في جميع الأماكن (سواء كان ذلك غير مقبول!) وأخيراً عثرت على مشاكل لم يتم حلها مع IO (شيء ما هناك لم تقلع مع حارس حديقة ، والآن لا أتذكر ماذا). بصق بينما على الصورة الأصلية :-(

عام 2018 ، كل نفس مهرج ونفس graalvm في تقرير مفصل للغاية من أوليغ شيلاييف حول AOT.

في التقارير والعروض التقديمية ، يبدو كل شيء رائعًا للغاية ، وهناك أيضًا مشروع للحيوانات الأليفة يقع على القرص ... لقد حان الوقت للكشف عن الجهاز ، والتأرجح عن مرشح جديد لإطلاق الكأس والدخول في معركة! سوف نلمس جيت.

مرحبا العالم


لمس وركل القليل من JIT الجديد (في وقت كتابة هذا المقال هو الإصدار ce-1.0.0-rc14 ) ، سوف نستخدم جزءًا من الكود لاختبار الأداء من الموقع https://graalvm.org كمثال - مثالنا الأول.

ما مشروع java (حتى Hello World ) الذي يقوم به دون أي نظام بناء؟ هذا صحيح ، فقط تلك التي تتعلم javac طهيها. Javak نحن لن ندرس لطهي الطعام ، دع maven steers javak.

حتى تلبية pom.xml:

pom.xml
<?xml version="1.0"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany.app</groupId> <artifactId>my-app</artifactId> <!--<packaging>jar</packaging>--> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>my-app</name> <url>http://maven.apache.org</url> <properties> <java.version>11</java.version> <graalvm.version>1.0.0-rc14</graalvm.version> </properties> <profiles> <profile> <id>jdk11</id> <activation> <jdk>11</jdk> </activation> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>2.10</version> <executions> <execution> <id>copy</id> <phase>process-test-classes</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/lib</outputDirectory> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifest> <mainClass>com.mycompany.app.App</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build> </profile> </profiles> <build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> <configuration> <release>${java.version}</release> </configuration> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>org.graalvm.compiler</groupId> <artifactId>compiler</artifactId> <version>${graalvm.version}</version> </dependency> <dependency> <groupId>org.graalvm.truffle</groupId> <artifactId>truffle-api</artifactId> <version>${graalvm.version}</version> </dependency> <dependency> <groupId>org.graalvm.sdk</groupId> <artifactId>graal-sdk</artifactId> <version>${graalvm.version}</version> </dependency> <dependency> <groupId>org.graalvm.js</groupId> <artifactId>js</artifactId> <version>${graalvm.version}</version> </dependency> <dependency> <groupId>org.graalvm.js</groupId> <artifactId>js-scriptengine</artifactId> <version>${graalvm.version}</version> </dependency> </dependencies> </project> 


تبدو بنية ملف المشروع كما يلي:



كود فئة com.mycompany.app.App (مثال على نسخة معجون من graalvm.org):

App.java
  package com.mycompany.app; public class App { static final int ITERATIONS = Math.max(Integer.getInteger("iterations", 1), 1); public static void main(String[] args) { String sentence = String.join(" ", args); for (int iter = 0; iter < ITERATIONS; iter++) { if (ITERATIONS != 1) System.out.println("-- iteration " + (iter + 1) + " --"); long total = 0, start = System.currentTimeMillis(), last = start; for (int i = 1; i < 10_000_000; i++) { total += sentence.chars().filter(Character::isUpperCase).count(); if (i % 1_000_000 == 0) { long now = System.currentTimeMillis(); System.out.printf("%d (%d ms)%n", i / 1_000_000, now - last); last = now; } } System.out.printf("total: %d (%d ms)%n", total, System.currentTimeMillis() - start); } } } 


الوحدة النمطية للكود - info.java :

module-info.java
  module com.mycompany.app {} 


حسنًا ، فارغ ... لكن هذا فارغ لأنني أريد أن أوضح لك كيف ستقسم جافا المخصصة (حول جافا المخصصة لاحقًا) بوحدات غير معلنة يحتاجها تطبيقنا.

أول فطيرة ...


ليس العقدي. دعونا تجميع مشروعنا وإطلاقه. وضعه بهذه الطريقة:

 mvn clean package 


نطلق:

 $JAVA_HOME/bin/java -XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler -Diterations=10 -jar target/my-app-1.0-SNAPSHOT.jar In 2017 I would like to run ALL languages in one VM. 

هناك نقطتان مهمتان هنا: JVMCI شيء تجريبي ظهر في Java منذ الإصدار 9 ، لذلك نحن بحاجة إلى:

  • تمكين خيارات الجهاز الظاهري التجريبية -
      -XX: + UnlockEperimentalVMOptions 
  • تمكين الجهاز الظاهري التجريبي للغاية (بدءًا من تسعة ، الكأس في openjdk ، وليس الإصدار الأحدث ، ولكن لا يزال) - XXX: + UseJVMCICompiler

نتيجة إطلاق
- التكرار 1 - 1 (1466 مللي ثانية)
2 (461 مللي ثانية)
3 (463 مللي ثانية)
4 (138 مللي ثانية)
5 (151 مللي ثانية)
6 (159 مللي ثانية)
7 (266 مللي ثانية)
8 (128 مللي ثانية)
9 (144 مللي ثانية)
المجموع: 69999993 (3481 مللي ثانية)
- التكرار 2 - 1 (233 مللي ثانية)
2 (169 مللي ثانية)
3 (121 مللي ثانية)
4 (205 مللي ثانية)
5 (170 مللي ثانية)
6 (152 مللي ثانية)
7 (227 مللي ثانية)
8 (158 مللي ثانية)
9 (108 مللي ثانية)
المجموع: 69999993 (1644 مللي ثانية)
- التكرار 3 - 1 (98 مللي ثانية)
2 (102 مللي ثانية)
3 (98 مللي ثانية)
4 (102 مللي ثانية)
5 (95 مللي ثانية)
6 (96 مللي ثانية)
7 (101 مللي ثانية)
8 (95 مللي ثانية)
9 (97 مللي ثانية)
المجموع: 69999993 (990 مللي ثانية)
- التكرار 4 - 1 (109 مللي ثانية)
2 (114 مللي ثانية)
3 (97 مللي ثانية)
4 (98 مللي ثانية)
5 (100 مللي ثانية)
6 (103 مللي ثانية)
7 (125 مللي ثانية)
8 (108 مللي ثانية)
9 (100 مللي ثانية)
المجموع: 69999993 (1056 مللي ثانية)
- التكرار 5 - 1 (98 مللي ثانية)
2 (100 مللي ثانية)
3 (105 مللي ثانية)
4 (97 مللي ثانية)
5 (95 مللي ثانية)
6 (99 مللي ثانية)
7 (95 مللي ثانية)
8 (123 مللي ثانية)
9 (98 مللي ثانية)
المجموع: 69999993 (1010 مللي ثانية)
- التكرار 6 - 1 (99 مللي ثانية)
2 (95 مللي ثانية)
3 (102 مللي ثانية)
4 (99 مللي ثانية)
5 (96 مللي ثانية)
6 (100 مللي ثانية)
7 (99 مللي ثانية)
8 (99 مللي ثانية)
9 (104 مللي ثانية)
المجموع: 69999993 (993 مللي ثانية)
- التكرار 7 - 1 (100 مللي ثانية)
2 (104 مللي ثانية)
3 (95 مللي ثانية)
4 (96 مللي ثانية)
5 (97 مللي ثانية)
6 (95 مللي ثانية)
7 (94 مللي ثانية)
8 (108 مللي ثانية)
9 (108 مللي ثانية)
المجموع: 69999993 (1000 مللي ثانية)
- التكرار 8 - 1 (100 مللي ثانية)
2 (106 مللي ثانية)
3 (99 مللي ثانية)
4 (95 مللي ثانية)
5 (97 مللي ثانية)
6 (97 مللي ثانية)
7 (101 مللي ثانية)
8 (99 مللي ثانية)
9 (101 مللي ثانية)
المجموع: 69999993 (1012 مللي ثانية)
- التكرار 9 - 1 (105 مللي ثانية)
2 (97 مللي ثانية)
3 (98 مللي ثانية)
4 (96 مللي ثانية)
5 (99 مللي ثانية)
6 (96 مللي ثانية)
7 (94 مللي ثانية)
8 (98 مللي ثانية)
9 (105 مللي ثانية)
المجموع: 69999993 (993 مللي ثانية)
- التكرار 10 - 1 (107 مللي ثانية)
2 (98 مللي ثانية)
3 (99 مللي ثانية)
4 (100 مللي ثانية)
5 (97 مللي ثانية)
6 (101 مللي ثانية)
7 (98 مللي ثانية)
8 (103 مللي ثانية)
9 (105 مللي ثانية)
المجموع: 69999993 (1006 مللي ثانية)

ماذا نرى هنا؟ ونحن نرى أن التكرار الأول هو الأطول (3.5 ثانية) ، وهذا JIT يسخن. ثم يصبح كل شيء أكثر سلاسة (خلال ثانية واحدة).

ولكن ماذا لو أعطينا جافا نسخة جديدة من الكأس؟ لم يقل ما قال من فعل:

 java -XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler -Diterations=10 --module-path=target/lib --upgrade-module-path=target/lib/compiler-1.0.0-rc14.jar -jar target/my-app-1.0-SNAPSHOT.jar In 2017 I would like to run ALL languages in one VM. 

نتيجة إطلاق الكأس الطازج
- التكرار 1 - 1 (1789 مللي ثانية)
2 (547 مللي ثانية)
3 (313 مللي ثانية)
4 (87 مللي ثانية)
5 (88 مللي ثانية)
6 (87 مللي ثانية)
7 (83 مللي ثانية)
8 (92 مللي ثانية)
9 (87 مللي ثانية)
المجموع: 69999993 (3259 مللي ثانية)
- التكرار 2 - 1 (241 مللي ثانية)
2 (161 مللي ثانية)
3 (152 مللي ثانية)
4 (195 مللي ثانية)
5 (136 مللي ثانية)
6 (129 مللي ثانية)
7 (154 مللي ثانية)
8 (176 مللي ثانية)
9 (109 مللي ثانية)
المجموع: 69999993 (1553 مللي ثانية)
- التكرار 3 - 1 (109 مللي ثانية)
2 (103 مللي ثانية)
3 (113 مللي ثانية)
4 (172 مللي ثانية)
5 (141 مللي ثانية)
6 (148 مللي ثانية)
7 (111 مللي ثانية)
8 (102 مللي ثانية)
9 (101 مللي ثانية)
المجموع: 69999993 (1211 مللي ثانية)
- التكرار 4 - 1 (96 مللي ثانية)
2 (96 مللي ثانية)
3 (104 مللي ثانية)
4 (98 مللي ثانية)
5 (96 مللي ثانية)
6 (97 مللي ثانية)
7 (98 مللي ثانية)
8 (96 مللي ثانية)
9 (95 مللي ثانية)
المجموع: 69999993 (972 مللي ثانية)
- التكرار 5 - 1 (97 مللي ثانية)
2 (93 مللي ثانية)
3 (99 مللي ثانية)
4 (97 مللي ثانية)
5 (97 مللي ثانية)
6 (97 مللي ثانية)
7 (95 مللي ثانية)
8 (98 مللي ثانية)
9 (94 مللي ثانية)
المجموع: 69999993 (965 مللي ثانية)
- التكرار 6 - 1 (96 مللي ثانية)
2 (95 مللي ثانية)
3 (96 مللي ثانية)
4 (99 مللي ثانية)
5 (102 مللي ثانية)
6 (94 مللي ثانية)
7 (99 مللي ثانية)
8 (115 مللي ثانية)
9 (109 مللي ثانية)
المجموع: 69999993 (1001 مللي ثانية)
- التكرار 7 - 1 (98 مللي ثانية)
2 (96 مللي ثانية)
3 (99 مللي ثانية)
4 (98 مللي ثانية)
5 (118 مللي ثانية)
6 (98 مللي ثانية)
7 (95 مللي ثانية)
8 (99 مللي ثانية)
9 (116 مللي ثانية)
المجموع: 69999993 (1017 مللي ثانية)
- التكرار 8 - 1 (95 مللي ثانية)
2 (99 مللي ثانية)
3 (99 مللي ثانية)
4 (106 مللي ثانية)
5 (101 مللي ثانية)
6 (101 مللي ثانية)
7 (93 مللي ثانية)
8 (97 مللي ثانية)
9 (108 مللي ثانية)
المجموع: 69999993 (993 مللي ثانية)
- التكرار 9 - 1 (102 مللي ثانية)
2 (95 مللي ثانية)
3 (97 مللي ثانية)
4 (125 مللي ثانية)
5 (94 مللي ثانية)
6 (101 مللي ثانية)
7 (100 مللي ثانية)
8 (95 مللي ثانية)
9 (96 مللي ثانية)
المجموع: 69999993 (1008 مللي ثانية)
- التكرار 10 - 1 (97 مللي ثانية)
2 (97 مللي ثانية)
3 (99 مللي ثانية)
4 (112 مللي ثانية)
5 (102 مللي ثانية)
6 (96 مللي ثانية)
7 (96 مللي ثانية)
8 (98 مللي ثانية)
9 (96 مللي ثانية)
المجموع: 69999993 (988 مللي ثانية)

النتيجة ، كما نرى ، لا تختلف كثيرا.

لقد نسيت. حسنًا ، لم نحاول تشغيل نفس الشيء بدون برنامج التحويل البرمجي الجديد JIT. سنفعل:

 java -Diterations=10 -jar target/my-app-1.0-SNAPSHOT.jar In 2017 I would like to run ALL languages in one VM. 

النتيجة دون مترجم JIT newfangled
- التكرار 1 - 1 (372 مللي ثانية)
2 (271 مللي ثانية)
3 (337 مللي ثانية)
4 (391 مللي ثانية)
5 (328 مللي ثانية)
6 (273 مللي ثانية)
7 (239 مللي ثانية)
8 (271 مللي ثانية)
9 (250 مللي ثانية)
المجموع: 69999993 (2978 مللي ثانية)
- التكرار 2 - 1 (242 مللي ثانية)
2 (253 مللي ثانية)
3 (253 مللي ثانية)
4 (240 مللي ثانية)
5 (245 مللي ثانية)
6 (275 مللي ثانية)
7 (273 مللي ثانية)
8 (263 مللي ثانية)
9 (234 مللي ثانية)
المجموع: 69999993 (2533 مللي ثانية)
- التكرار 3 - 1 (237 مللي ثانية)
2 (235 مللي ثانية)
3 (234 مللي ثانية)
4 (246 مللي ثانية)
5 (242 مللي ثانية)
6 (238 مللي ثانية)
7 (244 مللي ثانية)
8 (243 مللي ثانية)
9 (253 مللي ثانية)
المجموع: 69999993 (2414 مللي ثانية)
- التكرار 4 - 1 (244 مللي ثانية)
2 (249 مللي ثانية)
3 (245 مللي ثانية)
4 (243 مللي ثانية)
5 (232 مللي ثانية)
6 (256 مللي ثانية)
7 (321 مللي ثانية)
8 (303 مللي ثانية)
9 (249 مللي ثانية)
المجموع: 69999993 (2599 مللي ثانية)
- التكرار 5 - 1 (246 مللي ثانية)
2 (242 مللي ثانية)
3 (248 مللي ثانية)
4 (256 مللي ثانية)
5 (280 مللي ثانية)
6 (233 مللي ثانية)
7 (235 مللي ثانية)
8 (266 مللي ثانية)
9 (246 مللي ثانية)
المجموع: 69999993 (2511 مللي ثانية)
- التكرار 6 - 1 (292 مللي ثانية)
2 (368 مللي ثانية)
3 (339 مللي ثانية)
4 (251 مللي ثانية)
5 (267 مللي ثانية)
6 (259 مللي ثانية)
7 (289 مللي ثانية)
8 (262 مللي ثانية)
9 (357 مللي ثانية)
المجموع: 69999993 (3058 مللي ثانية)
- التكرار 7 - 1 (284 مللي ثانية)
2 (258 مللي ثانية)
3 (248 مللي ثانية)
4 (247 مللي ثانية)
5 (266 مللي ثانية)
6 (247 مللي ثانية)
7 (242 مللي ثانية)
8 (314 مللي ثانية)
9 (265 مللي ثانية)
المجموع: 69999993 (2656 مللي ثانية)
- التكرار 8 - 1 (239 مللي ثانية)
2 (238 مللي ثانية)
3 (257 مللي ثانية)
4 (282 مللي ثانية)
5 (244 مللي ثانية)
6 (261 مللي ثانية)
7 (253 مللي ثانية)
8 (295 مللي ثانية)
9 (256 مللي ثانية)
المجموع: 69999993 (2575 مللي ثانية)
- التكرار 9 - 1 (273 مللي ثانية)
2 (243 مللي ثانية)
3 (239 مللي ثانية)
4 (240 مللي ثانية)
5 (250 مللي ثانية)
6 (285 مللي ثانية)
7 (266 مللي ثانية)
8 (285 مللي ثانية)
9 (264 مللي ثانية)
المجموع: 69999993 (2617 مللي ثانية)
- التكرار 10 - 1 (245 مللي ثانية)
2 (264 مللي ثانية)
3 (258 مللي ثانية)
4 (253 مللي ثانية)
5 (239 مللي ثانية)
6 (260 مللي ثانية)
7 (251 مللي ثانية)
8 (250 مللي ثانية)
9 (256 مللي ثانية)
المجموع: 69999993 (2538 مللي ثانية)

والنتيجة مختلفة وكريمة.

لا يوفر C2 أي تحسينات في أجزاء التعليمات البرمجية الساخنة - كل التكرار في نفس الوقت.

Graal قادر على تحسين القطع الساخنة من التعليمات البرمجية وعلى المدى الطويل يعطي دفعة جيدة للأداء.

ماذا بعد؟


ربما يكون هذا هو السؤال الرئيسي الذي تحتاج إلى طرحه على نفسك والآخرين (أعضاء الفريق) عندما نريد إضافة ميزة جديدة إلى المشروع ، أو أداة جديدة ، أو جهاز افتراضي جديد ، أو JIT جديد ...

قصتي ، كما هو موضح أعلاه ، بدأت مع Joker 2017 ، ثم كانت هناك محاولات طويلة لإتقان AOT ، والآن أتذوق روائع JIT لـ Java في Java.

يعد مشروع الحيوانات الأليفة الموجود على القرص نوعًا من محرك العمليات التجارية ، حيث يتم رسم العمليات بواسطة مطوري التطبيقات في واجهة المستخدم الخاصة بالمتصفح ، ولهم القدرة على كتابة البرامج النصية في JS والتي سيتم تشغيلها على JVM.

في الإصدارات المستقبلية من Java يعدون بإزالة nashorn ، تقترب GraalVM تدريجياً من الإصدار ...

حسنًا ، إجابة السؤال هي:

  1. نريد وقت تشغيل لتشغيل JS (وليس فقط)
  2. تريد سرعة جيت
  3. نريد أن يظهر إطلاق تطبيقات المشاريع للحيوانات الأليفة كما كان من قبل في 8-ke (بدون أي
      --module مسار 
    و
      --upgrade وحدة مسار 
    ولكن مع مجموعة الكأس الطازجة)

JLINK


أول نقطتين في قائمة الإجابات على السؤال أعلاه واضحة بما يكفي ، دعنا نتعامل مع الأخير.

والحقيقة هي أن المطورين - مدراء - devops كسولون ولا يرغبون في القيام بعمل إضافي (أنا أحب ذلك أيضًا) ، فهم يحاولون أتمتة كل شيء وتعبئته في حزمة جاهزة يمكن تشغيلها باعتبارها ثنائيات بسيطة. حسنًا ، هناك مشكلة ، دعنا نحلها.

هناك أداة جديدة نسبيًا من عالم Java 9+ تأتي لمساعدتنا ، واسمها jlink . نحن نحاول حزم طلبنا مع جميع libs اللازمة في حزمة:

 jlink --module-path target/classes:target/lib:$JAVA_HOME/jmods --add-modules com.mycompany.app --launcher app=com.mycompany.app/com.mycompany.app.App --compress 2 --no-header-files --no-man-pages --strip-debug --output test 

كم عدد المعلمات من جميع الأنواع ، نحن تصف أهمها:
  •   - الفئات / مسارات المسار المستهدف: الهدف / lib: $ JAVA_HOME / jmods 
  •   - إضافة وحدات com.mycompany.app 
  •   --launcher app = com.mycompany.app / com.mycompany.app.App 
  •   - اختبار الإخراج 

يمكنك أن تسأل عم Google عن المعلمات الأخرى ، وكلها تهدف إلى تقليل الحجم الإجمالي للحزمة.

لنلقِ نظرة على النتيجة:



يوجد داخل التطبيق test / bin / app برنامج نصي بسيط يقوم بتشغيل تطبيقنا على Java بجوار التطبيق:

 #!/bin/sh JLINK_VM_OPTIONS="-Diterations=10" #     ,       DIR=`dirname $0` $DIR/java $JLINK_VM_OPTIONS -m com.mycompany.app/com.mycompany.app.App $@ 

تشغيل اختبار / bin / التطبيق على C2:

 ./test/bin/app In 2017 I would like to run ALL languages in one VM. 

يؤدي
- التكرار 1 - 1 (315 مللي ثانية)
2 (231 مللي ثانية)
3 (214 مللي ثانية)
4 (297 مللي ثانية)
5 (257 مللي ثانية)
6 (211 مللي ثانية)
7 (217 مللي ثانية)
8 (245 مللي ثانية)
9 (222 مللي ثانية)
المجموع: 69999993 (2424 مللي ثانية)
- التكرار 2 - 1 (215 مللي ثانية)
2 (215 مللي ثانية)
3 (223 مللي ثانية)
4 (224 مللي ثانية)
5 (217 مللي ثانية)
6 (208 مللي ثانية)
7 (208 مللي ثانية)
8 (222 مللي ثانية)
9 (222 مللي ثانية)
المجموع: 69999993 (2164 مللي ثانية)
- التكرار 3 - 1 (206 مللي ثانية)
2 (226 مللي ثانية)
3 (234 مللي ثانية)
4 (211 مللي ثانية)
5 (212 مللي ثانية)
6 (213 مللي ثانية)
7 (210 مللي ثانية)
8 (245 مللي ثانية)
9 (223 مللي ثانية)
المجموع: 69999993 (2216 مللي ثانية)
- التكرار 4 - 1 (222 مللي ثانية)
2 (233 مللي ثانية)
3 (220 مللي ثانية)
4 (222 مللي ثانية)
5 (221 مللي ثانية)
6 (219 مللي ثانية)
7 (222 مللي ثانية)
8 (216 مللي ثانية)
9 (220 مللي ثانية)
المجموع: 69999993 (2215 مللي ثانية)
- التكرار 5 - 1 (231 مللي ثانية)
2 (230 مللي ثانية)
3 (221 مللي ثانية)
4 (226 مللي ثانية)
5 (227 مللي ثانية)
6 (223 مللي ثانية)
7 (215 مللي ثانية)
8 (216 مللي ثانية)
9 (219 مللي ثانية)
المجموع: 69999993 (2234 مللي ثانية)
- التكرار 6 - 1 (227 مللي ثانية)
2 (218 مللي ثانية)
3 (221 مللي ثانية)
4 (254 مللي ثانية)
5 (222 مللي ثانية)
6 (212 مللي ثانية)
7 (214 مللي ثانية)
8 (222 مللي ثانية)
9 (222 مللي ثانية)
المجموع: 69999993 (2241 مللي ثانية)
- التكرار 7 - 1 (217 مللي ثانية)
2 (225 مللي ثانية)
3 (222 مللي ثانية)
4 (223 مللي ثانية)
5 (227 مللي ثانية)
6 (221 مللي ثانية)
7 (219 مللي ثانية)
8 (226 مللي ثانية)
9 (219 مللي ثانية)
المجموع: 69999993 (2217 مللي ثانية)
- التكرار 8 - 1 (218 مللي ثانية)
2 (242 مللي ثانية)
3 (219 مللي ثانية)
4 (218 مللي ثانية)
5 (224 مللي ثانية)
6 (226 مللي ثانية)
7 (223 مللي ثانية)
8 (220 مللي ثانية)
9 (219 مللي ثانية)
المجموع: 69999993 (2228 مللي ثانية)
- التكرار 9 - 1 (234 مللي ثانية)
2 (218 مللي ثانية)
3 (217 مللي ثانية)
4 (217 مللي ثانية)
5 (225 مللي ثانية)
6 (222 مللي ثانية)
7 (216 مللي ثانية)
8 (226 مللي ثانية)
9 (214 مللي ثانية)
المجموع: 69999993 (2212 مللي ثانية)
- التكرار 10 - 1 (226 مللي ثانية)
2 (230 مللي ثانية)
3 (215 مللي ثانية)
4 (238 مللي ثانية)
5 (225 مللي ثانية)
6 (218 مللي ثانية)
7 (218 مللي ثانية)
8 (215 مللي ثانية)
9 (228 مللي ثانية)
المجموع: 69999993 (2233 مللي ثانية)

الآن على graalvm (من خلال تحديد العلامات اللازمة لتشغيلها في متغير JLINK_VM_OPTIONS ):

اختبار / بن / التطبيق
 #!/bin/sh JLINK_VM_OPTIONS="-XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler -Diterations=10" DIR=`dirname $0` $DIR/java $JLINK_VM_OPTIONS -m com.mycompany.app/com.mycompany.app.App $@ 


النتيجة:

 Error occurred during initialization of boot layer java.lang.module.FindException: Module jdk.internal.vm.ci not found 

حسنًا ، لقد وصلنا ... والآن تذكر أننا نعمل مع java 11 في بيئة معيارية ، فنحن بصدد إنشاء التطبيق كوحدة نمطية ، لكننا لم نخبر أحداً عن الوحدات المستخدمة. حان الوقت لإصلاحها.

نسخة جديدة من module-info.java:

 module com.mycompany.app { requires jdk.internal.vm.compiler; requires org.graalvm.sdk; requires org.graalvm.truffle; requires transitive org.graalvm.js; requires transitive org.graalvm.js.scriptengine; } 

نقوم بجمع وحذف دليل الاختبار ، وصلة .

النتيجة:

 Error: automatic module cannot be used with jlink: icu4j from file:///home/slava/JavaProjects/graal-js-jdk11-maven-demo/target/lib/icu4j-62.1.jar 

أي نوع من "وحدة تلقائية kennote bi uzd"؟ ويخبرنا هذا jlink أن icu4j lib لا يحتوي على الوحدة النمطية info.class. ما هو مطلوب لظهور مثل هذه الفئة داخل المكتبة المحددة:

  • فهم قائمة الوحدات النمطية التي يستخدمها أي منها وإنشاء module-info.java ، وتحديد جميع الحزم التي يجب أن تكون مرئية من الخارج
  • ترجمة وحدة - info.java ل
  • وضع وحدة المترجمة- info.java في dzharnik مع أي

دعنا نذهب!

سيقوم ملف module-info.java بكافة محتوياته بإنشاء الأداة jdeps من openjdk-11 بالنسبة لنا:



نقوم بتجميع module-info.java لـ icu4j:



نقوم بتحديث dzharnik من خلال دفع الوحدة النمطية info.class إلى ذلك:

 $JAVA_HOME/bin/jar uf target/lib/icu4j-62.1.jar -C target/modules module-info.class 

رابط ، تشغيل .

يؤدي
- التكرار 1 - 1 (1216 مللي ثانية)
2 (223 مللي ثانية)
3 (394 مللي ثانية)
4 (138 مللي ثانية)
5 (116 مللي ثانية)
6 (102 مللي ثانية)
7 (120 مللي ثانية)
8 (106 مللي ثانية)
9 (110 مللي ثانية)
المجموع: 69999993 (2619 مللي ثانية)
- التكرار 2 - 1 (166 مللي ثانية)
2 (133 مللي ثانية)
3 (142 مللي ثانية)
4 (157 مللي ثانية)
5 (119 مللي ثانية)
6 (134 مللي ثانية)
7 (153 مللي ثانية)
8 (95 مللي ثانية)
9 (85 مللي ثانية)
المجموع: 69999993 (1269 مللي ثانية)
- التكرار 3 - 1 (86 مللي ثانية)
2 (81 مللي ثانية)
3 (87 مللي ثانية)
4 (83 مللي ثانية)
5 (85 مللي ثانية)
6 (100 مللي ثانية)
7 (87 مللي ثانية)
8 (83 مللي ثانية)
9 (85 مللي ثانية)
المجموع: 69999993 (887 مللي ثانية)
- التكرار 4 - 1 (84 مللي ثانية)
2 (86 مللي ثانية)
3 (88 مللي ثانية)
4 (91 مللي ثانية)
5 (85 مللي ثانية)
6 (88 مللي ثانية)
7 (87 مللي ثانية)
8 (85 مللي ثانية)
9 (85 مللي ثانية)
المجموع: 69999993 (864 مللي ثانية)
- التكرار 5 - 1 (94 مللي ثانية)
2 (86 مللي ثانية)
3 (84 مللي ثانية)
4 (83 مللي ثانية)
5 (85 مللي ثانية)
6 (86 مللي ثانية)
7 (84 مللي ثانية)
8 (84 مللي ثانية)
9 (83 مللي ثانية)
المجموع: 69999993 (854 مللي ثانية)
- التكرار 6 - 1 (83 مللي ثانية)
2 (89 مللي ثانية)
3 (87 مللي ثانية)
4 (87 مللي ثانية)
5 (86 مللي ثانية)
6 (86 مللي ثانية)
7 (91 مللي ثانية)
8 (86 مللي ثانية)
9 (85 مللي ثانية)
المجموع: 69999993 (865 مللي ثانية)
- التكرار 7 - 1 (87 مللي ثانية)
2 (86 مللي ثانية)
3 (88 مللي ثانية)
4 (90 مللي ثانية)
5 (91 مللي ثانية)
6 (87 مللي ثانية)
7 (85 مللي ثانية)
8 (85 مللي ثانية)
9 (86 مللي ثانية)
المجموع: 69999993 (868 مللي ثانية)
- التكرار 8 - 1 (84 مللي ثانية)
2 (85 مللي ثانية)
3 (86 مللي ثانية)
4 (84 مللي ثانية)
5 (84 مللي ثانية)
6 (88 مللي ثانية)
7 (85 مللي ثانية)
8 (86 مللي ثانية)
9 (86 مللي ثانية)
المجموع: 69999993 (852 مللي ثانية)
- التكرار 9 - 1 (83 مللي ثانية)
2 (85 مللي ثانية)
3 (84 مللي ثانية)
4 (85 مللي ثانية)
5 (89 مللي ثانية)
6 (85 مللي ثانية)
7 (88 مللي ثانية)
8 (86 مللي ثانية)
9 (83 مللي ثانية)
المجموع: 69999993 (850 مللي ثانية)
- التكرار 10 - 1 (83 مللي ثانية)
2 (84 مللي ثانية)
3 (83 مللي ثانية)
4 (82 مللي ثانية)
5 (85 مللي ثانية)
6 (83 مللي ثانية)
7 (84 مللي ثانية)
8 (94 مللي ثانية)
9 (93 مللي ثانية)
المجموع: 69999993 (856 مللي ثانية)

مرحى! لقد فعلنا ذلك! الآن لدينا تطبيق محظور في شكل sh-script قيد التشغيل مع Java الخاص بنا ، مع جميع الوحدات الضرورية (بما في ذلك graalvm الطازجة) ، مع التفضيل والسيدات الشابات.

PS


لا تشعر جافا بالملل وتعطي طعامًا جديدًا للعقل مع كل إصدار. جرب ميزات جديدة ، تجربة ، تبادل الخبرات. آمل أن أكتب مقالًا قريبًا حول كيفية حظر جزء من مشروع الحيوانات الأليفة بالكأس (سيكون هناك نصوص توضيحية مثل vert.x ، والتزامن وغير ذلك).

ومع ذلك ... هذا هو مقالي الأول عن حبري ، - من فضلك ، لا تضغط بشدة.

Source: https://habr.com/ru/post/ar445978/


All Articles