SlideShare une entreprise Scribd logo
1  sur  55
Mattias Jiderhamn – java.jiderhamn.se
Join the war on
Mattias Jiderhamn
ClassLoader leaks
Mattias Jiderhamn – java.jiderhamn.se
java.lang.OutOfMemoryError:
PermGen space
:-(
Metaspace
Mattias Jiderhamn – java.jiderhamn.se
Local dev env
Mattias Jiderhamn – java.jiderhamn.se
Continuous Deploy
.war
Crashing
Mattias Jiderhamn – java.jiderhamn.se
Agenda
What does it mean?
Why does it happen?
Where does it leak?
How to avoid?
OSS examples
Training!
Mattias Jiderhamn – java.jiderhamn.se
What?
Mattias Jiderhamn – java.jiderhamn.se
JVM memory
Stack
Heap
PermGen /
Metaspace
Mattias Jiderhamn – java.jiderhamn.se
JVM memory
Per thread
Local variables and
method parameters
Stack
Mattias Jiderhamn – java.jiderhamn.se
JVM memory
Heap
Young generation
Old generation /
tenured space
Eden
space
Survivor
space
Object instances
Mattias Jiderhamn – java.jiderhamn.se
JVM memory
Permanent Generation
java.lang.Class instances
etc
Named before JEE and
class unloading
Renamed Metaspace in Java 8
Aka Method area
PermGen /
Metaspace
Mattias Jiderhamn – java.jiderhamn.se
java.lang.OutOfMemoryError:
PermGen space / Metaspace
= Too many classes are loaded
What?
Mattias Jiderhamn – java.jiderhamn.se
Why?
Mattias Jiderhamn – java.jiderhamn.se
Reason for OOME
1. Your application is too large
-XX:MaxPermSize=256M
Java 8: Metaspace auto increase by default
2. java.lang.Class instances could not
be garbage collected after redeploy
java.lang.OutOfMemoryError:
PermGen space / Metaspace
Mattias Jiderhamn – java.jiderhamn.se
Reference types
• Strong (i.e. normal) reference
–Never GC:ed if reachable
• Soft reference
–GC:ed before OutOfMemoryError
• Weak reference (WeakHashMap)
–GC:ed when no Strong or Soft refs
• Phantom reference
–… won’t prevent GC
Mattias Jiderhamn – java.jiderhamn.se
Example
Foo
WeakHashMap
Map m = new WeakHashMap();
Foo myFoo = new Foo();
m.put(myFoo, ”bar”);
myFoo = null;
Mattias Jiderhamn – java.jiderhamn.se
GC reachability
GC roots
Mattias Jiderhamn – java.jiderhamn.se
Redeploy
Application Server
ClassLoader
app.war
ClassLoader
app.war’
ClassLoader
app.war’’
Mattias Jiderhamn – java.jiderhamn.se
ClassLoader refs
ClassLoader
Class ClassClass
Instance
Mattias Jiderhamn – java.jiderhamn.se
How leaks happen
Application Server
ClassLoader
Class ClassClass
Instance
GC root
Mattias Jiderhamn – java.jiderhamn.se
Where?
Mattias Jiderhamn – java.jiderhamn.se
Application Server
• Application Server bugs
• Logging frameworks
– Apache Commons Logging
Unless LogFactory.release()
– Log4j - some configs
Unless LogManager.shutdown()
– java.util.logging custom Level
• Bean Validation API (JSR 303)
• Unified Expression Language (javax.el)
?
Mattias Jiderhamn – java.jiderhamn.se
GC roots
• Class loaded by system ClassLoader
– static field in JDK classes (java.* etc)
• Live thread
– Stack – local vars, method params
–java.lang.Thread instance
• Object held as synchronization monitor
• JNI references
• JVM specials…
Mattias Jiderhamn – java.jiderhamn.se
System classes
• java.sql.DriverManager
• Bean introspection cache, shutdown hooks,
custom default Authenticator, custom
security Provider, custom MBeans, custom
ThreadGroup, custom property editor, …
• Reference to contextClassLoader of first caller
Mattias Jiderhamn – java.jiderhamn.se
DriverManager
Mattias Jiderhamn – java.jiderhamn.se
DriverManager
Application Server
app.war
mysql-jdbc.jar
JRE
DriverManager
ClassLoader
com.mysql.jdbc.Driver
1) …
… or 2)
DriverManager.deregisterDriver(…)
Mattias Jiderhamn – java.jiderhamn.se
Context shutdown
public class MyCleanupListener implements
javax.servlet.ServletContextListener {
...
/** Called when application is undeployed */
public void contextDestroyed(
ServletContextEvent servletContextEvent) {
DriverManager.deregisterDriver(…);
}
}
Mattias Jiderhamn – java.jiderhamn.se
Threads
• Thread stack
– Local variables
– Method parameters
• MyThread extends Thread
MyRunnable implements Runnable
• contextClassLoader +
AccessControlContext inherited
– Example HTTP 1.1 Keep-Alive-Timer
Mattias Jiderhamn – java.jiderhamn.se
Context shutdown
public class MyCleanupListener implements
javax.servlet.ServletContextListener {
...
/** Called when application is undeployed */
public void contextDestroyed(
ServletContextEvent servletContextEvent) {
DriverManager.deregisterDriver(…);
// Stop threads here!
}
}
Mattias Jiderhamn – java.jiderhamn.se
Stopping threads
public class MyThread extends Thread {
public void run() {
while(true) { // Bad idea!
// Do something
}
}
}
Mattias Jiderhamn – java.jiderhamn.se
Stopping threads
public class MyThread extends Thread {
private boolean running = true;
public void run() {
while(running) { // Until stopped
// Do something
}
}
public void shutdown() {
running = false;
}
}
private volatile boolean running = true;
Heinz Kabutz / Java Specialists’ - The Law of the Blind Spot
Mattias Jiderhamn – java.jiderhamn.se
Threads
• Thread stack
– Local variables
– Method parameters
• MyThread extends Thread
MyRunnable implements Runnable
• contextClassLoader +
AccessControlContext inherited
– Example HTTP 1.1 Keep-Alive-Timer
• ThreadLocal
Mattias Jiderhamn – java.jiderhamn.se
ThreadLocal
WeakHashMap<Thread, ?>
ThreadLocal
Thread Foo
Mattias Jiderhamn – java.jiderhamn.se
ThreadLocal
ThreadLocal JavaDoc:
”Each thread holds an implicit
reference to its copy of a thread-
local variable as long as the thread
is alive and the ThreadLocal
instance is accessible; …”
Mattias Jiderhamn – java.jiderhamn.se
ThreadLocal
ThreadLocalMap
Entry
Thread
ThreadLocal Foo
put()
set()
Mattias Jiderhamn – java.jiderhamn.se
ThreadLocal
Pooled threads:
•Threads may outlive ClassLoader
•ThreadLocal → ThreadGlobal!
(?)
Mattias Jiderhamn – java.jiderhamn.se
ThreadLocal
ThreadLocalMap
Entry
Thread
ThreadLocal Foo
ClassClassLoader
static
Class
Mattias Jiderhamn – java.jiderhamn.se
ThreadLocal
ThreadLocalMap
Entry
Thread
ThreadLocal Foo
ClassClassLoader
Stale entry
Mattias Jiderhamn – java.jiderhamn.se
ThreadLocal
ThreadLocalMap JavaDoc:
”However, since reference queues
are not used, stale entries are
guaranteed to be removed only
when the table starts running out
of space”
Mattias Jiderhamn – java.jiderhamn.se
ThreadLocal
•Custom value (incl references)
–static ThreadLocal = leak
–otherwise = unpredicted GC
•Custom ThreadLocal = no leak
Mattias Jiderhamn – java.jiderhamn.se
ThreadLocal
try {
myThreadLocal.set(foo);
…
}
finally {
myThreadLocal.remove();
}
Always clear your ThreadLocals!
Mattias Jiderhamn – java.jiderhamn.se
Known offenders
Apache ActiveMQ
Apache Axis
Apache Batik
Apache Commons Pool / DBCP
Apache CXF
AWT Toolkit
Bean Validation API / JSR 303
CGLIB (Hibernate / Spring / JBoss /
Apache Geronimo)
dom4j
EclipseLink
GeoTools
Google Guice
Groovy
GWT / javax.imageio
Hessian
iCal4J
Infinispan
IntrospectionUtils
JarURLConnection
Java Advanced Imaging (JAI)
Javassist
Java Cryptography Architecture (JCA)
Java Server Faces 2
javax.security.auth.Policy/login.Configuration
JGroups
Logback
JAXB
Mozilla Rhino
MVEL
OpenOffice Java Uno RunTime (JURT)
Oracle JDBC
RMI
Serialization (<= JDK 1.4.2)
Spring framework
Unified Expression Language / javax.el
URLConnection + HTTP 1.1
XML parsing (DocumentBuilderFactory)
Mattias Jiderhamn – java.jiderhamn.se
How?
Mattias Jiderhamn – java.jiderhamn.se
Leak Prevention Lib
• Application server independent
– Version 2 core module is pure Java SE!
• Covers a lot more than Tomcat
– System class references avoided/cleared
– Threads are stopped
– ThreadLocals are cleared
– Known offenders handled
• Logs warnings
• Apache 2 licensed
– You may modify and redistribute
Mattias Jiderhamn – java.jiderhamn.se
Leak Prevention Lib
Zero runtime dependencies
No required config
Maven pom.xml (Servlet 3.0+):
<dependency>
<groupId>se.jiderhamn.classloader-leak-prevention</groupId>
<artifactId>classloader-leak-prevention-servlet3</artifactId>
<version>2.0.2</version>
</dependency>
Mattias Jiderhamn – java.jiderhamn.se
Tomcat
Bugzilla #48895
ThreadLocalMap
Thread
Cleanup
Thread
remove()
Unsafe!
get()
set()
remove()
Removed in 6.0.27
Tomcat 7.0.6+ renews the thread pool
whenever an application is redeployed.
Disposable threads for lifecycle events.
Bugzilla #49159
Mattias Jiderhamn – java.jiderhamn.se
Leak Prevention Lib
set(null) ThreadLocalMap
Entry
Thread
ThreadLocal Foo
Stale
Cleanup
Thread
Mattias Jiderhamn – java.jiderhamn.se
Open Source
examples
Mattias Jiderhamn – java.jiderhamn.se
Bean Validation API
Version 1.0.0.GA
javax.validation.Validation
Application Server
validation-api-1.0.0.GA.jar
app.war
hibernate-validator.jar
Mattias Jiderhamn – java.jiderhamn.se
javax.el API
javax.el.BeanELResolver
Mattias Jiderhamn – java.jiderhamn.se
Apache CXF
org.apache.cxf.transport.http.CXFAuthenticator
CXF-5442
Mattias Jiderhamn – java.jiderhamn.se
OpenOffice JURT
com.sun.star.lib.util.AsynchronousFinalizer
Mattias Jiderhamn – java.jiderhamn.se
Training!
Gear up!
Mattias Jiderhamn – java.jiderhamn.se
Free tool
Eclipse Memory Analyzer
aka MAT
eclipse.org/mat
Mattias Jiderhamn – java.jiderhamn.se
Heap dump
Run application server with
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/temp
Mattias Jiderhamn – java.jiderhamn.se
Links
Join the fight!
java.jiderhamn.se @mjiderhamn
github.com/mjiderhamn
• ClassLoader Leak Prevention Library
• Step by step guide: acquire heap
dump and analyze for leaks using
Eclipse Memory Analyzer (MAT)
• List of known offenders and links to bug reports
• Submit reports and pull requests!
???

Contenu connexe

Tendances

remote-method-guesser - BHUSA2021 Arsenal
remote-method-guesser - BHUSA2021 Arsenal remote-method-guesser - BHUSA2021 Arsenal
remote-method-guesser - BHUSA2021 Arsenal
Tobias Neitzel
 
Clean Code I - Best Practices
Clean Code I - Best PracticesClean Code I - Best Practices
Clean Code I - Best Practices
Theo Jungeblut
 

Tendances (20)

Building RESTful applications using Spring MVC
Building RESTful applications using Spring MVCBuilding RESTful applications using Spring MVC
Building RESTful applications using Spring MVC
 
Memory Management: What You Need to Know When Moving to Java 8
Memory Management: What You Need to Know When Moving to Java 8Memory Management: What You Need to Know When Moving to Java 8
Memory Management: What You Need to Know When Moving to Java 8
 
Nouveautés de java 8
Nouveautés de java 8Nouveautés de java 8
Nouveautés de java 8
 
Functional Patterns with Java8 @Bucharest Java User Group
Functional Patterns with Java8 @Bucharest Java User GroupFunctional Patterns with Java8 @Bucharest Java User Group
Functional Patterns with Java8 @Bucharest Java User Group
 
Clean pragmatic architecture @ devflix
Clean pragmatic architecture @ devflixClean pragmatic architecture @ devflix
Clean pragmatic architecture @ devflix
 
Clean code
Clean codeClean code
Clean code
 
Clean Code
Clean CodeClean Code
Clean Code
 
Anatomy of a Spring Boot App with Clean Architecture - Spring I/O 2023
Anatomy of a Spring Boot App with Clean Architecture - Spring I/O 2023Anatomy of a Spring Boot App with Clean Architecture - Spring I/O 2023
Anatomy of a Spring Boot App with Clean Architecture - Spring I/O 2023
 
Real Life Clean Architecture
Real Life Clean ArchitectureReal Life Clean Architecture
Real Life Clean Architecture
 
clean code book summary - uncle bob - English version
clean code book summary - uncle bob - English versionclean code book summary - uncle bob - English version
clean code book summary - uncle bob - English version
 
remote-method-guesser - BHUSA2021 Arsenal
remote-method-guesser - BHUSA2021 Arsenal remote-method-guesser - BHUSA2021 Arsenal
remote-method-guesser - BHUSA2021 Arsenal
 
Event Storming and Saga
Event Storming and SagaEvent Storming and Saga
Event Storming and Saga
 
Intrinsic Methods in HotSpot VM
Intrinsic Methods in HotSpot VMIntrinsic Methods in HotSpot VM
Intrinsic Methods in HotSpot VM
 
이벤트 기반 분산 시스템을 향한 여정
이벤트 기반 분산 시스템을 향한 여정이벤트 기반 분산 시스템을 향한 여정
이벤트 기반 분산 시스템을 향한 여정
 
Capabilities for Resources and Effects
Capabilities for Resources and EffectsCapabilities for Resources and Effects
Capabilities for Resources and Effects
 
Clean Code I - Best Practices
Clean Code I - Best PracticesClean Code I - Best Practices
Clean Code I - Best Practices
 
The art of readable code ( pdf )
The art of readable code ( pdf )The art of readable code ( pdf )
The art of readable code ( pdf )
 
CQRS and Event Sourcing
CQRS and Event Sourcing CQRS and Event Sourcing
CQRS and Event Sourcing
 
Clean code
Clean codeClean code
Clean code
 
게임사를 위한 Amazon GameLift 세션 - 이정훈, AWS 솔루션즈 아키텍트
게임사를 위한 Amazon GameLift 세션 - 이정훈, AWS 솔루션즈 아키텍트게임사를 위한 Amazon GameLift 세션 - 이정훈, AWS 솔루션즈 아키텍트
게임사를 위한 Amazon GameLift 세션 - 이정훈, AWS 솔루션즈 아키텍트
 

En vedette

Introduktion till Aspekt-orienterad programmering (AOP) med AspectJ
Introduktion till Aspekt-orienterad programmering (AOP) med AspectJIntroduktion till Aspekt-orienterad programmering (AOP) med AspectJ
Introduktion till Aspekt-orienterad programmering (AOP) med AspectJ
Mattias Jiderhamn
 
"What's New in HotSpot JVM 8" @ JPoint 2014, Moscow, Russia
"What's New in HotSpot JVM 8" @ JPoint 2014, Moscow, Russia "What's New in HotSpot JVM 8" @ JPoint 2014, Moscow, Russia
"What's New in HotSpot JVM 8" @ JPoint 2014, Moscow, Russia
Vladimir Ivanov
 

En vedette (20)

A topology of memory leaks on the JVM
A topology of memory leaks on the JVMA topology of memory leaks on the JVM
A topology of memory leaks on the JVM
 
Introduktion till Aspekt-orienterad programmering (AOP) med AspectJ
Introduktion till Aspekt-orienterad programmering (AOP) med AspectJIntroduktion till Aspekt-orienterad programmering (AOP) med AspectJ
Introduktion till Aspekt-orienterad programmering (AOP) med AspectJ
 
Java 8 Launch - MetaSpaces
Java 8 Launch - MetaSpacesJava 8 Launch - MetaSpaces
Java 8 Launch - MetaSpaces
 
Tools for Metaspace
Tools for MetaspaceTools for Metaspace
Tools for Metaspace
 
The Java Memory Model
The Java Memory ModelThe Java Memory Model
The Java Memory Model
 
mjprof: Monadic approach for JVM profiling
mjprof: Monadic approach for JVM profilingmjprof: Monadic approach for JVM profiling
mjprof: Monadic approach for JVM profiling
 
GIT out of Dependency Hell - git submodules
GIT out of Dependency Hell - git submodulesGIT out of Dependency Hell - git submodules
GIT out of Dependency Hell - git submodules
 
"What's New in HotSpot JVM 8" @ JPoint 2014, Moscow, Russia
"What's New in HotSpot JVM 8" @ JPoint 2014, Moscow, Russia "What's New in HotSpot JVM 8" @ JPoint 2014, Moscow, Russia
"What's New in HotSpot JVM 8" @ JPoint 2014, Moscow, Russia
 
Coding for Android on steroids with Kotlin
Coding for Android on steroids with KotlinCoding for Android on steroids with Kotlin
Coding for Android on steroids with Kotlin
 
Taking Kotlin to production, Seriously
Taking Kotlin to production, SeriouslyTaking Kotlin to production, Seriously
Taking Kotlin to production, Seriously
 
The Future of Futures - A Talk About Java 8 CompletableFutures
The Future of Futures - A Talk About Java 8 CompletableFuturesThe Future of Futures - A Talk About Java 8 CompletableFutures
The Future of Futures - A Talk About Java 8 CompletableFutures
 
Classloader leak detection in websphere application server
Classloader leak detection in websphere application serverClassloader leak detection in websphere application server
Classloader leak detection in websphere application server
 
No one puts java in the container
No one puts java in the containerNo one puts java in the container
No one puts java in the container
 
Java GC, Off-heap workshop
Java GC, Off-heap workshopJava GC, Off-heap workshop
Java GC, Off-heap workshop
 
Deploy and Destroy Complete Test Environments
Deploy and Destroy Complete Test EnvironmentsDeploy and Destroy Complete Test Environments
Deploy and Destroy Complete Test Environments
 
Testing RESTful web services with REST Assured
Testing RESTful web services with REST AssuredTesting RESTful web services with REST Assured
Testing RESTful web services with REST Assured
 
JVM Internals (2015)
JVM Internals (2015)JVM Internals (2015)
JVM Internals (2015)
 
Ruby CI with Jenkins
Ruby CI with JenkinsRuby CI with Jenkins
Ruby CI with Jenkins
 
新版 OutOfMemoryErrorを知る
新版 OutOfMemoryErrorを知る新版 OutOfMemoryErrorを知る
新版 OutOfMemoryErrorを知る
 
Building Scalable Stateless Applications with RxJava
Building Scalable Stateless Applications with RxJavaBuilding Scalable Stateless Applications with RxJava
Building Scalable Stateless Applications with RxJava
 

Similaire à ClassLoader Leaks

Владимир Иванов. Java 8 и JVM: что нового в HotSpot
Владимир Иванов. Java 8 и JVM: что нового в HotSpotВладимир Иванов. Java 8 и JVM: что нового в HotSpot
Владимир Иванов. Java 8 и JVM: что нового в HotSpot
Volha Banadyseva
 
Web Sphere Problem Determination Ext
Web Sphere Problem Determination ExtWeb Sphere Problem Determination Ext
Web Sphere Problem Determination Ext
Rohit Kelapure
 
java-monitoring-troubleshooting
java-monitoring-troubleshootingjava-monitoring-troubleshooting
java-monitoring-troubleshooting
William Au
 
Extending Spark With Java Agent (handout)
Extending Spark With Java Agent (handout)Extending Spark With Java Agent (handout)
Extending Spark With Java Agent (handout)
Jaroslav Bachorik
 

Similaire à ClassLoader Leaks (20)

Владимир Иванов. Java 8 и JVM: что нового в HotSpot
Владимир Иванов. Java 8 и JVM: что нового в HotSpotВладимир Иванов. Java 8 и JVM: что нового в HotSpot
Владимир Иванов. Java 8 и JVM: что нового в HotSpot
 
Don't dump thread dumps
Don't dump thread dumpsDon't dump thread dumps
Don't dump thread dumps
 
Web Sphere Problem Determination Ext
Web Sphere Problem Determination ExtWeb Sphere Problem Determination Ext
Web Sphere Problem Determination Ext
 
An Introduction to Java Compiler and Runtime
An Introduction to Java Compiler and RuntimeAn Introduction to Java Compiler and Runtime
An Introduction to Java Compiler and Runtime
 
Java и Linux — особенности эксплуатации / Алексей Рагозин (Дойче Банк)
Java и Linux — особенности эксплуатации / Алексей Рагозин (Дойче Банк)Java и Linux — особенности эксплуатации / Алексей Рагозин (Дойче Банк)
Java и Linux — особенности эксплуатации / Алексей Рагозин (Дойче Банк)
 
Java JVM
Java JVMJava JVM
Java JVM
 
java-monitoring-troubleshooting
java-monitoring-troubleshootingjava-monitoring-troubleshooting
java-monitoring-troubleshooting
 
Diving into Java Class Loader
Diving into Java Class LoaderDiving into Java Class Loader
Diving into Java Class Loader
 
Eureka moment
Eureka momentEureka moment
Eureka moment
 
Don't dump thread dumps
Don't dump thread dumpsDon't dump thread dumps
Don't dump thread dumps
 
Java on Linux for devs and ops
Java on Linux for devs and opsJava on Linux for devs and ops
Java on Linux for devs and ops
 
Eureka moment
Eureka momentEureka moment
Eureka moment
 
White and Black Magic on the JVM
White and Black Magic on the JVMWhite and Black Magic on the JVM
White and Black Magic on the JVM
 
Leak, lock and a long pause
Leak, lock and a long pauseLeak, lock and a long pause
Leak, lock and a long pause
 
JDK not so hidden treasures
JDK not so hidden treasuresJDK not so hidden treasures
JDK not so hidden treasures
 
Extending Spark With Java Agent (handout)
Extending Spark With Java Agent (handout)Extending Spark With Java Agent (handout)
Extending Spark With Java Agent (handout)
 
Spark Summit EU talk by Jaroslav Bachorik and Adrian Popescu
Spark Summit EU talk by Jaroslav Bachorik and Adrian PopescuSpark Summit EU talk by Jaroslav Bachorik and Adrian Popescu
Spark Summit EU talk by Jaroslav Bachorik and Adrian Popescu
 
Object Oriented Programming-JAVA
Object Oriented Programming-JAVAObject Oriented Programming-JAVA
Object Oriented Programming-JAVA
 
Temadag om-java-jamaica vm-2013-09
Temadag om-java-jamaica vm-2013-09Temadag om-java-jamaica vm-2013-09
Temadag om-java-jamaica vm-2013-09
 
Spring data requery
Spring data requerySpring data requery
Spring data requery
 

Dernier

Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
vu2urc
 

Dernier (20)

Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of Brazil
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 

ClassLoader Leaks

  • 1. Mattias Jiderhamn – java.jiderhamn.se Join the war on Mattias Jiderhamn ClassLoader leaks
  • 2. Mattias Jiderhamn – java.jiderhamn.se java.lang.OutOfMemoryError: PermGen space :-( Metaspace
  • 3. Mattias Jiderhamn – java.jiderhamn.se Local dev env
  • 4. Mattias Jiderhamn – java.jiderhamn.se Continuous Deploy .war Crashing
  • 5. Mattias Jiderhamn – java.jiderhamn.se Agenda What does it mean? Why does it happen? Where does it leak? How to avoid? OSS examples Training!
  • 6. Mattias Jiderhamn – java.jiderhamn.se What?
  • 7. Mattias Jiderhamn – java.jiderhamn.se JVM memory Stack Heap PermGen / Metaspace
  • 8. Mattias Jiderhamn – java.jiderhamn.se JVM memory Per thread Local variables and method parameters Stack
  • 9. Mattias Jiderhamn – java.jiderhamn.se JVM memory Heap Young generation Old generation / tenured space Eden space Survivor space Object instances
  • 10. Mattias Jiderhamn – java.jiderhamn.se JVM memory Permanent Generation java.lang.Class instances etc Named before JEE and class unloading Renamed Metaspace in Java 8 Aka Method area PermGen / Metaspace
  • 11. Mattias Jiderhamn – java.jiderhamn.se java.lang.OutOfMemoryError: PermGen space / Metaspace = Too many classes are loaded What?
  • 12. Mattias Jiderhamn – java.jiderhamn.se Why?
  • 13. Mattias Jiderhamn – java.jiderhamn.se Reason for OOME 1. Your application is too large -XX:MaxPermSize=256M Java 8: Metaspace auto increase by default 2. java.lang.Class instances could not be garbage collected after redeploy java.lang.OutOfMemoryError: PermGen space / Metaspace
  • 14. Mattias Jiderhamn – java.jiderhamn.se Reference types • Strong (i.e. normal) reference –Never GC:ed if reachable • Soft reference –GC:ed before OutOfMemoryError • Weak reference (WeakHashMap) –GC:ed when no Strong or Soft refs • Phantom reference –… won’t prevent GC
  • 15. Mattias Jiderhamn – java.jiderhamn.se Example Foo WeakHashMap Map m = new WeakHashMap(); Foo myFoo = new Foo(); m.put(myFoo, ”bar”); myFoo = null;
  • 16. Mattias Jiderhamn – java.jiderhamn.se GC reachability GC roots
  • 17. Mattias Jiderhamn – java.jiderhamn.se Redeploy Application Server ClassLoader app.war ClassLoader app.war’ ClassLoader app.war’’
  • 18. Mattias Jiderhamn – java.jiderhamn.se ClassLoader refs ClassLoader Class ClassClass Instance
  • 19. Mattias Jiderhamn – java.jiderhamn.se How leaks happen Application Server ClassLoader Class ClassClass Instance GC root
  • 20. Mattias Jiderhamn – java.jiderhamn.se Where?
  • 21. Mattias Jiderhamn – java.jiderhamn.se Application Server • Application Server bugs • Logging frameworks – Apache Commons Logging Unless LogFactory.release() – Log4j - some configs Unless LogManager.shutdown() – java.util.logging custom Level • Bean Validation API (JSR 303) • Unified Expression Language (javax.el) ?
  • 22. Mattias Jiderhamn – java.jiderhamn.se GC roots • Class loaded by system ClassLoader – static field in JDK classes (java.* etc) • Live thread – Stack – local vars, method params –java.lang.Thread instance • Object held as synchronization monitor • JNI references • JVM specials…
  • 23. Mattias Jiderhamn – java.jiderhamn.se System classes • java.sql.DriverManager • Bean introspection cache, shutdown hooks, custom default Authenticator, custom security Provider, custom MBeans, custom ThreadGroup, custom property editor, … • Reference to contextClassLoader of first caller
  • 24. Mattias Jiderhamn – java.jiderhamn.se DriverManager
  • 25. Mattias Jiderhamn – java.jiderhamn.se DriverManager Application Server app.war mysql-jdbc.jar JRE DriverManager ClassLoader com.mysql.jdbc.Driver 1) … … or 2) DriverManager.deregisterDriver(…)
  • 26. Mattias Jiderhamn – java.jiderhamn.se Context shutdown public class MyCleanupListener implements javax.servlet.ServletContextListener { ... /** Called when application is undeployed */ public void contextDestroyed( ServletContextEvent servletContextEvent) { DriverManager.deregisterDriver(…); } }
  • 27. Mattias Jiderhamn – java.jiderhamn.se Threads • Thread stack – Local variables – Method parameters • MyThread extends Thread MyRunnable implements Runnable • contextClassLoader + AccessControlContext inherited – Example HTTP 1.1 Keep-Alive-Timer
  • 28. Mattias Jiderhamn – java.jiderhamn.se Context shutdown public class MyCleanupListener implements javax.servlet.ServletContextListener { ... /** Called when application is undeployed */ public void contextDestroyed( ServletContextEvent servletContextEvent) { DriverManager.deregisterDriver(…); // Stop threads here! } }
  • 29. Mattias Jiderhamn – java.jiderhamn.se Stopping threads public class MyThread extends Thread { public void run() { while(true) { // Bad idea! // Do something } } }
  • 30. Mattias Jiderhamn – java.jiderhamn.se Stopping threads public class MyThread extends Thread { private boolean running = true; public void run() { while(running) { // Until stopped // Do something } } public void shutdown() { running = false; } } private volatile boolean running = true; Heinz Kabutz / Java Specialists’ - The Law of the Blind Spot
  • 31. Mattias Jiderhamn – java.jiderhamn.se Threads • Thread stack – Local variables – Method parameters • MyThread extends Thread MyRunnable implements Runnable • contextClassLoader + AccessControlContext inherited – Example HTTP 1.1 Keep-Alive-Timer • ThreadLocal
  • 32. Mattias Jiderhamn – java.jiderhamn.se ThreadLocal WeakHashMap<Thread, ?> ThreadLocal Thread Foo
  • 33. Mattias Jiderhamn – java.jiderhamn.se ThreadLocal ThreadLocal JavaDoc: ”Each thread holds an implicit reference to its copy of a thread- local variable as long as the thread is alive and the ThreadLocal instance is accessible; …”
  • 34. Mattias Jiderhamn – java.jiderhamn.se ThreadLocal ThreadLocalMap Entry Thread ThreadLocal Foo put() set()
  • 35. Mattias Jiderhamn – java.jiderhamn.se ThreadLocal Pooled threads: •Threads may outlive ClassLoader •ThreadLocal → ThreadGlobal! (?)
  • 36. Mattias Jiderhamn – java.jiderhamn.se ThreadLocal ThreadLocalMap Entry Thread ThreadLocal Foo ClassClassLoader static Class
  • 37. Mattias Jiderhamn – java.jiderhamn.se ThreadLocal ThreadLocalMap Entry Thread ThreadLocal Foo ClassClassLoader Stale entry
  • 38. Mattias Jiderhamn – java.jiderhamn.se ThreadLocal ThreadLocalMap JavaDoc: ”However, since reference queues are not used, stale entries are guaranteed to be removed only when the table starts running out of space”
  • 39. Mattias Jiderhamn – java.jiderhamn.se ThreadLocal •Custom value (incl references) –static ThreadLocal = leak –otherwise = unpredicted GC •Custom ThreadLocal = no leak
  • 40. Mattias Jiderhamn – java.jiderhamn.se ThreadLocal try { myThreadLocal.set(foo); … } finally { myThreadLocal.remove(); } Always clear your ThreadLocals!
  • 41. Mattias Jiderhamn – java.jiderhamn.se Known offenders Apache ActiveMQ Apache Axis Apache Batik Apache Commons Pool / DBCP Apache CXF AWT Toolkit Bean Validation API / JSR 303 CGLIB (Hibernate / Spring / JBoss / Apache Geronimo) dom4j EclipseLink GeoTools Google Guice Groovy GWT / javax.imageio Hessian iCal4J Infinispan IntrospectionUtils JarURLConnection Java Advanced Imaging (JAI) Javassist Java Cryptography Architecture (JCA) Java Server Faces 2 javax.security.auth.Policy/login.Configuration JGroups Logback JAXB Mozilla Rhino MVEL OpenOffice Java Uno RunTime (JURT) Oracle JDBC RMI Serialization (<= JDK 1.4.2) Spring framework Unified Expression Language / javax.el URLConnection + HTTP 1.1 XML parsing (DocumentBuilderFactory)
  • 42. Mattias Jiderhamn – java.jiderhamn.se How?
  • 43. Mattias Jiderhamn – java.jiderhamn.se Leak Prevention Lib • Application server independent – Version 2 core module is pure Java SE! • Covers a lot more than Tomcat – System class references avoided/cleared – Threads are stopped – ThreadLocals are cleared – Known offenders handled • Logs warnings • Apache 2 licensed – You may modify and redistribute
  • 44. Mattias Jiderhamn – java.jiderhamn.se Leak Prevention Lib Zero runtime dependencies No required config Maven pom.xml (Servlet 3.0+): <dependency> <groupId>se.jiderhamn.classloader-leak-prevention</groupId> <artifactId>classloader-leak-prevention-servlet3</artifactId> <version>2.0.2</version> </dependency>
  • 45. Mattias Jiderhamn – java.jiderhamn.se Tomcat Bugzilla #48895 ThreadLocalMap Thread Cleanup Thread remove() Unsafe! get() set() remove() Removed in 6.0.27 Tomcat 7.0.6+ renews the thread pool whenever an application is redeployed. Disposable threads for lifecycle events. Bugzilla #49159
  • 46. Mattias Jiderhamn – java.jiderhamn.se Leak Prevention Lib set(null) ThreadLocalMap Entry Thread ThreadLocal Foo Stale Cleanup Thread
  • 47. Mattias Jiderhamn – java.jiderhamn.se Open Source examples
  • 48. Mattias Jiderhamn – java.jiderhamn.se Bean Validation API Version 1.0.0.GA javax.validation.Validation Application Server validation-api-1.0.0.GA.jar app.war hibernate-validator.jar
  • 49. Mattias Jiderhamn – java.jiderhamn.se javax.el API javax.el.BeanELResolver
  • 50. Mattias Jiderhamn – java.jiderhamn.se Apache CXF org.apache.cxf.transport.http.CXFAuthenticator CXF-5442
  • 51. Mattias Jiderhamn – java.jiderhamn.se OpenOffice JURT com.sun.star.lib.util.AsynchronousFinalizer
  • 52. Mattias Jiderhamn – java.jiderhamn.se Training! Gear up!
  • 53. Mattias Jiderhamn – java.jiderhamn.se Free tool Eclipse Memory Analyzer aka MAT eclipse.org/mat
  • 54. Mattias Jiderhamn – java.jiderhamn.se Heap dump Run application server with -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/temp
  • 55. Mattias Jiderhamn – java.jiderhamn.se Links Join the fight! java.jiderhamn.se @mjiderhamn github.com/mjiderhamn • ClassLoader Leak Prevention Library • Step by step guide: acquire heap dump and analyze for leaks using Eclipse Memory Analyzer (MAT) • List of known offenders and links to bug reports • Submit reports and pull requests! ???

Notes de l'éditeur

  1. No serious amount of web development Tomcat + luck
  2. Waste of time restarting AS
  3. http://commons.wikimedia.org/wiki/File:JBoss_logo.svg obstacle
  4. https://blogs.oracle.com/jonthecollector/entry/presenting_the_permanent_generation http://docs.oracle.com/javase/6/docs/technotes/guides/management/jconsole.html
  5. https://blogs.oracle.com/jonthecollector/entry/presenting_the_permanent_generation http://docs.oracle.com/javase/6/docs/technotes/guides/management/jconsole.html
  6. https://blogs.oracle.com/jonthecollector/entry/presenting_the_permanent_generation http://docs.oracle.com/javase/6/docs/technotes/guides/management/jconsole.html http://www.slideshare.net/waterfox1/an-introduction-to-jvm-internals-and-garbage-collection-in-java good picuture at slide 12
  7. https://blogs.oracle.com/jonthecollector/entry/presenting_the_permanent_generation http://docs.oracle.com/javase/6/docs/technotes/guides/management/jconsole.html http://www.slideshare.net/waterfox1/an-introduction-to-jvm-internals-and-garbage-collection-in-java
  8. Default 64 MB http://java.dzone.com/articles/java-8-permgen-metaspace http://www.infoq.com/news/2013/03/java-8-permgen-metaspace
  9. ”All soft references to softly-reachable objects are guaranteed to have been cleared before the virtual machine throws an OutOfMemoryError.”
  10. Inspired by http://www.slideshare.net/waterfox1/an-introduction-to-jvm-internals-and-garbage-collection-in-java slide 12
  11. http://www.slideshare.net/waterfox1/an-introduction-to-jvm-internals-and-garbage-collection-in-java slide 12
  12. http://www.slideshare.net/waterfox1/an-introduction-to-jvm-internals-and-garbage-collection-in-java slide 12
  13. Tomcat, Jetty, Resin, possibly GlashFish Bean Validation API
  14. GC roots: http://www.yourkit.com/docs/java/help/gc_roots.jsp http://javabook.compuware.com/content/memory/how-garbage-collection-works.aspx ÄNDRA: THREAD + underrubriker
  15. java.lang.Runtime.getRuntime().addShutdownHook()
  16. Runnable
  17. ”The Java Memory Model allows each thread to keep a local copy of fields.”
  18. Each thread holds an implicit reference to its copy of a thread-local variable as long as the thread is alive and the ThreadLocal instance is accessible; after a thread goes away, all of its copies of thread-local instances are subject to garbage collection (unless other references to these copies exist).
  19. http://wiki.apache.org/tomcat/MemoryLeakProtection#customThreadLocal
  20. http://wiki.apache.org/tomcat/MemoryLeakProtection#customThreadLocal
  21. http://wiki.apache.org/tomcat/MemoryLeakProtection#customThreadLocal
  22. http://wiki.apache.org/tomcat/MemoryLeakProtection#customThreadLocal
  23. ThreadLocalMap JavaDoc
  24. http://wiki.apache.org/tomcat/MemoryLeakProtection#customThreadLocal
  25. http://wiki.apache.org/tomcat/MemoryLeakProtection#customThreadLocal
  26. (except Servlet API…) (to simplify override by inheritance)
  27. Unsafe: get(), set(), remove() leads to inconsistent state https://issues.apache.org/bugzilla/show_bug.cgi?id=48895 https://issues.apache.org/bugzilla/show_bug.cgi?id=49159
  28. Tried filter first Tomcat 7 has ”filter”(?)
  29. Fixed in 1.1
  30. Independent of EL implementation Fixed in SVN, still wrong in 2.2.1-b04
  31. GC roots: http://www.yourkit.com/docs/java/help/gc_roots.jsp http://javabook.compuware.com/content/memory/how-garbage-collection-works.aspx
  32. http://commons.wikimedia.org/wiki/File:Duke_Wave.png