| Both sides previous revision
Previous revision
Next revision
|
Previous revision
|
java:jre [2015/07/05 09:59] gthanos [Garbage Collection] |
java:jre [2021/02/18 12:05] gthanos |
| ====== Το περιβάλλον μεταγλώτισσης και εκτέλεσης Java (JRE/JDK) ====== | ====== Το περιβάλλον μεταγλώττισης και εκτέλεσης Java (JRE/JDK) ====== |
| |
| H Java είναι μία γλώσσα **υψηλού επιπέδου** η οποία όταν μεταγλωττίζεται παράγεται ένας ιδιαίτερος τύπος κώδικα **χαμηλού επιπέδου** που ονομάζεται [[wp>Java_bytecode|Java Byte Code]]. Το [[wp>Java_bytecode|Java Byte Code]] ομοιάζει με assembly με την ιδιαιτερότητα όμως ότι δεν συμπίπτει με κάποια υφιστάμενη αρχιτεκτονική υπολογιστή. Ο κώδικας αυτός είναι εύκολο να μεταγλωττιστεί και να εκτελεστεί σε πραγματικό χρόνο από μία εικονική μηχανή εκτέλεσης κώδικα (Virtual Machine) στην γλώσσα μηχανής του κάθε υπολογιστή. Η διαδικασία μεταγλώτισσης και εκτέλεσης ψευδο-κώδικα σε πραγματικό χρόνο ονομάζεται [[wp>Just-in-time_compilation]]. | H Java είναι μία γλώσσα **υψηλού επιπέδου** η οποία όταν μεταγλωττίζεται παράγεται ένας ιδιαίτερος τύπος κώδικα **χαμηλού επιπέδου** που ονομάζεται [[wp>Java_bytecode|Java Byte Code]]. Το [[wp>Java_bytecode|Java Byte Code]] μοιάζει με assembly με την ιδιαιτερότητα όμως ότι δεν συμπίπτει με κάποια υφιστάμενη αρχιτεκτονική υπολογιστή. Ο κώδικας αυτός είναι εύκολο να μεταγλωττιστεί και να εκτελεστεί σε πραγματικό χρόνο από μία εικονική μηχανή εκτέλεσης κώδικα (Virtual Machine) στην γλώσσα μηχανής του κάθε υπολογιστή. Η διαδικασία μεταγλώττισης και εκτέλεσης ψευδο-κώδικα σε πραγματικό χρόνο ονομάζεται [[wp>Just-in-time_compilation]]. |
| |
| Το κώδικας που προκύπτει από την μεταγλώτιση των προγραμμάτων Java, απαιτεί για την εκτέλεση του μία εικονική μηχανή εκτέλεσης κώδικα ([[wp>Java_bytecode|Java Byte Code]]), το λεγόμενο [[wp>Java_virtual_machine| Java Virtual Machine (JVM)]]. To [[wp>Java_virtual_machine| JVM ]] είναι μία εικονική μηχανή εκτέλεσης κώδικα με την έννοια ότι δεν υπάρχει κάποιο υλικό που να την υλοποιεί, αντ' αυτού υλοποιείται σε λογισμικό. | O κώδικας που προκύπτει από την μεταγλώττιση των προγραμμάτων Java, απαιτεί για την εκτέλεση του μία μηχανή εκτέλεσης κώδικα ([[wp>Java_bytecode|Java Byte Code]]), το λεγόμενο [[wp>Java_virtual_machine| Java Virtual Machine (JVM)]]. To [[wp>Java_virtual_machine| JVM ]] είναι μία εικονική μηχανή εκτέλεσης κώδικα (για αυτό και ο όρος Virtual). H μηχανή JVM δεν υλοποιείται σε υλισμικό (hardware) αλλά σε λογισμικό (software). |
| |
| Αν και η δομή του [[wp>Java_bytecode|Java Byte Code]] επιτρέπει την γρήγορη εκτέλεση του κώδικα **Java** σε οποιαδήποτε αρχιτεκτονική. Παρ' όλα αυτά, δεν πρέπει να ξεχνάμε ότι καθώς εμπλέκεται λογισμικό στην εκτέλεση του κώδικα (αντί για εκτέλεση απευθείας πάνω στο υλικό) η γλώσσα Java δεν μπορεί παρά να είναι πιο αργή στην εκτέλεση της από οποιαδήποτε γλώσσα που εκτελείται απευθείας από το λειτουργικό, όπως οι C/C++. Από την άλλη, τα σύγχρονα υπολογιστικά συστήματα είναι τόσο ισχυρά, ώστε μπορούν να καλύψουν με άνεση τον επιπλέον υπολογιστικό κόστος που εισάγει η μηχανή **JVM** για τις περισσότερες εφαρμογές. | Αν και η δομή του [[wp>Java_bytecode|Java Byte Code]] επιτρέπει την γρήγορη εκτέλεση του κώδικα **Java** σε οποιαδήποτε αρχιτεκτονική, δεν πρέπει να παραγνωρίζουμε ότι εφόσον εμπλέκεται λογισμικό στην εκτέλεση του κώδικα (//αντί για εκτέλεση απευθείας πάνω στο υλισμικό//), η γλώσσα Java δεν μπορεί παρά να είναι πιο αργή στην εκτέλεση της από οποιαδήποτε γλώσσα που εκτελείται απευθείας στο hardware, όπως οι C ή C++. |
| |
| Στα παρακάτω σχήματα απεικονίζεται η διαδικασία μεταγλώττισης και εκτέλεσης ενός προγράμματος **Java**. O κώδικας Java μεταγλωτίζεται σε διαδικά αρχεία **.class** τα οποία είναι εκτελέσιμα από το JVM. To JVM μπορεί να εκτελεστεί σε υπολογιστές διαφορετικής αρχιτεκτονικής. Συμπερασματικά, το ίδιο εκτελέσιμο αρχείο **.class** μπορεί να εκτελεστεί σε υπολογιστές διαφορετικής αρχιτεκτονικής, χωρίς να απαιτηθεί η επαναμεταγλώτιση του. | Στα παρακάτω σχήματα απεικονίζεται η διαδικασία μεταγλώττισης και εκτέλεσης ενός προγράμματος **Java**. O κώδικας Java μεταγλωττίζεται σε διαδικά αρχεία **.class** τα οποία είναι εκτελέσιμα από το JVM. To JVM είναι διαθέσιμο για διαφορετρικά λειτουργικά συστήματα (π.χ. Windows και Unix/Linux) και για διαφορετικές αρχιτεκτονικές υλισμικού (ARM, i386 κ.α.). Με τη βοήθεια του JVM, το ίδιο εκτελέσιμο αρχείο **.class** μπορεί να εκτελεστεί σε υπολογιστές διαφορετικής αρχιτεκτονικής, χωρίς να απαιτείται η επαναμεταγλώττιση του. |
| |
| | {{:java:java-code-lifecycle1.gif?400 |}} | {{:java:java-code-lifecycle2.gif?430 |}} | | | {{:java:java-code-lifecycle1.gif?390 |}} | {{:java:java-code-lifecycle2.gif?430 |}} | |
| | |
| |{{:java:java-code-lifecycle3.gif? |}} | | |
| | |
| | Στην παρακάτω εικόνα απεικονίζεται η διάκριση μεταξύ της εκτέλεσης ενός κώδικα **C/C++** και ενός κώδικα **Java**. <WRAP important>To ίδιο εκτελέσιμο ΔΕΝ μπορεί να εκτελεστεί σε εικονικές μηχανές JVM __διαφορετικής έκδοσης__. Εφόσον καλούμαστε να εκτελέσουμε τον κώδικα μας σε μηχανή διαφορετικής έκδοσης από αυτή για την οποία έχει μεταγλωττιστεί αρχικά ο κώδικας, απαιτείται να μεταγλωττιστεί από μεταγλωττιστή κατάλληλης έκδοσης που να ταιριάζει στην έκδοση της εικονικής μηχανής.</WRAP>| {{:java:java_vs_c_.png?300 |}} | | |
| |
| ==== Το περιβάλλον εκτέλεσης - Java Runtime Environment ==== | ==== Το περιβάλλον εκτέλεσης - Java Runtime Environment ==== |
| |
| |{{ :java:jre-stack.png?300|}}| | {{ :java:jre-stack.png?250| Java Runtime Environment}} Το περιβάλλον εκτέλεσης οποιουδήποτε προγράμματος Java (Java Runtime Environment - JRE) αποτελείται από τα εξής: |
| | - Java Virtual Machine (JVM) |
| To περιβάλλον εκτέλεσης οποιουδήποτε προγράμματος Java (το λεγόμενο JRE) αποτελείται από τα εξής: | |
| - Java Virtual Machine (JVM) | |
| - Java API classes (standard βιβλιοθήκη της Java) | - Java API classes (standard βιβλιοθήκη της Java) |
| |
| Χωρίς τα δύο παραπάνω κανένα πρόγραμμα Java δεν μπορεί να εκτελεστεί. | ===== Το περιβάλλον μεταγλώττισης ===== |
| | |
| ===== Το περιβάλλον μεταγλώτισσης ===== | |
| |
| Το περιβάλλον μεταγλώττισης αποτελείται από το Java compiler (**javac**). Κάθε κλάση στη Java οφείλει να είναι ένα αυτόνομο αρχείο, του οποίου το όνομα να είναι ίδιο με το όνομα της κλάσης ακολουθούμενο από την κατάληξη **.java**. Για παράδειγμα, η κλάση **FirstProgram** πρέπει να είναι σε ένα αρχείο με όνομα **FirstProgram.java**. | Το περιβάλλον μεταγλώττισης αποτελείται από το Java compiler (**javac**). Κάθε κλάση στη Java οφείλει να είναι ένα αυτόνομο αρχείο, του οποίου το όνομα να είναι ίδιο με το όνομα της κλάσης ακολουθούμενο από την κατάληξη **.java**. Για παράδειγμα, η κλάση **FirstProgram** πρέπει να είναι σε ένα αρχείο με όνομα **FirstProgram.java**. |
| |
| Κάθε κλάση μεταγλωττίζεται με την εντολή **javac** ακολουθούμενη από το όνομα του αρχείου όπου βρίσκεται η κλάση, δηλ | Κάθε κλάση μεταγλωττίζεται με την εντολή **javac** ακολουθούμενη από το όνομα του αρχείου όπου βρίσκεται η κλάση, δηλαδή |
| <code> | <code> |
| javac FirstProgram.java | javac FirstProgram.java |
| public class MyFirstProgram { | public class MyFirstProgram { |
| public static void main(String args[]) { | public static void main(String args[]) { |
| System.out.println("Hello Reader!"); | if( args.length > 0 ) { |
| System.out.println("Welcome to Java world."); | System.out.print("Hello "); |
| | System.out.print(args[0]); |
| String str1 = "Goodbye "; | System.out.println("! Welcome to Java world."); |
| String str2 = "for now."; | } |
| System.out.println(str1+str2); | else { |
| | System.out.println("Hello! Welcome to Java world."); |
| | } |
| } | } |
| } | } |
| |
| </code> | </code> |
| |
| Ο παραπάνω κώδικας μεταγλωτίζεται ως εξής: | Ο παραπάνω κώδικας μεταγλωττίζεται ως εξής: |
| <code> | <code> |
| javac MyFirstProgram.java | javac MyFirstProgram.java |
| <code> | <code> |
| java MyFirstProgram | java MyFirstProgram |
| | ή |
| | java MyFirstProgram <YourName> |
| </code> | </code> |
| |
| Απαραίτητη προϋπόθεση για την εκτέλεση ενός προγράμματος Java είναι η ύπαρξη της συνάρτησης **main**. Η συνάρτηση **main** ορίζεται ως εξής | Παρατηρήστε ότι εκτελούμε καλώντας το όνομα της κλάσης. Απαραίτητη προϋπόθεση για την εκτέλεση ενός προγράμματος Java είναι η ύπαρξη της μεθόδου **main** μέσα στην κλάση την οποία επιχειρούμε να εκτελέσουμε. Η μέθοδος **main** ορίζεται ως εξής: |
| |
| <code java> | <code java> |
| </code> | </code> |
| |
| όπου ''String args[]'' είναι ένας πίνακας από ορίσματα τύπου [[ http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true |java.lang.String]] που λαμβάνει το πρόγραμμα από την γραμμή εντολών | όπου ''String args[]'' είναι ένας πίνακας από ορίσματα τύπου [[ http://docs.oracle.com/javase/7/docs/api/java/lang/String.html |java.lang.String]], τα οποία λαμβάνει το πρόγραμμα από την γραμμή εντολών. Αναλυτικότερα τα ορίσματα έχουν ως εξής. |
| - args[0]: το 1ο όρισμα | - args[0]: το 1ο όρισμα |
| - args[1]: το 2ο όρισμα κ.ο.κ. | - args[1]: το 2ο όρισμα |
| | - args[N-1]: το N-οστό όρισμα. |
| |
| <WRAP center round todo 60%> | <WRAP center round todo 60%> |
| Κατεβάστε και τρέξτε το παραπάνω αρχείο ακολουθώντας τις οδηγίες. | Κατεβάστε και τρέξτε το παραπάνω αρχείο ακολουθώντας τις παραπάνω οδηγίες μεταγλώττισης και εκτέλεσης. |
| </WRAP> | </WRAP> |
| |
| ===== Garbage Collection ===== | |Προηγούμενο: [[java:toc|Table of Contents ]] | [[:toc | Περιεχόμενα ]] | Επόμενο: [[java:install|Εγκατάσταση JDK/NetBeans]]| |
| | |
| Μία από τις βασικές ιδιότητες τις Java είναι ότι ο προγραμματιστής δεν απαιτείται να ασχολείται με | |
| | |
| Το παρακάτω απόσπασμα είναι από τη ελληνική έκδοση της [[http://el.wikipedia.org/wiki/%CE%A3%CF%85%CE%BB%CE%BB%CE%BF%CE%B3%CE%AE_%CE%B1%CF%80%CE%BF%CF%81%CF%81%CE%B9%CE%BC%CE%BC%CE%AC%CF%84%CF%89%CE%BD_%28%CF%85%CF%80%CE%BF%CE%BB%CE%BF%CE%B3%CE%B9%CF%83%CF%84%CE%AD%CF%82%29 | Wikipedia]]. | |
| | |
| "//Στην πληροφορική, η συλλογή απορριμμάτων (αγγλ. garbage collection ή GC) είναι μια μορφή αυτόματης διαχείρισης μνήμης η οποία λειτουργεί στο υπόβαθρο, κατά την εκτέλεση ενός προγράμματος. Ο συλλέκτης απορριμμάτων (garbage collector), η απλώς συλλέκτης, είναι συνήθως ένα νήμα του συστήματος (π.χ. του λειτουργικού συστήματος ή μιας εικονικής μηχανής επί της οποίας εκτελείται το βασικό πρόγραμμα) σχεδιασμένο κάθε φορά που ενεργοποιείται να απελευθερώνει τα τρέχοντα απορρίμματα: τη μνήμη την οποία καταναλώνουν τα αντικείμενα που το πρόγραμμα δεν χρησιμοποιεί πια. Η συλλογή απορριμμάτων εφευρέθηκε από τον Τζον Μακάρθι το 1959 για να λύσει προβλήματα της γλώσσας προγραμματισμού Lisp.//" | |
| | |
| Δείτε περισσότερα [[ java:objects#Garbage Collection|εδώ]]. | |
| | |
| | |
| |Προηγούμενο: | Επόμενο: [[java:install]]| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |