sql >> Databasteknik >  >> RDS >> Database

Vad är en anpassad körtidsbild i Java 9?

Java 9 introducerade idén om modulära runtime-bilder med Project Jigsaw och löste officiellt problemet med att skicka Java-runtime som monolitiska artefakter. Monolitiska körtidsbilder var inte bara tunga på minnesanvändning utan minskade också den övergripande prestandan för applikationen som kördes på den. Vi kan nu packa en skräddarsydd delmängd av JRE, baserat på de individuella behoven för de applikationer som körs på den och öka deras effektivitet. Den här artikeln tar en helhetsbild av den här funktionen av anpassade körtidsbilder som introducerats med Java 9.

En översikt

Effekten av idén att skapa en modulär körtidsbild med Java 9 är enorm. Den öppnar dörren för en specialbyggd applikation direkt från plattformen den körs på. Java-plattformen har ökat sin funktionalitet för varje ny version. Det är inte en överraskning att körtiden vid något tillfälle kommer att vara en monolitisk artefakt och ta hårt på minne och prestanda. På grund av detta har utvecklare länge efterfrågat en väg ut ur detta problem. Dessutom använder de flesta program inte Java Platform i sin helhet. Om ett program kan optimeras för prestanda och minnesanvändning, varför kan plattformen som det körs på inte också anpassas? Java 8 tog det första steget och försökte implementera en del av det med Kompakta profiler . Java 9 tog det framåt och implementerade ett sätt att skräddarsy körtidsbilder utan begränsningar som Kompakta profiler ålagts. Det tog ett holistiskt tillvägagångssätt för att förpacka runtime-bilder. Själva plattformen är modulariserad för att aktivera denna funktion. Applikationskod förpackad i moduler kan levereras med anpassade körtidsbilder som endast innehåller de plattformsmoduler som används av applikationen. Således kan ett applikationsprogram vara en enda buntad artefakt som inkluderar den anpassade JRE. Detta utnyttjar verkligen prestanda, vilket ger en starttid med färre minnesfootprints. Om applikationen körs i molnet minskar dessa nätverkets överbelastning och nedladdningstiden avsevärt.

Kompakt profil

Även om Java 9 kom förbi konceptet med kompakt profil introducerades med Java 8, är det ofta bra att förstå och uppskatta milstolpen som uppnåtts. På ett sätt matade Java 9 på idén och uppgraderade konceptet med en kompakt profil på ett mer holistiskt sätt.

En kompakt profil definierar delmängder av Java SE-plattformens API som kan minska den statiska storleken på Java-körtiden. Denna idé är i grunden inriktad på att arbeta på resursbegränsade enheter som har mindre lagringskapacitet, till exempel en inbäddad enhet. Det finns i princip tre profiler, kallade compact1 , kompakt2 och compact3 . Varje högre numrerad profil är en superuppsättning av dess lägre numrerade profil. Det betyder att compact1 är en riktig delmängd av compact2 , kompakt2 är en riktig delmängd av compact3 och compact3 , i sin tur, är en riktig delmängd av fullstack Java 8 SE API.

Referenser:

  • Kompakta profiler, Java SE 8-dokumentation
  • Java SE Embedded 8 Compact Profiles Översikt
  • En introduktion till Java 8 Compact-profiler

Vi presenterar JIMAGE

JIMAGE är ett speciellt filformat som introducerats med Java 9 för att lagra anpassade körtidsbilder. Detta filformat är optimerat för prestanda och lagring. Filformatet fungerar i princip som en behållare för JDK-resurser, klasser och moduler och indexerar dem för snabb sökning och snabbare klassladdning. Till skillnad från andra filformat som JAR och JMOD, används JIMAGE sällan av utvecklare eftersom det är relaterat till JDK-interna delar förutom när man vill bygga en anpassad körtidsbild. Klassladdning är snabbare med JIMAGE än JAR eller JMOD eftersom den är specifikt optimerad för det. Dessutom kan JIMAGE endast användas under körning. JIMAGE är fortfarande i sina tidiga år. Det finns väldigt lite utvecklarinformation tillgänglig; kanske mer kommer att avslöjas senare.

Skapa anpassade bilder

Java 9 tillhandahåller jlink verktyg för att skapa plattformsspecifika körtidsbilder. Anpassade bilder innehåller applikationsspecifika moduler och de moduler som krävs för plattformen. Eftersom storleken på runtime-bilden aka JRE reduceras till ett absolut minimum, är applikationsbilden tillsammans med JRE också minimal. Den kombinerar JRE som en enda leveransenhet tillsammans med programmet. jlink verktyget finns i /bin katalogen för JDK9 installerad katalog. Det finns flera tillgängliga alternativ som är associerade med detta verktyg som kan användas enligt kraven. Beskrivningen kan erhållas genom att använda –hjälpen alternativ tillgängligt med jlink kommando. Här extraheras den för bekvämlighets skull, eller så kan du skriva jlink –help på kommandoraden för att få följande lista.

Användning:

jlink <options> --module-path <modulepath>
   --add-modules <module>[,<module>...]
Alternativ Beskrivning
–lägg till-moduler [,…] Rootmoduler att lösa
–bind-tjänster Länk i tjänsteleverantörsmoduler och deras beroenden

-c, –compress=<0|1|2>

–disable-plugin

–endian

Aktivera komprimering av resurser:

Nivå 0:Ingen komprimering

Nivå 1:Konstant strängdelning

Nivå 2:ZIP

Inaktivera plugin-programmet som nämns

Byteordning för genererad jimage (standard:native)

-h, –hjälp

–ignore-signing-information

–launcher =[/]

–limit-moduler [,...]

–list-plug-ins

Skriv ut det här hjälpmeddelandet

Undertryck ett allvarligt fel när signerade modulära JAR:er länkas i bilden. De signaturrelaterade filerna för de signerade modulära JAR:erna kopieras inte till körtidsbilden.

Lägg till ett startkommando med det angivna namnet för modulen och huvudklassen om det anges.

Begränsa universum av observerbara moduler.

Lista tillgängliga plugin-program.

-p, –modul-sökväg

–no-header-files

–ingen man-sidor

–utgång

–save-opts

Modulsökväg

Exkludera inkludera rubrikfiler

Uteslut man-sidor

Plats för utmatningsväg

Spara jlink-alternativ i den givna filen

-G, –strip-debug

–suggest-providers [,...]

Ta bort felsökningsinformation

Föreslå leverantörer som implementerar de givna tjänstetyperna från modulsökvägen

-v, –verbose

–version

@

Aktivera utförlig spårning

Versionsinformation

Läs alternativ från filen

Ett enkelt exempel

Här går vi igenom ett mycket enkelt program från början till slutet av hur man skapar en körtidsbild av en Java-applikation. Vi antar att JDK9 är korrekt installerat och PATH och JAVA_HOME miljövariabeln ställs in på lämpligt sätt. I mitt fall är den installerad och inställd enligt följande (på en Linux-plattform):

  • JDK9 installerad katalog /usr/lib/jvm/java-9-oracle
  • PATH är inställd på /usr/lib/jvm/java-9-oracle/bin
  • JAVA_HOME är inställd på /usr/lib/jvm/java-9-oracle

Steg 1

Skapa en katalog som heter /Home/SampleProject och en src katalogen inuti den (till exempel /Home/SampleProject/src ).

Steg 2

Skapa en katalog med namnet org.app.test inuti källan katalog (som ett exempel, /Home/SampleProject/src/org.app.test ).

Steg 3

Nu, inne i org.app.test katalog, skapa en fil med namnet module-info.java . Och skriv följande innehåll:

module org.app.test{
   requires javafx.controls;
   exports org.app.test;
}

Steg 4

Skapa nu en katalog som heter org, app, test en i en annan (till exempel org.app.test/org/app/test ) och skapa sedan en fil med namnet MyApplication.java i testet katalog och skriv följande innehåll:

package org.app.test;

import javafx.application.Application;
import javafx.scene.control.Alert;
import javafx.scene.control.ButtonType;
import javafx.stage.Stage;

public class MyApplication extends Application{

   public static void main(String[] args) {
      Application.launch(args);
   }

   @Override
   public void start(Stage stage) throws Exception {

      Alert alert = new Alert(Alert.AlertType.INFORMATION);
      alert.setTitle("Congratulation!");
      alert.setHeaderText("You did it. The application is
         running.
      Press OK to close");
      alert.setContentText("You have successfully created a
         custom image");
      alert.showAndWait().ifPresent(rs -> {
         if (rs == ButtonType.OK) {
            System.out.println("Pressed OK.");
         }
      });
   }
}

Steg 5

Skapa ett /Home/SampleProject/mods katalog. Här sparar vi den kompilerade koden. Kompilera källkoden enligt följande. Den nuvarande arbetskatalogen är /Home/SampleProject .

javac -d mods --module-source-path src
src/org.app.test/module-info.java
src/org.app.test/org/app/test/MyApplication.java

Steg 6

Låt oss nu skapa JAR-filen och lagra den i lib katalog (som /Home/SampleProject/lib ) enligt följande:

jar --create --file lib/org.app.test.jar
--main-class org.app.test.MyApplication
-C mods/org.app.test .

Steg 7

För att testa, kör programmet enligt följande:

java --module-path lib -m org.app.test

Steg 8

Låt oss nu skapa JMOD-filen och spara den i jmods katalog (till exempel Home/SampleProject/jmods ):

jmod create --class-path lib/org.app.test.jar
   jmods/org.app.test.jmod

Steg 9

Slutligen, låt oss skapa den anpassade bilden genom att använda följande kommando:

jlink --module-path /usr/lib/jvm/java-9-oracle/jmods/:jmods
--add-modules org.app.test
--launcher runapp=org.app.test
--output dist

Detta skapar en mapp med namnet dist som innehåller allt som krävs för att köra programmet. Programmet, med startprogrammets namn angivet som runapp , finns i dist/bin katalog. Dubbelklicka på den för att köra.


Figur 1: Programmet körs

Det är allt.

Slutsats

Se lämplig dokumentation för detaljerad beskrivning av vart och ett av kommandoalternativen som används i den här artikeln. Prova ett enkelt program och bygg det från början till slut. Detta skulle bygga upp det nödvändiga förtroendet för att experimentera med ett lite mer komplicerat program, som att använda mer än en modul och hantera deras beroenden. JDK9 har bemyndigat utvecklare att förbereda sitt körtidsbagage för att bara fyllas med nödvändiga moduler. Det här är fantastiskt och utmärkt, något de flesta av oss har förväntat sig av Java länge. En Java-applikation kan nu rycka av sig bagaget den behövde bära av uppenbarligen liten anledning och bli plattformsoptimerad i distributionen.


  1. SQL Between-sats med strängkolumner

  2. Uppdatera ListView baserat på SQLite-stödd ContentProvider

  3. Hur man skapar jobb i SQL Server Express-utgåvan

  4. Ett fel uppstod under installationen av pg (0.17.1), och Bundler kan inte fortsätta