Download - Watching the logs roll by…
![Page 1: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/1.jpg)
Watching the logs roll by…
Jevgeni Kabanov
Founder of ZeroTurnaroundAranea and Squill Project Co-Founder
Engineer, Scientist, Evangelist, Entrepreneur,…
![Page 2: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/2.jpg)
Turnaround cycle
Make a change
Build, deploy,
waitCheck the
change
![Page 3: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/3.jpg)
DEMO: SPRING PETCLINIC TURNAROUND
![Page 4: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/4.jpg)
OutlineTurnaround – Why should you care?
Trimming Builds
Reloading Java Code with Class Loaders
HotSwap, JavaRebel and Beyond
![Page 5: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/5.jpg)
TURNAROUND – WHY SHOULD YOU CARE?
![Page 6: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/6.jpg)
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 of coding a day)•2.5 hours a week•Almost 3 work weeks a year
This sums up to
![Page 7: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/7.jpg)
Working Memory
Programming is an exercise of 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?
![Page 8: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/8.jpg)
Working Memory
3 6 9 12 15 180%10%20%30%40%50%60% 52%
41%
24%
12% 9%6%
Working memory degradation per second
Source: L. Peterson and M. Peterson “Short-Term Retention of Individual Verbal Items.” Journal of Experimental Psychology, 1959.
![Page 9: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/9.jpg)
Recovery time
The recovery time after a phone call is at least 15 minutes.
– Interrupts: Just a Minute Never Is, IEEE Software, 1998The 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
![Page 10: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/10.jpg)
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!
![Page 11: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/11.jpg)
Worker’s IQ falls 10 points when distracted. This drop in IQ is more than double the drop seen after smoking marijuana. IQ drop of 10 points is equivalent to missing an entire night of sleep
– Hewlett-Packard Press Release, Abuse of technology can reduce UK workers' intelligence,
2005
![Page 12: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/12.jpg)
TRIMMING BUILDS
![Page 13: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/13.jpg)
A typical web application build
![Page 14: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/14.jpg)
Exploded layout
The project layout exactly follows the deployment layout
All resources are edited in-place without copying
![Page 15: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/15.jpg)
Automatic building
Classes should be compiled automatically by the IDE
The output should be set directly to WEB-INF/classes or similar
![Page 16: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/16.jpg)
Deployment by linking
The project is deployed by either pointing the container to it or creating a symbolic link in the deployment directory
Linux symbolic links
• ln -s• Symlinks can point to any file
Windows symbolic links
• Sysinternals junction utility on NTFS partitions
• Can only link to local directories and must be careful when deleting
![Page 17: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/17.jpg)
A typical web application build
![Page 18: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/18.jpg)
Bootstrapping Builds
Can’t always use exploded layout
Instead:Build the WAR/EARUnzip it to a temp directoryRemove some of the folders/jars and symlink them to the project foldersSet the project to build automatically
Easy to automate with a bootstrapping script
Save on copying resources and packaging classes
![Page 19: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/19.jpg)
RELOADING CODE
![Page 20: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/20.jpg)
Reloading CodeObjects & Class Loaders
Deployment, OSGi & etc
JVM Dynamic languages
![Page 21: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/21.jpg)
Reloading an Object
MyObject
MyObject.class
OldClassLoader NewClassLoader
MyObject.class
MyObjectRecreate the object
![Page 22: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/22.jpg)
Twin Class Loader
JVM
Classes
Libraries
OldClassLoader NewClassLoader
Objects and
Code
Classes
Libraries
Objects and
Code
![Page 23: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/23.jpg)
Twin Class Issues
•instanceof returns false•Casting throws an exception
New objects are not instances of
old 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
![Page 24: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/24.jpg)
Web Deployment
Classes
Libraries
OldClassLoader NewClassLoader
Sevlet New Classes
New Librarie
s
Sevlet
Session Session
init()
App State
App State
Serialize/deserialize
![Page 25: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/25.jpg)
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 one minute
Reloading time
•Leaks memory•Lazy caches need to be warmed up every timeProblems
![Page 26: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/26.jpg)
OSGi
Frameworks that implement the OSGi standard provide an environment for the modularization of applications into smaller bundles. [Wikipedia]
![Page 27: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/27.jpg)
OSGi Redeployment
Classes
Libraries
OldClassLoader NewClassLoader
Bundle New Classes
New Librarie
s
Bundle
start()
Module
State
Module
State
![Page 28: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/28.jpg)
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
![Page 29: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/29.jpg)
Fine-grained Class Loaders
Wrap a class loader around componentsTapestry 5RIFE
Very fast reloadingFew classes at a timeComponents managed by the framework are usually easy to recreate
![Page 30: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/30.jpg)
Old ComponentClassLoader
New Component ClassLoader
Class Object
Component State
NewClass
NewObject
![Page 31: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/31.jpg)
Fine-grained Class Loaders
•Class loader per component/service
Class loader scope
•State restored by framework (component/service recreated)
State recreation
•(Almost) InstantReloading time
•Only managed components can be reloaded•Managed components referring unmanaged code can be a problem (twin class issues)Problems
![Page 32: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/32.jpg)
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
![Page 33: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/33.jpg)
Dynamic Languages
Class-based languages have same limitations as Java
GroovyJython
Non-class based languages can have better support
JRubyClojure
![Page 34: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/34.jpg)
HOTSWAP AND JAVAREBEL
![Page 35: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/35.jpg)
HotSwap
MyObject
MyObject.class
OldClassLoader
Code 101000101100010010
Debugger
HotSwap
New Code 111000100101010010
New Code 111000100101010010
User saves classfrom IDE
![Page 36: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/36.jpg)
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
![Page 37: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/37.jpg)
JavaRebel Approach
JVM
Reloading “Interpreter”
JavaRebelAgent
Classes Libraries
ClassLoader ClassLoader ClassLoader
Objects and Code
![Page 38: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/38.jpg)
JavaRebel
MyObject
MyObject.class
OldClassLoader
Code 101000101100010010
New Code 111000100101010010
New Code 111000100101010010
JavaRebel agent
MyObject.class filechanged
![Page 39: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/39.jpg)
JavaRebel FeaturesHotSwap 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
- -
![Page 40: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/40.jpg)
JavaRebel Installation
-noverify -javaagent:/path/to/javarebel.jarEnables the JavaRebel agentAll *.class files in the classpath will be monitored for changes automatically
WAR/EAR deploymentrebel.xml configuration files
![Page 41: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/41.jpg)
DEMO: PETCLINIC WITH JAVAREBEL
![Page 42: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/42.jpg)
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
![Page 43: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/43.jpg)
JavaRebel
Commercial tool, free 30 day trial
No free/open source analogs
Get it from:www.zeroturnaround.com
or just google “javarebel”
Personal license:
Commercial license:
![Page 44: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/44.jpg)
JavaRebel History
JavaRebel 1.0 released in December, 20072.0 in March, 2009
Today over 10 000 licensed users
Some of our customers:LinkedInTurnerRocheLogicaUnited Health Group
![Page 45: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/45.jpg)
AND BEYOND
![Page 46: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/46.jpg)
Classes
JavaRebel
MyObject
MyObject.class
OldClassLoader
Code 101000101100010010
New Code 111000100101010010
New Code 111000100101010010
JavaRebel
agent
MyObject.class filechanged
Configuration(XML, annotations, …)
Fram
ewor
k
Configuration changed
![Page 47: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/47.jpg)
Types of Configuration
•EJB 2.0/3.0•Spring•Guice
Service Glue
•Struts 1.0/2.0•Stripes•Spring MVC
Web Controller
•Hibernate•TopLink•JPAORM
![Page 48: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/48.jpg)
JavaRebel Plugins
Open Source JavaRebel SDK
• Plugins are distributed with JavaRebel• Javassist support allows patching framework classes• API to react on class reloads
Spring Plugin
• Adding/removing beans dependencies via setters/fields• Adding new beans via XML or annotations• Adding new MVC Controllers and Handlers
![Page 49: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/49.jpg)
DEMO: PETCLINIC WITH JAVAREBEL SPRING PLUGIN
![Page 50: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/50.jpg)
Take Away
5-15% of your coding time is wasted on redeploy interruptions
Builds should be as slim as possible, symlink is your best friend
Code reloading is a complicated problem. HotSwap, OSGi and framework support are the best partial solutions available for free
![Page 51: Watching the logs roll by…](https://reader036.vdocuments.mx/reader036/viewer/2022062222/5681640e550346895dd5b826/html5/thumbnails/51.jpg)
Take Away (with JavaRebel)
JavaRebel solves the code reloading problem for you
rebel.xml allows you to bypass the build process
Plugins handle configuration reloads
For your boss: JavaRebel saves at least $3 700 per developer, per year and pays for itself in 14 dayshttp://www.zeroturnaround.com/javarebel/roi-calculator