What is Java
History of Java
Why Java named "Oak"?
- Desktop Applications such as acrobat reader, media player, antivirus, etc.
- Web Applications such as irctc.co.in, javatpoint.com, etc.
- Enterprise Applications such as banking applications.
- Mobile
- Embedded System
- Smart Card
- Robotics
- Games, etc.
Types of Java Applications
1) Standalone Application
2) Web Application
3) Enterprise Application
4) Mobile Application
Java Platforms / Editions
1) Java SE (Java Standard Edition)
2) Java EE (Java Enterprise Edition)
3) Java ME (Java Micro Edition)
4) JavaFX
Java Version History
- JDK Alpha and Beta (1995)
- JDK 1.0 (23rd Jan 1996)
- JDK 1.1 (19th Feb 1997)
- J2SE 1.2 (8th Dec 1998)
- J2SE 1.3 (8th May 2000)
- J2SE 1.4 (6th Feb 2002)
- J2SE 5.0 (30th Sep 2004)
- Java SE 6 (11th Dec 2006)
- Java SE 7 (28th July 2011)
- Java SE 8 (18th Mar 2014)
- Java SE 9 (21st Sep 2017)
- Java SE 10 (20th Mar 2018)
- Java SE 11 (September 2018)
- JAVA SE 12 (March 2019)
- JAVA SE 13(September 2019)
- JAVA SE 14(March 2020)
- JAVA SE 15(September 2020)
- JAVA SE 16(March 2021)
- JAVA SE 17(LTS)(September 2021)
Java SE 18 62 22th March 2022 September 2022 for OpenJDK and Adoptium — Java SE 19 63 20th September 2022 March 2023 for OpenJDK — Java SE 20 — March 2023 September 2023 for OpenJDK — Java SE 21 (LTS) — September 2023 September 2028 September 2031 for Oracle[9]
Features of Java

- Simple
- Object-Oriented
- Portable
- Platform independent
- Secured
- Robust
- Architecture neutral
- Interpreted
- High Performance
- Multithreaded
- Distributed
- Dynamic
Simple
- Java syntax is based on C++ (so easier for programmers to learn it after C++).
- Java has removed many complicated and rarely-used features, for example, explicit pointers, operator overloading, etc.
- There is no need to remove unreferenced objects because there is an Automatic Garbage Collection in Java.
Object-oriented
- Object
- Class
- Inheritance
- Polymorphism
- Abstraction
- Encapsulation
Platform Independent
- Runtime Environment
- API(Application Programming Interface)
Secured
- No explicit pointer
- Java Programs run inside a virtual machine sandbox
- Classloader: Classloader in Java is a part of the Java Runtime Environment(JRE) which is used to load Java classes into the Java Virtual Machine dynamically. It adds security by separating the package for the classes of the local file system from those that are imported from network sources.
- Bytecode Verifier: It checks the code fragments for illegal code that can violate access right to objects.
- Security Manager: It determines what resources a class can access such as reading and writing to the local disk.
Robust
- It uses strong memory management.
- There is a lack of pointers that avoids security problems.
- There is automatic garbage collection in java which runs on the Java Virtual Machine to get rid of objects which are not being used by a Java application anymore.
- There are exception handling and the type checking mechanism in Java. All these points make Java robust.
Architecture-neutral
Portable
High-performance
Distributed
Multi-threaded
Dynamic
Difference between JDK, JRE, and JVM
The Java Development Kit (JDK) is a software development environment used for developing Java applications and applets. It includes the Java Runtime Environment (JRE), an interpreter/loader (Java), a compiler (javac), an archiver (jar), a documentation generator (Javadoc), and other tools needed in Java development.
The Java Development Kit (JDK) is a software development environment used for developing Java applications and applets. It includes the Java Runtime Environment (JRE), an interpreter/loader (Java), a compiler (javac), an archiver (jar), a documentation generator (Javadoc), and other tools needed in Java development.
Java Runtime Environment (JRE)
The Java Runtime Environment provides the minimum requirements for executing a Java application. It consists of the Java Virtual Machine (JVM), java core packages, classes, and supporting files.
The Java Runtime Environment provides the minimum requirements for executing a Java application. It consists of the Java Virtual Machine (JVM), java core packages, classes, and supporting files.
Java Virtual Machine (JVM)
The Java Virtual Machine is a specification that provides a runtime environment in which java bytecode can be executed. It means JVM creates a platform to run Java bytecode(.class file) and converting into different languages (native machine language) which the computer hardware can understand. Actually, there is nothing to install as JVM. When the JRE is installed, it will deploy the code to create a JVM for the particular platform. JVMs are available for many hardware and software platforms.
The Java Virtual Machine is a specification that provides a runtime environment in which java bytecode can be executed. It means JVM creates a platform to run Java bytecode(.class file) and converting into different languages (native machine language) which the computer hardware can understand. Actually, there is nothing to install as JVM. When the JRE is installed, it will deploy the code to create a JVM for the particular platform. JVMs are available for many hardware and software platforms.
Java Virtual Machine Architecture
The JVM consists of three distinct components:
- Class Loader
- Runtime Memory/Data Area
- Execution Engine
ClassLoader
ClassLoader is responsible for loading class file into the memory area. The classloader is an abstract class, generates the data which constitutes a definition for the class using a class binary name which is constituted of the package name, and a class name.
Now you got a clear idea about the inside mechanism of the ClassLoader. There are three types of ClassLoaders as shown below.
- Bootstrap ClassLoader — Load classes from JRE/lib/rt.jar
- Extension ClassLoader — Load classes from JRE/lib/ext
- Application/System ClassLoader — Load classes from classpath, -cp, Manifest
- Bootstrap Class Loader - This is the root class loader. It is the superclass of Extension Class Loader and loads the standard Java packages like
java.lang
, java.net
, java.util
, java.io
, and so on. These packages are present inside the rt.jar
file and other core libraries present in the $JAVA_HOME/jre/lib
directory. - Extension Class Loader - This is the subclass of the Bootstrap Class Loader and the superclass of the Application Class Loader. This loads the extensions of standard Java libraries which are present in the
$JAVA_HOME/jre/lib/ext
directory. - Application Class Loader - This is the final class loader and the subclass of Extension Class Loader. It loads the files present on the classpath. By default, the classpath is set to the current directory of the application. The classpath can also be modified by adding the
-classpath
or -cp
command line option.
The classLoading mechanism consists of three main steps as follows.
- Loading
- Linking
- Initialization
ClassLoader is responsible for loading class file into the memory area. The classloader is an abstract class, generates the data which constitutes a definition for the class using a class binary name which is constituted of the package name, and a class name.
Now you got a clear idea about the inside mechanism of the ClassLoader. There are three types of ClassLoaders as shown below.
- Bootstrap ClassLoader — Load classes from JRE/lib/rt.jar
- Extension ClassLoader — Load classes from JRE/lib/ext
- Application/System ClassLoader — Load classes from classpath, -cp, Manifest
- Bootstrap Class Loader - This is the root class loader. It is the superclass of Extension Class Loader and loads the standard Java packages like
java.lang
,java.net
,java.util
,java.io
, and so on. These packages are present inside thert.jar
file and other core libraries present in the$JAVA_HOME/jre/lib
directory. - Extension Class Loader - This is the subclass of the Bootstrap Class Loader and the superclass of the Application Class Loader. This loads the extensions of standard Java libraries which are present in the
$JAVA_HOME/jre/lib/ext
directory. - Application Class Loader - This is the final class loader and the subclass of Extension Class Loader. It loads the files present on the classpath. By default, the classpath is set to the current directory of the application. The classpath can also be modified by adding the
-classpath
or-cp
command line option.
The classLoading mechanism consists of three main steps as follows.
- Loading
- Linking
- Initialization
Loading
Whenever JVM loads a file, it will load and read,
- Fully qualified class name
- Variable information (instance variables)
- Immediate parent information
- Whether class or interface or enum
When the class is loaded to the JVM, it creates an object of class type and is put into the heap area. This class type object will be created only the very first time the class is loaded to the JVM.
Whenever JVM loads a file, it will load and read,
- Fully qualified class name
- Variable information (instance variables)
- Immediate parent information
- Whether class or interface or enum
When the class is loaded to the JVM, it creates an object of class type and is put into the heap area. This class type object will be created only the very first time the class is loaded to the JVM.
Linking
This is the process of linking the data in the class file into the memory area. It begins with verification to ensure this class file and the compiler.
- Make sure this compiler is valid
- The class file has the correct formating
- The class file has the correct structure
When considering security threads, there is a possibility that some programs like malware can change or add some content to the class file. In this case, it will be identified by the byte code verifier and throw an exception called “verify exception”.
When the verification process is done, the next step is preparation. In this stage, all the variables are initialized with the default value. As an example, it will assign 0 for int variables, null for all objects, false for all boolean variables, etc.
Java allows you to use any domain-specific words in your java program. As an example, you can create a class by giving any name (except java keywords). But the JVM cannot understand these words. Therefore, JVM replaces these words from a memory address. That process is called
- a boolean, which is
false
.
Resolution: In this phase, symbolic references are replaced with direct references present in the runtime constant pool.
F
private static f resolution. At the end of these three steps, the java file is loaded to the memory area.
The JVM uses the ClassLoader.loadClass()
method for loading the class into memory. It tries to load the class based on a fully qualified name.
If a parent class loader is unable to find a class, it delegates the work to a child class loader. If the last child class loader isn't able to load the class either, it throws NoClassDefFoundError
or ClassNotFoundException
This is the process of linking the data in the class file into the memory area. It begins with verification to ensure this class file and the compiler.
- Make sure this compiler is valid
- The class file has the correct formating
- The class file has the correct structure
When considering security threads, there is a possibility that some programs like malware can change or add some content to the class file. In this case, it will be identified by the byte code verifier and throw an exception called “verify exception”.
When the verification process is done, the next step is preparation. In this stage, all the variables are initialized with the default value. As an example, it will assign 0 for int variables, null for all objects, false for all boolean variables, etc.
Java allows you to use any domain-specific words in your java program. As an example, you can create a class by giving any name (except java keywords). But the JVM cannot understand these words. Therefore, JVM replaces these words from a memory address. That process is called
- a boolean, which is
false
.
Resolution: In this phase, symbolic references are replaced with direct references present in the runtime constant pool.
F
private static f resolution. At the end of these three steps, the java file is loaded to the memory area.
The JVM uses the ClassLoader.loadClass()
method for loading the class into memory. It tries to load the class based on a fully qualified name.
If a parent class loader is unable to find a class, it delegates the work to a child class loader. If the last child class loader isn't able to load the class either, it throws NoClassDefFoundError
or ClassNotFoundException
Initialization
This is the final stage of class loading. In this stage, the actual values are assigned to all static and instance variables. There is a rule that every class must be initialized before doing any active use. There are six active uses as follows.
- Use
new
keyword. - Invoke static methods.
- Assign values for static fields.
- Initialize class.
- Use
getInstance()
in Reflection API. - Instantiation of sub-class.
There are 4 ways to initialize a class in Java.
- New Keyword: Goes through the normal initialization process.
- Reflection API:
getInstance()
method and goes through the normal initialization process. - Clone Method: Gets the information from the source object.
- IO.ObjectInputStream: Gets data from non-transient variables passed in the parameter.
This is the final stage of class loading. In this stage, the actual values are assigned to all static and instance variables. There is a rule that every class must be initialized before doing any active use. There are six active uses as follows.
- Use
new
keyword. - Invoke static methods.
- Assign values for static fields.
- Initialize class.
- Use
getInstance()
in Reflection API. - Instantiation of sub-class.
There are 4 ways to initialize a class in Java.
- New Keyword: Goes through the normal initialization process.
- Reflection API:
getInstance()
method and goes through the normal initialization process. - Clone Method: Gets the information from the source object.
- IO.ObjectInputStream: Gets data from non-transient variables passed in the parameter.
Memory Area
This is the place data will store until the program is executed. It consists of 5 major components as follows.
This is the place data will store until the program is executed. It consists of 5 major components as follows.
There are five components inside the runtime data area:

Let's look at each one individually.
Method Area
This is a shared resource (only 1 method area per JVM). Method area stores class-level information such as
- ClassLoader reference
- Run time constant pool
- Constructor data — Per constructor: parameter types (in order)
- Method data — Per method: name, return type, parameter types (in order), modifiers, attributes
- Field data — Per field: name, type, modifiers, attributes
Heap Area
All the objects and their corresponding instance variables are stored in the heap area. As an example, if your program consists of a class called “Employee” and you are declaring an instance as follows,
Employee employee = new Employee();
When the class is loaded, there is an instance of employee
is created and it will be loaded into the Heap Area.
Stack Area
There are separate stack areas for each thread. The stack is responsible for hold the methods (method local variables, etc) and whenever we invoke a method, a new frame creates in the stack. These frames use Last-In-First-Out structure. They will be destroyed when the method execution is completed.
Program Counter (PC) Register
PC Register keeps a record of the current instruction executing at any moment. That is like a pointer to the current instruction in a sequence of instructions in a program. Once the instruction is executed, the PC register is updated with the next instruction. If the currently executing method is ‘native’, then the value of the program counter register will be undefined.
Native Method Area
A native method is a Java method that is implemented in another programming language, such as C or C++. This memory area is responsible to hold the information about these native methods.
Once the bytecode has been loaded into the main memory, and details are available in the runtime data area, the next step is to run the program. The Execution Engine handles this by executing the code present in each class.
However, before executing the program, the bytecode needs to be converted into machine language instructions. The JVM can use an interpreter or a JIT compiler for the execution engine.

Interpreter
The interpreter reads and executes the bytecode instructions line by line. Due to the line by line execution, the interpreter is comparatively slower.
Another disadvantage of the interpreter is that when a method is called multiple times, every time a new interpretation is required.
JIT Compiler
The JIT Compiler overcomes the disadvantage of the interpreter. The Execution Engine first uses the interpreter to execute the byte code, but when it finds some repeated code, it uses the JIT compiler.
The JIT compiler then compiles the entire bytecode and changes it to native machine code. This native machine code is used directly for repeated method calls, which improves the performance of the system.
The JIT Compiler has the following components:
- Intermediate Code Generator - generates intermediate code
- Code Optimizer - optimizes the intermediate code for better performance
- Target Code Generator - converts intermediate code to native machine code
- Profiler - finds the hotspots (code that is executed repeatedly)
To better understand the difference between interpreter and JIT compiler, assume that you have the following code:
int sum = 10;
for(int i = 0 ; i <= 10; i++) {
sum += i;
}
System.out.println(sum);
An interpreter will fetch the value of sum
from memory for each iteration in the loop, add the value of i
to it, and write it back to memory. This is a costly operation because it is accessing the memory each time it enters the loop.
However, the JIT compiler will recognize that this code has a HotSpot, and will perform optimizations on it. It will store a local copy of sum
in the PC register for the thread and will keep adding the value of i
to it in the loop. Once the loop is complete, it will write the value of sum
back to memory.
Note: a JIT compiler takes more time to compile the code than for the interpreter to interpret the code line by line. If you are going to run a program only once, using the interpreter is better.
Garbage Collector
The Garbage Collector (GC) collects and removes unreferenced objects from the heap area. It is the process of reclaiming the runtime unused memory automatically by destroying them.
Garbage collection makes Java memory efficient because because it removes the unreferenced objects from heap memory and makes free space for new objects. It involves two phases:
- Mark - in this step, the GC identifies the unused objects in memory
- Sweep - in this step, the GC removes the objects identified during the previous phase
Garbage Collections is done automatically by the JVM at regular intervals and does not need to be handled separately. It can also be triggered by calling System.gc()
, but the execution is not guaranteed.
The JVM contains 3 different types of garbage collectors:
- Serial GC - This is the simplest implementation of GC, and is designed for small applications running on single-threaded environments. It uses a single thread for garbage collection. When it runs, it leads to a "stop the world" event where the entire application is paused. The JVM argument to use Serial Garbage Collector is
-XX:+UseSerialGC
- Parallel GC - This is the default implementation of GC in the JVM, and is also known as Throughput Collector. It uses multiple threads for garbage collection, but still pauses the application when running. The JVM argument to use Parallel Garbage Collector is
-XX:+UseParallelGC
. - Garbage First (G1) GC - G1GC was designed for multi-threaded applications that have a large heap size available (more than 4GB). It partitions the heap into a set of equal size regions, and uses multiple threads to scan them. G1GC identifies the regions with the most garbage and performs garbage collection on that region first. The JVM argument to use G1 Garbage Collector is
-XX:+UseG1GC
Note: There is another type of garbage collector called Concurrent Mark Sweep (CMS) GC. However, it has been deprecated since Java 9 and completely removed in Java 14 in favour of G1GC.
Java Native Interface (JNI)
At times, it is necessary to use native (non-Java) code (for example, C/C++). This can be in cases where we need to interact with hardware, or to overcome the memory management and performance constraints in Java. Java supports the execution of native code via the Java Native Interface (JNI).
JNI acts as a bridge for permitting the supporting packages for other programming languages such as C, C++, and so on. This is especially helpful in cases where you need to write code that is not entirely supported by Java, like some platform specific features that can only be written in C.
You can use the native
keyword to indicate that the method implementation will be provided by a native library. You will also need to invoke System.loadLibrary()
to load the shared native library into memory, and make its functions available to Java.
Native Method Libraries
Native Method Libraries are libraries that are written in other programming languages, such as C, C++, and assembly. These libraries are usually present in the form of .dll
or .so
files. These native libraries can be loaded through JNI.
Common JVM Errors
- ClassNotFoundExcecption - This occurs when the Class Loader is trying to load classes using
Class.forName()
,ClassLoader.loadClass()
orClassLoader.findSystemClass()
but no definition for the class with the specified name is found. - NoClassDefFoundError - This occurs when a compiler has successfully compiled the class, but the Class Loader is not able to locate the class file at the runtime.
- OutOfMemoryError - This occurs when the JVM cannot allocate an object because it is out of memory, and no more memory could be made available by the garbage collector.
- StackOverflowError - This occurs if the JVM runs out of space while creating new stack frames while processing a thread.
---------------------------------------------------------------------------------------------
Refer below link for more information on JVM:
https://www.freecodecamp.org/news/jvm-tutorial-java-virtual-machine-architecture-explained-for-beginners/
--------------------------------------------------------------------------------------------------------
The implementation of JVM is also actively released by other companies besides Sun Micro Systems.

JDK
JDK is an acronym for Java Development Kit. The Java Development Kit (JDK) is a software development environment which is used to develop Java applications and applets. It physically exists. It contains JRE + development tools.JDK is an implementation of any one of the below given Java Platforms released by Oracle Corporation:
- Standard Edition Java Platform
- Enterprise Edition Java Platform
- Micro Edition Java Platform

1)What is
Java?
2)who is
the father of java?
3)who is in
green team?
4)where and
all java is used?
5)what are
different types of java applications?
6)what are
different types of java editions?
7)what is
java compiler name?
8)why java
is platform independent?
9)what are
different tasks performed by JVM?
10)what is
the difference between JRE, JDK ?
11)Explain
about Internal architecture of JVM?
12)WORA
Demystifying 'System.out.println()' in Java
In the Java programming language, what occurs when you invoke the 'System.out.println()' function and why?
14)
Not a black box
Here is a classic "Hello, World!" program — a friendly greeting from your computer. What do its first three lines do?
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
You may not understand every word as when learning a foreign language. Try to use your language intuition and associate lines with their functions.
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.