Download - Wdjhit javaone-2011-aa

Transcript
Page 1: Wdjhit javaone-2011-aa

Why Doesn’t Java

Have Instant

Turnaround?

Anton Arhipov

@antonarhipov

Product Lead at ZeroTurnaround

Page 2: Wdjhit javaone-2011-aa

twitter.com/ekabanov

Page 3: Wdjhit javaone-2011-aa

twitter.com/ekabanov

Turnaround cycle

Make a change

Build, deploy,

wait

Check the

change

Page 4: Wdjhit javaone-2011-aa

twitter.com/ekabanov

What about others?

Page 5: Wdjhit javaone-2011-aa

twitter.com/ekabanov

Why Java is heavier than others?

Dev << Prod

Operations

Standards

Vendors

Page 6: Wdjhit javaone-2011-aa

twitter.com/ekabanov

A typical web application build

Package everything in a WAR/EAR

Package modules in JARs

Compile classes

Copy static resources

Resolve dependencies

Page 7: Wdjhit javaone-2011-aa

twitter.com/ekabanov

Exploded layout

Page 8: Wdjhit javaone-2011-aa

twitter.com/ekabanov

Automatic building

Page 9: Wdjhit javaone-2011-aa

twitter.com/ekabanov

Deployment by linking

• ln -s

• Symlinks can point to any file

Linux symbolic links

• Sysinternals junction utility on NTFS partitions, included in Windows 7

• Can only link to local directories and must be careful when deleting

Windows symbolic links

Page 10: Wdjhit javaone-2011-aa

twitter.com/ekabanov

Help!

is downloading the internets!

2008 => 2011

Page 11: Wdjhit javaone-2011-aa

twitter.com/ekabanov

2008 => 2011

this works:

mvn jetty:run

others?

Page 12: Wdjhit javaone-2011-aa

twitter.com/ekabanov

App Server

getResource(“hello.html”)

Workspace

read(“src/main/.../hello.html”)

Page 13: Wdjhit javaone-2011-aa

twitter.com/ekabanov

A typical web application build

Package everything in a WAR/EAR

Package modules in JARs

Compile classes

Copy static resources

Resolve dependencies

Page 14: Wdjhit javaone-2011-aa

twitter.com/ekabanov

Why code reloading is so hard?

Externalized Temporary

Serializable Derivative

State

Page 15: Wdjhit javaone-2011-aa

twitter.com/ekabanov

Reloading an Object

MyObject

MyObject.class

OldClassLoader NewClassLoader

MyObject.class

MyObject Recreate the object

Page 16: Wdjhit javaone-2011-aa

twitter.com/ekabanov

Web Deployment

Classes

Libraries

OldClassLoader NewClassLoader

Sevlet New

Classes

New

Libraries

Sevlet

Session Session

init()

App

State

App

State

Serialize/deserialize

Page 17: Wdjhit javaone-2011-aa

twitter.com/ekabanov

Twin ClassLoader Issues

JVM

Classes

Libraries

OldClassLoader NewClassLoader

Objects

and Code

Classes

Libraries

Objects

and Code

OutOfMemoryError

ClassCastException

Page 18: Wdjhit javaone-2011-aa

twitter.com/ekabanov

2008 => 2011

Page 19: Wdjhit javaone-2011-aa

twitter.com/ekabanov

Frameworks

Page 20: Wdjhit javaone-2011-aa

twitter.com/ekabanov

2008 => 2011

Page 21: Wdjhit javaone-2011-aa

twitter.com/ekabanov

Old Component

ClassLoader

New Component

ClassLoader

Class Object

Component State

New

Class

New

Object

Page 22: Wdjhit javaone-2011-aa

twitter.com/ekabanov

JVM Languages

Class-based

languages have same

limitations as Java

Groovy

Jython

Non-class based

languages can have

better support

JRuby

Clojure

Page 23: Wdjhit javaone-2011-aa

twitter.com/ekabanov

HotSwap

MyObject

MyObject.class

OldClassLoader

Code

101000101 100010010

Debugger

HotSwap

New Code

111000100 101010010

New Code

111000100 101010010

User saves class

from IDE

Page 24: Wdjhit javaone-2011-aa

twitter.com/ekabanov

JRebel Class Reloading HotSwap JRebel

Changing method bodies + +

Adding/removing methods - +

Adding/removing constructors - +

Adding/removing fields - +

Adding/removing classes - +

Adding/removing annotations - +

Replacing superclass - -

Adding/removing

implemented interfaces - -

Page 25: Wdjhit javaone-2011-aa

twitter.com/ekabanov

JRebel

MyObject

MyObject.class

OldClassLoader

Code

101000101 100010010 New Code

111000100 101010010

New Code

111000100 101010010

JRebel

agent

MyObject.class file

changed

Page 26: Wdjhit javaone-2011-aa

twitter.com/ekabanov

Classes

JRebel

MyObject

MyObject.class

OldClassLoader

Code

101000101 100010010 New Code

111000100 101010010

New Code

111000100 101010010

JRebel

agent

MyObject.class file

changed

Configuration

(XML, annotations, …)

Fra

me

wo

rk

Configuration changed

Page 27: Wdjhit javaone-2011-aa

twitter.com/ekabanov

IDEs Containers Frameworks

Build Tools

JRebel Integration

Page 28: Wdjhit javaone-2011-aa

twitter.com/ekabanov

Who is already using JRebel? Air / Auto Banking & FSI Web IT Telco

Healthcare

Consulting Fashion/Entertain

ment

Page 29: Wdjhit javaone-2011-aa

Over 40 million builds, redeploys & restarts

prevented for 20,000+ Java developers

(how awesome is that?)

twitter.com/ekabanov

Page 30: Wdjhit javaone-2011-aa

twitter.com/ekabanov

<container-descriptor>

<fast-swap>true</fast-swap>

</container-descriptor>

weblogic-application.xml

Oracle Weblogic FastSwap

Page 31: Wdjhit javaone-2011-aa

twitter.com/ekabanov

Q: Why Doesn’t Java Have

Instant Turnaround?

A1: Other languages/platforms aren’t

much better!

A2: Reloading code is easy, preserving

state is hard!

A3: It’s better than it used to be!

A4: Play!, Tapestry 5 and Grails do that!

A5: But what about JRebel?

Page 32: Wdjhit javaone-2011-aa

twitter.com/ekabanov

Q?

Page 33: Wdjhit javaone-2011-aa

twitter.com/ekabanov

And also…

Instant, online rollout and rollback of

changes to production Java EE apps

for any deployment size.