Diving into Java Class Loader

47
@KonaTechAdda - 6 What is Class Loader নাথ াশ-লাডার Md Imran Hasan Hira Software Engineer Kona Software Lab Ltd. http://bd.linkedin.com/in/imranhasanhira https ://www.linkedin.com/company/kona-software-lab-ltd-

Transcript of Diving into Java Class Loader

@KonaTechAdda - 6

What is Class Loader ন িঃস্বার্থ ক্লাশ-ল াডার

Md Imran Hasan Hira

Software Engineer

Kona Software Lab Ltd.

http://bd.linkedin.com/in/imranhasanhirahttps://www.linkedin.com/company/kona-software-lab-ltd-

Part 1 – Brunch

Part 2 – Buffet Dinner

Java Class Bytecodes JVM

ClassLoading Example Loading Phases

Delegation Model Class Loading exceptions

References

Title Reference

Demystifying class loading problems, Part 1: An introduction to class loading and debugging tools

http://www.ibm.com/developerworks/library/j-dclp1/

The basics of Java class loaders http://www.javaworld.com/article/2077260/learn-java/learn-java-the-basics-of-java-class-loaders.html?null

Java Classloaders Tutorial http://zeroturnaround.com/rebellabs/rebel-labs-tutorial-do-you-really-get-classloaders/

Core Java Security: Class Loaders, Security Managers, and Encryption

http://www.informit.com/articles/article.aspx?p=1187967

Java Class Loader - Java Tutorial http://javapapers.com/core-java/java-class-loader/

Inside Class Loaders - O'Reilly Media http://www.onjava.com/pub/a/onjava/2003/11/12/classloader.html

Discovering Class Members (The Java™ Tutorials > The Reflection API > Classes)

https://docs.oracle.com/javase/tutorial/reflect/class/classMembers.html

Index

• What is Java ? How it runs on PC ?

• Different Java Virtual Machines

• A close look at the bytecodes

• Introduction to class loader

• Building the information from bytecode

• Maintaining the class loading chain

Part-1

What is Java - ন িঃস্বার্থ জাভা

What is Java

Java iLand

http://vimeo.com/46871479

What we know java is

Java

Java Technology

Java Programming

Language

Object Oriented

Write once, Run Everywhere

GreenTalk > Oak > Java

A detail history can be found in http://oracle.com.edgesuite.net/timeline/java/

GreenTalk

• James Gosling initiated a project as Green Team

• Firstly it was called GreenTalk and file extension was .gt

Oak

• After that it was called Oak and developed as part of the Green Project

• Oak is a symbol for strength

Java

• Oak renamed to Java for trademark issue with Oak Technologies

• Java was chosen amongst Silk, Jolt, DNA etc.

How java works

Main.java

Main.cpp Operating System

.classOperating

System

Java Virtual Machine

(JVM)

C/C++ source fileNative executable

.exe

OS executes the machine code

Java source file Java intermediate bytecodes

JVM interprets* the bytecodes

Let’s write some java

Welcome.java

Compile it

javac Welcome.java

Welcome.java

Compile command

Compile output Welcome.class

The Bytecodes (simplified view)

Run itWelcome.java

java WelcomeRun command

What does JVM do?

bytecodes

Amazing Things

Code Interpretation

Native Instruction mapping Type Conversion

Memory Management

Garbage Collection

Disk/Network access

Security Management

There is a specification about What JVM should do

http://docs.oracle.com/javase/specs/

Virtual Machines

• Hotspot JVM (OpenJDK)

• Hotspot JVM (Oracle JDK)

• J9 by IBM

• Apache Harmony

• Kaffe OpenVM

• NanoVM

An Important part is to load the classes into memory

Part-2 Class Loader

Takes classname(i.e. com.konasl.test.Welcome)

Find the bytecode data associated with this classname

Use defineClass() to decode raw bytecode into Class

Return the Class

Simple Class Loading Procedure

Takes classname(i.e. com.konasl.test.Welcome)

Find the bytecode data associated with this classname

Use defineClass() to decode raw bytecode into Class

Return the Class

Find in self cache for this class

Put the Class in self cache

Simple Class Loading Procedure (cont.)

Takes classname(i.e. com.konasl.test.Welcome)

Find the bytecode data associated with this classname

Use defineClass() to decode raw bytecode into Class

Use resolveClass() to resolve the other referenced classes

Return the Class

Find in super classloaders for this class

Find in self cache for this class

Put the Class in self cache

Simple Class Loading Procedure (cont.)

Class Loader chain

• Bootstrap Class Loader• <JAVA_HOME>/jre/lib

• Part of the core JVM, written in native code

• Extension Class Loader• <JAVA_HOME>/jre/lib/ext

• java.ext.dirs.

• Implemented by sun.misc.Launcher$ExtClassLoader

• System Class Loader• <CLASSPATH>

• java.class.path

• Implemented by the sun.misc.Launcher$AppClassLoader

Class Loader Delegation Model

Bootstrap Class Loader

Extension Class Loader

System Class Loader

User Defined Class Loader

User Defined Class Loader

User Defined Class Loader

Class Loader Delegation Model

Bootstrap Class Loader

Extension Class Loader

System Class Loader

User Defined Class Loader

User Defined Class Loader

User Defined Class Loader

$JAVAHOME/jre/lib/rt.jarKnown as

Primordial Class Loader

Class Loader Delegation Model

Bootstrap Class Loader

Extension Class Loader

System Class Loader

User Defined Class Loader

User Defined Class Loader

User Defined Class Loader

$JAVAHOME/jre/lib/rt.jar

$JAVAHOME/jre/lib/ext/*.jar

$CLASSPATH

defineClass()

resolveClass()

findInParentClass()

findLoadedClass()

Put the Class in self cache

Simple class loading procedure

loadClass()

findClass()

Insight of defineClass() magic

grepcode.com, openJDK 6, ClassLoader.java

Phases of Class Loading

LoadingVerifying

Preparing

Resolving

Initializing

Linking

Phases of Class Loading

LoadingVerifying

Preparing

Resolving

Initializing

Linking

1. Bringing Binary data from a class into

JVM

Phases of Class Loading

LoadingVerifying

Preparing

Resolving

Initializing

Linking

1. Bringing Binary data from a class into

JVM

2. Incorporating the binary data into the runtime state of the JVM

Phases of Class Loading

LoadingVerifying

Preparing

Resolving

Initializing

Linking

1. Bringing Binary data from a class into

JVM

2. Incorporating the binary data into the runtime state of the JVM

2.1 Ensure class is properly formed and fit for use by the

JVM

Phases of Class Loading

LoadingVerifying

Preparing

Resolving

Initializing

Linking

1. Bringing Binary data from a class into

JVM

2. Incorporating the binary data into the runtime state of the JVM

2.1 Ensure class is properly formed and fit for use by the

JVM

2.2 Allocating memory needed by the Class

Phases of Class Loading

LoadingVerifying

Preparing

Resolving

Initializing

Linking

1. Bringing Binary data from a class into

JVM

2. Incorporating the binary data into the runtime state of the JVM

2.1 Ensure class is properly formed and fit for use by the

JVM

2.2 Allocating memory needed by the Class 3. Class variables are given

their proper initial values

Phases of Class Loading

LoadingVerifying

Preparing

Resolving

Initializing

Linking

1. Bringing Binary data from a class into

JVM

2. Incorporating the binary data into the runtime state of the JVM

2.1 Ensure class is properly formed and fit for use by the

JVM

2.2 Allocating memory needed by the Class

2.3 Transforming symbolic references in the constant

pool, into direct references

3. Class variables are given their proper initial values

Explicit Loading vs Implicit Loading

ClassLoader.loadClass()

Class.forName()

Class A

Class B Class CReference

Inheritance

Instantiation

Explicit Loading

Implicit Loading

ClassNotFoundException

NoClassDefFoundException

ClassFormatError

ClassCastException

ClassCircularityError

The Exceptions

ClassNotFoundException

• These calls below and the class is not found• Class.forName()

• ClassLoader.findSystemClass()

• ClassLoader.loadClass()

• N.B. Unsuccessful Explicit attempt to load class

NoClassDefFoundException

• JVM or CL instance tries to load class and the class is not found while• in regular method call

• creating a new instance using the ‘new’

• N.B. Unsuccessful Implicit class load

ClassCastException

• Casting an object to a subclass of which it is not an instance.• i.e. Integer val = (Integer) new String(“1234”);

• or

UnsatisfiedLinkError

• Java Virtual Machine cannot find an appropriate native language definition of a method declared native. i.e.

ClassCircularityError

• Java Virtual Machine cannot find an appropriate native language definition of a method declared native. i.e.

Class A

Class B extends A

Class B

Class A extends B

A.class B.class A.class B.class

B.class A.classTry to load this two classes

IncompatibleClassChangeError

ClassFormatError

LinkageError

IllegalAccessError

More…

Power of Class Loader

•Dynamically loading desired classes• Loading different versions of the classes•Generating new class definitions on the fly•Verify custom code signature before executing

code•Use encrypted* bytecodes in program

Most of the programs don’t need to mess with Class Loader.

Quick Question Answer&

Open Discussion

Thank You