Top Banner
Do you really get class loaders? Jevgeni Kabanov Founder & CTO of ZeroTurnaround
27

Do you really get class loaders? Jevgeni Kabanov Founder & CTO of ZeroTurnaround.

Dec 15, 2015

Download

Documents

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Do you really get class loaders? Jevgeni Kabanov Founder & CTO of ZeroTurnaround.

Do you really get class loaders?

Jevgeni KabanovFounder & CTO of ZeroTurnaround

Page 2: Do you really get class loaders? Jevgeni Kabanov Founder & CTO of ZeroTurnaround.

My Background

Creator and core developer of JRebelJRebel maps your project workspace directly to a running application, watches the changes you make to classes and resources, then intelligently reflects them in your application.With JRebel you can get an extra dev month a year by skipping builds & redeploys

30 day trial, just $149 per developer :)

30 day trial, just $149 per developer :)

Page 3: Do you really get class loaders? Jevgeni Kabanov Founder & CTO of ZeroTurnaround.

To create JRebel we…

Hooked into class loading on the JVM levelIntegrated with the class loading mechanism in more than 10 different serversSolved hundreds of issues connected to class loadingLearned a lot more about class loaders than we wanted to

Page 4: Do you really get class loaders? Jevgeni Kabanov Founder & CTO of ZeroTurnaround.

Overview

BasicsWhat is class loading?How was it meant to work?

Problems and solutionsHow do class loaders leak?OSGi, Spring dm, JBoss and othersConclusions

Page 5: Do you really get class loaders? Jevgeni Kabanov Founder & CTO of ZeroTurnaround.

BASICS

Page 6: Do you really get class loaders? Jevgeni Kabanov Founder & CTO of ZeroTurnaround.

Class loader API

Page 7: Do you really get class loaders? Jevgeni Kabanov Founder & CTO of ZeroTurnaround.

Class loading

public class A { public void doSmth() { B b = new B(); b.doSmthElse(); }}

Page 8: Do you really get class loaders? Jevgeni Kabanov Founder & CTO of ZeroTurnaround.

Delegation

Class loaders have a parent class loaderThe parent is usually consulted first

Avoids loading same class several timesHowever in a Java EE web module local classes are searched first

In Java EE each WAR module of an EAR gets its own class loader

This allows separate namespaces for applications in same container

Page 9: Do you really get class loaders? Jevgeni Kabanov Founder & CTO of ZeroTurnaround.

Java EE Delegation

Page 10: Do you really get class loaders? Jevgeni Kabanov Founder & CTO of ZeroTurnaround.

PROBLEMS AND SOLUTIONS

Page 11: Do you really get class loaders? Jevgeni Kabanov Founder & CTO of ZeroTurnaround.

No class found

VariantsClassNotFoundExceptionClassNoDefFoundException

HelpfulIDE class lookup (Ctrl+Shift+T in Eclipse)find *.jar -exec jar -tf '{}' \; | grep MyClassURLClassLoader.getUrls()Container specific logs

Page 12: Do you really get class loaders? Jevgeni Kabanov Founder & CTO of ZeroTurnaround.

Wrong class found

VariantsIncompatibleClassChangeError

AbstractMethodErrorNoSuch(Method|Field)FoundError

ClassCastException, IllegalAccessError

Helpful-verbose:classClassLoader.getResource()javap -private MyClass

Page 13: Do you really get class loaders? Jevgeni Kabanov Founder & CTO of ZeroTurnaround.

More than one class found

VariantsLinkageError (class loading constraints violated)ClassCastException, IllegalAccessError

Helpful-verbose:classClassLoader.getResource()

Page 14: Do you really get class loaders? Jevgeni Kabanov Founder & CTO of ZeroTurnaround.

More than one class found

Web ClassLoaderWeb ClassLoader

Shared ClassLoaderShared ClassLoaderUtil3Util3

Util3Util3

Factory3

Factory3

Test3Test3

Util3 u = (Util3) Factory3.instanceUntyped();

Factory3.instanceUntyped();new Util3()ClassCastException

Page 15: Do you really get class loaders? Jevgeni Kabanov Founder & CTO of ZeroTurnaround.

More than one class found

Web ClassLoaderWeb ClassLoader

Shared ClassLoaderShared ClassLoaderUtil3Util3

Util3Util3

Factory3

Factory3

Test4Test4

Factory3.instance().sayHello();

Factory3.instance();new Util3()LinkageError

Page 16: Do you really get class loaders? Jevgeni Kabanov Founder & CTO of ZeroTurnaround.

More than one class found

Web ClassLoaderWeb ClassLoader

Shared ClassLoaderShared ClassLoaderUtil3Util3

Util3Util3

Factory3

Factory3

Test5Test5

Util3 u = (Util3) Factory3.instancePackage();

Factory3.instancePackage();new Util3()IllegalAccessError

Page 17: Do you really get class loaders? Jevgeni Kabanov Founder & CTO of ZeroTurnaround.

Reloading an Object

MyObjectMyObject

MyObject.class

MyObject.class

OldClassLoaderOldClassLoader NewClassLoader

NewClassLoader

MyObject.class

MyObject.class

MyObjectMyObjectRecreate the object

Page 18: Do you really get class loaders? Jevgeni Kabanov Founder & CTO of ZeroTurnaround.

Leaking ClassLoaders

Class1.classClass1.class

ClassLoaderClassLoader

Class2.classClass2.class Class3.classClass3.class

Static FieldsStatic Fields

Static FieldsStatic Fields

Static FieldsStatic Fields

Page 19: Do you really get class loaders? Jevgeni Kabanov Founder & CTO of ZeroTurnaround.

Leaking ClassLoaders

LeakLeak LeakLeak LeakLeak

Leak.classLeak.class Leak.classLeak.class Leak.classLeak.class

ExampleFactory$1

ExampleFactory$1

ExampleFactory$1

ExampleFactory$1

ExampleFactory$1

ExampleFactory$1

Example.classExample.class Example.classExample.class Example.classExample.class

Page 20: Do you really get class loaders? Jevgeni Kabanov Founder & CTO of ZeroTurnaround.

STATE OF THE ART

Page 21: Do you really get class loaders? Jevgeni Kabanov Founder & CTO of ZeroTurnaround.

Hierarchy is not enough?

Isolation Different versions of the same library

PerformanceClass lookup is very slow

RestrictedWhy siblings can’t see each other’s classes?

OSGi, JBoss, NetBeans and others implement a different system

Page 22: Do you really get class loaders? Jevgeni Kabanov Founder & CTO of ZeroTurnaround.

The Modern Way

Each JAR has own class loaderAll class loaders are siblings, with one central repositoryEach JAR explicitly declares

Packages it exportsPackages it imports

Repository can find relevant class loaders by package

Page 23: Do you really get class loaders? Jevgeni Kabanov Founder & CTO of ZeroTurnaround.

Modern Filtering

Page 24: Do you really get class loaders? Jevgeni Kabanov Founder & CTO of ZeroTurnaround.

Modern Lookup

Page 25: Do you really get class loaders? Jevgeni Kabanov Founder & CTO of ZeroTurnaround.

Troubleshooting

The same tricks also work with Modern class loading systems

ClassLoader.getResource();-verbose:class

Often can be supplemented with custom toolsNeed to think in terms of export/import in addition to classpath

Looking at the pseudocode can help

Page 26: Do you really get class loaders? Jevgeni Kabanov Founder & CTO of ZeroTurnaround.

Problems

Too restrictiveImport is a one-way streetIf you want to use Hibernate, you import it, but it cannot access your classes

Easy to leakAny references between class loaders are leaks waiting to happen

DeadlocksJVM enforces a global lock on loadClass()

Page 27: Do you really get class loaders? Jevgeni Kabanov Founder & CTO of ZeroTurnaround.

Conclusions

The trick of troubleshooting class loaders is understanding how they work :)Modern systems add a level of complexity on top of an abstraction that nobody gets to begin withWhen redeploying or reloading classes leaking is easy and leads to OOMWe need better tools to troubleshoot class loaders!