Zero Turnaround in Java Watching the logs roll by Toomas Rmer - - PowerPoint PPT Presentation

zero turnaround in java
SMART_READER_LITE
LIVE PREVIEW

Zero Turnaround in Java Watching the logs roll by Toomas Rmer - - PowerPoint PPT Presentation

Zero Turnaround in Java Watching the logs roll by Toomas Rmer http://twitter.com/toomasr http://dow.ngra.de Jevgeni Kabanov Founder of ZeroTurnaround Aranea and Squill Project Co-Founder Turnaround cycle Check Make a the change


slide-1
SLIDE 1

Zero Turnaround in Java Watching the logs roll by…

Jevgeni Kabanov

Founder of ZeroTurnaround Aranea and Squill Project Co-Founder

Toomas Römer

http://twitter.com/toomasr http://dow.ngra.de

slide-2
SLIDE 2

Turnaround cycle

Make a change Build, deploy, wait Check the change

slide-3
SLIDE 3

DEMO: SPRING PETCLINIC TURNAROUND

slide-4
SLIDE 4

Outline

Turnaround – Why should you care? Trimming Builds Reloading Java Code with Class Loaders HotSwap, JavaRebel and Beyond

slide-5
SLIDE 5

TURNAROUND – WHY SHOULD YOU CARE?

slide-6
SLIDE 6

Turnaround Cost

  • Average turnaround is about 1

minute long

  • Done about 5 times an hour

From over 15 projects and 150 people

  • 8.3% of total coding time (1*5/60)
  • 30 minutes a day (from 6 hours
  • f coding a day)
  • 2.5 hours a week
  • Almost 3 work weeks a year

This sums up to

slide-7
SLIDE 7

Working Memory Programming is an exercise

  • f the working (short-term)

memory that holds the current context Questions:

How fast do you lose that context? How much time does context recovery take?

slide-8
SLIDE 8

Working Memory

52% 41% 24% 12% 9% 6% 0% 10% 20% 30% 40% 50% 60% 3 6 9 12 15 18

Working memory degradation per second

Source: L. Peterson and M. Peterson “Short-Term Retention of Individual Verbal Items.” Journal of Experimental Psychology, 1959.

slide-9
SLIDE 9

Recovery time

The recovery time after a phone call is at least 15 minutes.

– Interrupts: Just a Minute Never Is, IEEE Software, 1998

The time it takes the employees to recover from an email interrupt was found to be on average 64 seconds.

– Case Study: Evaluating the Effect of Email Interruptions within the Workplace, EASE 2002

The recovery time for an instant message was estimated to be between 11 and 25 seconds

– Instant Messaging Implications in the Transition from a Private Consumer Activity to a Communication Tool for Business, Software Quality Management, 2004

slide-10
SLIDE 10

Some Conclusions

  • 1. With the recovery time considered,

turnaround can easily cost more than 15% of coding time.

  • ~ 4.5 hours a week, 5 work weeks a year
  • 2. Every second counts! There is a

significant difference between a minute, 30, 15, 5 and 1 second pause!

slide-11
SLIDE 11

Frustration

  • 1. a user experiences a greater increase in anxiety when

a peripheral task interrupts her primary task than when it does not

  • 2. a user perceives an interrupted task to be

more difficult to complete than a non-interrupted task

– The Effects of Interruptions on Task Performance, Annoyance, and Anxiety in the User Interface, IEEE Computer, 2006

Many programmers appear to be continually frustrated in attempts to work. The so-called "work -day" is made up largely of frustration time.

– Programmer performance and the effects of the workplace, ICSE 1985

slide-12
SLIDE 12

TRIMMING BUILDS

slide-13
SLIDE 13

A typical web application build Package everything in a WAR/EAR Package modules in JARs Compile classes Copy static resources Resolve dependencies

slide-14
SLIDE 14

Exploded layout

The project layout exactly follows the deployment layout All resources are edited in-place without copying

slide-15
SLIDE 15

Automatic building Classes should be compiled automatically by the IDE The output should be set directly to WEB-INF/classes or similar

slide-16
SLIDE 16

Deployment by linking The project is deployed by either pointing the container to it or creating a symbolic link in the deployment directory

  • ln -s
  • Symlinks can point to any file

Linux symbolic links

  • Sysinternals junction utility
  • n NTFS partitions
  • Can only link to local

directories and must be careful when deleting Windows symbolic links

slide-17
SLIDE 17

A typical web application build Package everything in a WAR/EAR Package modules in JARs

Compile classes

Copy static resources Resolve dependencies

slide-18
SLIDE 18

Bootstrapping Builds

Can’t always use exploded layout Instead:

Build the WAR/EAR Unzip it to a temp directory Remove some of the folders/jars and symlink them to the project folders Set the project to build automatically

Easy to automate with a bootstrapping script Save on copying resources and packaging classes

slide-19
SLIDE 19

RELOADING CODE

slide-20
SLIDE 20

Reloading Code

Objects & Class Loaders Deployment, OSGi & etc JVM Dynamic languages

slide-21
SLIDE 21

Reloading an Object

MyObject MyObject.class OldClassLoader NewClassLoader MyObject.class MyObject Recreate the object

slide-22
SLIDE 22

Twin Class Loader

JVM

Classes Libraries OldClassLoader NewClassLoader Objects and Code Classes Libraries Objects and Code

slide-23
SLIDE 23

Twin Class Issues

  • instanceof returns false
  • Casting throws an exception

New objects are not instances of

  • ld classes
  • Can get an IllegalAccessException

when calling a perfectly legal method

New classes are not members of the old packages

  • If you hold a reference to any object in

the old classloader you will hold all old classes (including their static fields)

Memory leaks are easy

slide-24
SLIDE 24

Web Deployment

Classes Libraries OldClassLoader NewClassLoader Servlet New Classes New Libraries Servlet Session Session

init()

App State App State

Serialize/deserialize

slide-25
SLIDE 25

Web Deployment

  • Every deployed application gets a dedicated

class loader

Class loader scope

  • Application state is recovered by reinitialization
  • Session state is (optionally) serialized and

deserialized in the new class loader

State recreation

  • Application reinitialization time, typically around
  • ne minute

Reloading time

  • Leaks memory
  • Lazy caches need to be warmed up every time

Problems

slide-26
SLIDE 26

OSGi Frameworks that implement the OSGi standard provide an environment for the modularization of applications into smaller bundles. [Wikipedia]

slide-27
SLIDE 27

OSGi Redeployment

Classes Libraries OldClassLoader NewClassLoader Bundle New Classes New Libraries Bundle

start()

Module State Module State

slide-28
SLIDE 28

OSGi

  • Dedicated class loader per application

module

Class loader scope

  • Module state is recovered by reinitialization

State recreation

  • Module reinitialization time, usually less than

whole application reinitialization

Reloading time

  • Applications must be designed with OSGi in

mind

  • Overhead interface definitions
  • Module export interfaces cannot be changed

without redeploying the application

Problems

slide-29
SLIDE 29

Fine-grained Class Loaders

Wrap a class loader around components

Tapestry 5 RIFE

Very fast reloading

Few classes at a time Components managed by the framework are usually easy to recreate

slide-30
SLIDE 30

Old Component ClassLoader New Component ClassLoader Class Object Component State New Class New Object

slide-31
SLIDE 31

Fine-grained Class Loaders

  • Class loader per component/service

Class loader scope

  • State restored by framework

(component/service recreated)

State recreation

  • (Almost) Instant

Reloading time

  • Only managed components can be reloaded
  • Managed components referring unmanaged

code can be a problem (twin class issues)

Problems

slide-32
SLIDE 32

Some Conclusions

Recreating the state is the breaking point of reloading a class Coarse-grained class loaders take too much time to recreate the state Fine-grained class loaders exhibit the twin class problem and are not universally applicable Both are useful, but only partial solutions to the zero turnaround problem

slide-33
SLIDE 33

Dynamic Languages Class-based languages have same limitations as Java

Groovy Jython

Non-class based languages can have better support

JRuby Clojure

slide-34
SLIDE 34

HOTSWAP AND JAVAREBEL

slide-35
SLIDE 35

HotSwap

MyObject MyObject.class OldClassLoader Code 101000101 100010010 Debugger

HotSwap

New Code 111000100 101010010 New Code 111000100 101010010

User saves class from IDE

slide-36
SLIDE 36

HotSwap

Updates classes and objects

  • Almost instantly
  • Can be attached remotely

Very limited

  • Only updates method bodies, no new

fields, methods or classes

  • Needs a debugger session running, slow

and prone to error

slide-37
SLIDE 37

JavaRebel Approach

JVM

Reloading “Interpreter” JavaRebel Agent

Classes Libraries ClassLoader ClassLoader ClassLoader Objects and Code

slide-38
SLIDE 38

JavaRebel

MyObject MyObject.class OldClassLoader Code 101000101 100010010 New Code 111000100 101010010 New Code 111000100 101010010 JavaRebel agent

MyObject.class file changed

slide-39
SLIDE 39

JavaRebel Features

HotSwap JavaRebel

Changing method bodies

+ +

Adding/removing methods

  • +

Adding/removing constructors

  • +

Adding/removing fields

  • +

Adding/removing classes

  • +

Adding/removing annotations

  • +

Replacing superclass

  • Adding/removing

implemented interfaces

slide-40
SLIDE 40

JavaRebel Installation

  • noverify -javaagent:/path/to/javarebel.jar

Enables the JavaRebel agent All *.class files in the classpath will be monitored for changes automatically

rebel.xml

<dir name="c:\projects\myProject\classes\"> <war file="c:\projects\myProject\dist\myProject.war" /> <link target="gfx/"> <dir>c:\projects\myProject\static\gfx</dir> </link>

slide-41
SLIDE 41

DEMO: PETCLINIC WITH JAVAREBEL

slide-42
SLIDE 42

JavaRebel

Just works

  • No configuration necessary!
  • Runs on all JVMs starting with 1.4
  • Supports all major containers
  • Supports standalone Java applications and OSGi

Seamlessly

  • Changes are visible in reflection
  • Serialization works as usual
  • Dynamic proxies work as usual
slide-43
SLIDE 43

JavaRebel Commercial tool, free 30 day trial No free/open source analogs Get it from:

www.zeroturnaround.com

  • r just google “javarebel”

Personal license: Commercial license:

~ $10

slide-44
SLIDE 44

JavaRebel History

JavaRebel 1.0 released in December, 2007 Today over 10 000 licensed users Some of our customers:

LinkedIn Turner Roche Logica Disney.com

slide-45
SLIDE 45

AND BEYOND

slide-46
SLIDE 46

Classes

JavaRebel

MyObject MyObject.class OldClassLoader Code 101000101 100010010 New Code 111000100 101010010 New Code 111000100 101010010

JavaRebel agent MyObject.class file changed Configuration (XML, annotations, …) Framework Configuration changed

slide-47
SLIDE 47

Types of Configuration

  • EJB 2.0/3.0
  • Spring
  • Guice

Service Glue

  • Struts 1.0/2.0
  • Stripes
  • Spring MVC

Web Controller

  • Hibernate
  • TopLink
  • JPA

ORM

slide-48
SLIDE 48

JavaRebel Plugins

  • Plugins are found and started from classpath
  • Javassist support allows patching framework

classes

  • API to react on class reloads

Open Source JavaRebel SDK

  • Adding/removing beans dependencies via

setters/fields

  • Adding new beans via XML or annotations
  • Adding new MVC Controllers and Handlers

Spring Plugin

slide-49
SLIDE 49

DEMO: PETCLINIC WITH JAVAREBEL SPRING PLUGIN

slide-50
SLIDE 50

JavaRebel 2.0

  • Available: Spring, Guice, Struts 2, Tapestry 4,

Stripes

Embedded plugins

  • All the benefits of exploded development with

unexploded one

  • Automatically maps propagates class and

resource updates to the deployed application

  • Will need some user help to configure

Virtual Classpath

  • Instant automatic production server updates and

rollbacks with a press of a button

  • Tools for update verification

Production support

slide-51
SLIDE 51

Take Away

Every next second spent on turnaround costs more! Builds should be as slim as possible, symlink is your friend Code reloading is a complicated problem with HotSwap, OSGi and framework support being the best partial solutions available for free JavaRebel solves the turnaround problem for peanuts :)