SlideShare une entreprise Scribd logo
1  sur  36
A topology of
memory leaks on the JVM
HotSpot JVM process
heap perm gen
native
stack
C
sta.
user
managed
string
pool
method
area
pc
reg.
code
cache
young
gen
ten.
gen
const.
pool
e
d
e
n
s
r
.
1
s
r
.
2
-Xms
-Xmx
-Xss
-Xsx
-XX:PermSize
-XX:MaxPermSize
(operating system)
Java 6 -> 7
Java 7 -> 8
genuine leaks
HotSpot JVM process
heap perm gen
native
stack
C
sta.
user
managed
string
pool
method
area
pc
reg.
code
cache
young
gen
ten.
gen
const.
pool
e
d
e
n
s
r
.
1
s
r
.
2
Field unsafe = Unsafe.class
.getDeclaredField("theUnsafe");
unsafe.setAccessible(true);
Unsafe theUnsafe = (Unsafe) unsafe.get(null);
Allocating native memory with sun.misc.Unsafe
1. Getting hold of “the unsafe“
2. Allocating native memory
final int intSize = 4;
long arraySize = (1L + Integer.MAX_VALUE) * intSize;
long index = unsafe.allocateMemory(arraySize);
Random random = new Random();
for(long l = 0L; l < arraySize; l++)
unsafe.putInt(random.nextInt());
3. (Hopefully) releasing native memory
// Without me, the memory leaks
unsafe.freeMemory(index);
I don‘t do sun.misc.Unsafe
1. But some of your favorite tools do:
1. Kryo (used by e.g. Twitter‘s Storm, Apache Hive)
2. EhCache‘s “big memory“ (used by e.g. Hibernate)
3. JDK (e.g. direct byte buffers)
4. General purpose (e.g. GSON, Snappy)
2. Unsafe to become public API in Java 9 (competition with CLR?)
3. JNI leaks have the same effect
4. Java 8 removes “perm gen“ in favor of native
memory “meta space“
symptoms of a genuine leak
No exception required by JVMS. However, JVM will be untypical slow when:
1. Creating a thread:
Requires allocation of new stacks / pc register.
2. Loading a class / JIT:
Requires native memory.
3. Doing I/O:
Often requires native memory.
4. Calling a native method:
Allocates resources on native stack / user space. Swapping can delay
execution.
5. Garbage collection:
Tenured generation collection needs broad access such that OS
must swap back the heap. Rule of thump: All JVM heaps must be
swapped back into memory. (Leaked memory will stay swapped out.)
Heap leaks
HotSpot JVM process
heap perm gen
native
stack
C
sta.
user
managed
string
pool
method
area
pc
reg.
code
cache
young
gen
ten.
gen
const.
pool
e
d
e
n
s
r
.
1
s
r
.
2
class FixedSizeStack {
private final Object[] objectPool = new Object[10];
private int pointer = -1;
public Object pop() {
if(pointer < 0)
throw new NoSuchElementException();
return objectPool[pointer--];
}
public Object peek() {
if(pointer < 0)
throw new NoSuchElementException();
return objectPool[pointer];
}
public void push(Object object) {
if(pointer > 8)
throw new IllegalStateException("stack overflow");
objectPool[++pointer] = object;
}
}
Element 5
Element 4
Element 3
Element 2
Element 1
Element 0
Stack
All memory leaks in Java are linked to reference life cycles.
Immutable Stack Element 0
Immutable Stack Element 1
Immutable Stack Element 2
public String substring(int beginIndex, int endIndex) {
// omitted argument validation
return ((beginIndex == 0) && (endIndex == count))
? this
: new String(offset + beginIndex,
endIndex - beginIndex,
value);
}
String(int offset, int count, char[] value) {
this.value = value;
this.offset = offset;
this.count = count;
}
JDK 6
XML, anybody?
org.xml.sax.DocumentHandler {
// several callback methods
void characters(char[] ch, int start, int length);
}
Webpage character blob
DocumentHandler few letter word
is defined by
produces
handles
public String substring(int beginIndex, int endIndex) {
// omitted argument validation
int subLen = endIndex - beginIndex;
return ((beginIndex == 0) && (endIndex == value.length))
? this
: new String(value, beginIndex, subLen);
}
public String(char[] value, int offset, int count) {
// omitted argument validation
this.value = Arrays.copyOfRange(value,
offset,
offset + count);
}
JDK 7
interface Message extends Serializable {
String getInfo();
}
class ExampleActivity extends Activity {
@Override public void onCreate(Bundle bundle) {
startService(
new Intent(this, getClass())
.putExtra(
"foo",
new Message() {
@Override public String getInfo() {
return "bar";
}
}));
}
}
A classic Android leak
class ExampleActivity$1 implements Message {
private ExampleActivity this$0;
ExampleActivity$1(ExampleActivity this$0) {
this.this$0 = this$0;
}
@Override public String getInfo() {
return "bar";
}
}
new Message() {
@Override public String getInfo() {
return "bar";
}
}
uncompiled
desugared
Non-static inner classes
class Foo {
void bar() {
List<String> list = Arrays.asList("foo", "bar");
list.forEach(LambdaMetafactory
.INVOKEDYNAMIC(Foo::lambda$1)
.make());
}
private static void lambda$1(String s) {
System.out.println(s);
}
}
class Foo {
void bar() {
List<String> list = Arrays.asList("foo", "bar");
list.forEach(s -> { System.out.println(s); });
}
}
uncompiled
desugared
Java 8 lambda expressions
class Foo {
final String prefix; // constructor omitted
void bar() {
List<String> list = Arrays.asList("foo", "bar");
list.forEach(s -> { System.out.println(
prefix + ":" + s) });
}
}
uncompiled
desugared
Java 8 lambda expressions
class Foo {
final String prefix; // constructor omitted
void bar() {
List<String> list = Arrays.asList("foo", "bar");
list.forEach(LambdaMetaFactory
.INVOKEDYNAMIC(this::lambda$1)
.make());
}
private void lambda$1(String s) {
System.out.println(this.prefix + ":" + s);
}
}
uncompiled
desugared
class Foo {
final String prefix; // constructor omitted
void bar() {
List<String> list = Arrays.asList("foo", "bar");
String prefix = this.prefix;
list.forEach(s -> { System.out.println(
prefix + ":" + s)});
}
}
class Foo {
final String prefix; // constructor omitted
void bar() {
List<String> list = Arrays.asList("foo", "bar");
String prefix = this.prefix;
list.forEach(LambdaMetafactory
.INVOKEDYNAMIC(Foo::lambda$1)
.make(prefix));
}
private static void lambda$1(String prefix, String s) {
System.out.println(prefix + ":" + s);
}
}
Java 8 lambda expressions
Other typical causes of heap leaks
• Functional expressions in e.g. Scala / Groovy
• Serialization leaks (e.g. Apache Wicket)
• Singletons / enums
• Context frameworks (e.g. DI like Spring)
Stack leaks
HotSpot JVM process
heap perm gen
native
stack
C
sta.
user
managed
string
pool
method
area
pc
reg.
code
cache
young
gen
ten.
gen
const.
pool
e
d
e
n
s
r
.
1
s
r
.
2
class StackLeak {
int SIZE = (int) (0.5 * Runtime
.getRuntime()
.maxMemory());
void foo() {
{
byte[] array1 = new byte[SIZE];
}
byte[] array2 = new byte[SIZE];
}
void bar() {
{
byte[] array1 = new byte[SIZE];
}
byte[] array2 = new byte[10];
byte[] array3 = new byte[SIZE];
}
}
this
void foo() {
{
byte[] array1 = new byte[SIZE];
}
byte[] array2 = new byte[SIZE];
}
array1
SIZEarray1SIZEarray2
localvariablearray
operandstack
this
void bar() {
{
byte[] array1 = new byte[SIZE];
}
byte[] array2 = new byte[1];
byte[] array3 = new byte[SIZE];
}
array1array2
SIZEarray11array2SIZEarray3
array3
localvariablearray
operandstack
“Perm gen“ leaks
HotSpot JVM process
heap perm gen
native
stack
C
sta.
user
managed
string
pool
method
area
pc
reg.
code
cache
young
gen
ten.
gen
const.
pool
e
d
e
n
s
r
.
1
s
r
.
2
new
Foo()
Foo.class
getClass()
ClassLoader()
getClassLoader()
Field field = ClassLoader.class.getDeclaredField("classes");
field.setAccessible(true);
Vector<Class<?>> classes = (Vector<Class<?>>)
field.get(ClassLoader.getSystemClassLoader());
classes
Bar.class
Classes and HotSpot
Foo.klass
MA
Bar.klass
ClassLoaders and HotSpot
null
ClassLoader()
ClassLoader()
ClassLoader() ClassLoader()
bootstrap CL
(bootstrap directory)
extension CL
(extension directory)
system CL
(class path)
user CL
(explicit)
parent
parent
parent
parent
Foo.class
loadClass()
ClassLoader() Thread.class
Foo()Foo.class
Thread()
FooHolder.class
threadLocalMap
class loader leak
ClassLoader()
class FooHolder {
static ThreadLocal<Foo> tlFoo = new ThreadLocal<Foo>();
static { tlFoo.set(new Foo()); }
}
Other typical causes of class loader leaks
• Shut down hooks
• Use of thread context class loaders (e.g. OSGi)
• Service provider interfaces (SPIs)
• JDBC drivers (JDK DriverManager)
• Security frameworks (e.g. JDK Policy)
• Class loader magic (e.g. instrumentation)
Why do modern applications require so much perm gen memory?
class Foo {
public Object bar(Object o) { return o; }
}
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(Foo.class);
enhancer.setCallback(new MethodInterceptor() {
@Override public Object intercept(Object obj,
Method method,
Object[] args,
MethodProxy proxy) throws Throwable {
return proxy.invokeSuper(obj, doSomethindWith(args));
}});
Foo enhancedFoo = (Foo) enhancer.create();
Created classes: 2 + #methods * 2
[FastClass, FastMethod, MethodProxy]
Modern JDK‘s inflation works similarly
Method
MethodAccessor
DelegatingMethod-
AccessorImpl
NativeMethod-
AccessorImpl
invoked by
after inflation
(byte code generation)
before inflation
(JNI)
Java 8 meta space
• Permanent generation rebranded (and
probably approximation to JRockit)
• Meta space is allocated in native memory
• No space limit by default (MaxMetaspaceSize)
• Today‘s debugging tools will not be able to
read meta space
Tenuring leaks
HotSpot JVM process
heap perm gen
native
stack
C
sta.
user
managed
string
pool
method
area
pc
reg.
code
cache
young
gen
ten.
gen
const.
pool
e
d
e
n
s
r
.
1
s
r
.
2
public void foo() {
Set<Bar> bars = new HashSet<Bar>();
for(int i = 0; i < 100; i++) {
for(int j = 0; j < 100; j++) {
bars.add(makeBar(i, j));
}
doSomethingWith(bars);
bars.clear();
}
}
public void foo() {
for(int i = 0; i < 100; i++) {
Set<Bar> bars = new HashSet<Bar>();
for(int j = 0; j < 100; j++) {
bars.add(makeBar(i, j));
}
doSomethingWith(bars);
}
}
young generation
Tenured generation
eden survivor 1 survivor 2
bars bars bars bars
collection of survivor 2collection of survivor 1
Implicit memory leaks
• Leaked threads: Require fixed amount of
memory for call stacks / pc register / general
allocation
• Leaked handles (files, sockets, databases):
Usually require JVM memory resources
debugging / profiling
jmap -dump:live,format=b,file=<...> <pid>
java -XX:+HeapDumpOnOutOfMemoryError
-XX:+HeapDumpPath=<...> <...>
jhat <hprof file>
select a from [I a where a.length >= 256
GUI tools: MAT (Eclipse RCP) / JVisualVM / HeapWalker
http://rafael.codes
@rafaelcodes
http://documents4j.com
https://github.com/documents4j/documents4j
http://bytebuddy.net
https://github.com/raphw/byte-buddy

Contenu connexe

Tendances

Drools 6.0 (Red Hat Summit)
Drools 6.0 (Red Hat Summit)Drools 6.0 (Red Hat Summit)
Drools 6.0 (Red Hat Summit)Mark Proctor
 
Working with JSON Data in PostgreSQL vs. MongoDB
Working with JSON Data in PostgreSQL vs. MongoDBWorking with JSON Data in PostgreSQL vs. MongoDB
Working with JSON Data in PostgreSQL vs. MongoDBScaleGrid.io
 
twMVC#44 讓我們用 k6 來進行壓測吧
twMVC#44 讓我們用 k6 來進行壓測吧twMVC#44 讓我們用 k6 來進行壓測吧
twMVC#44 讓我們用 k6 來進行壓測吧twMVC
 
Query and audit logging in cassandra
Query and audit logging in cassandraQuery and audit logging in cassandra
Query and audit logging in cassandraVinay Kumar Chella
 
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 8AppDynamics
 
Kafka replication apachecon_2013
Kafka replication apachecon_2013Kafka replication apachecon_2013
Kafka replication apachecon_2013Jun Rao
 
MySQL partitions tutorial
MySQL partitions tutorialMySQL partitions tutorial
MySQL partitions tutorialGiuseppe Maxia
 
Collectors in the Wild
Collectors in the WildCollectors in the Wild
Collectors in the WildJosé Paumard
 
principles of object oriented class design
principles of object oriented class designprinciples of object oriented class design
principles of object oriented class designNeetu Mishra
 
PGConf.ASIA 2017 Logical Replication Internals (English)
PGConf.ASIA 2017 Logical Replication Internals (English)PGConf.ASIA 2017 Logical Replication Internals (English)
PGConf.ASIA 2017 Logical Replication Internals (English)Noriyoshi Shinoda
 
Write microservice in golang
Write microservice in golangWrite microservice in golang
Write microservice in golangBo-Yi Wu
 
Introduction to Apache Calcite
Introduction to Apache CalciteIntroduction to Apache Calcite
Introduction to Apache CalciteJordan Halterman
 
Making Apache Spark Better with Delta Lake
Making Apache Spark Better with Delta LakeMaking Apache Spark Better with Delta Lake
Making Apache Spark Better with Delta LakeDatabricks
 
Java exception handling ppt
Java exception handling pptJava exception handling ppt
Java exception handling pptJavabynataraJ
 
Java MySQL Connector & Connection Pool Features & Optimization
Java MySQL Connector & Connection Pool Features & OptimizationJava MySQL Connector & Connection Pool Features & Optimization
Java MySQL Connector & Connection Pool Features & OptimizationKenny Gryp
 

Tendances (20)

Drools 6.0 (Red Hat Summit)
Drools 6.0 (Red Hat Summit)Drools 6.0 (Red Hat Summit)
Drools 6.0 (Red Hat Summit)
 
Working with JSON Data in PostgreSQL vs. MongoDB
Working with JSON Data in PostgreSQL vs. MongoDBWorking with JSON Data in PostgreSQL vs. MongoDB
Working with JSON Data in PostgreSQL vs. MongoDB
 
twMVC#44 讓我們用 k6 來進行壓測吧
twMVC#44 讓我們用 k6 來進行壓測吧twMVC#44 讓我們用 k6 來進行壓測吧
twMVC#44 讓我們用 k6 來進行壓測吧
 
JVM++: The Graal VM
JVM++: The Graal VMJVM++: The Graal VM
JVM++: The Graal VM
 
Query and audit logging in cassandra
Query and audit logging in cassandraQuery and audit logging in cassandra
Query and audit logging in cassandra
 
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
 
Kafka replication apachecon_2013
Kafka replication apachecon_2013Kafka replication apachecon_2013
Kafka replication apachecon_2013
 
MySQL partitions tutorial
MySQL partitions tutorialMySQL partitions tutorial
MySQL partitions tutorial
 
Collectors in the Wild
Collectors in the WildCollectors in the Wild
Collectors in the Wild
 
Clean code
Clean codeClean code
Clean code
 
principles of object oriented class design
principles of object oriented class designprinciples of object oriented class design
principles of object oriented class design
 
Golang workshop
Golang workshopGolang workshop
Golang workshop
 
Joy of scala
Joy of scalaJoy of scala
Joy of scala
 
PGConf.ASIA 2017 Logical Replication Internals (English)
PGConf.ASIA 2017 Logical Replication Internals (English)PGConf.ASIA 2017 Logical Replication Internals (English)
PGConf.ASIA 2017 Logical Replication Internals (English)
 
Write microservice in golang
Write microservice in golangWrite microservice in golang
Write microservice in golang
 
Introduction to Apache Calcite
Introduction to Apache CalciteIntroduction to Apache Calcite
Introduction to Apache Calcite
 
Making Apache Spark Better with Delta Lake
Making Apache Spark Better with Delta LakeMaking Apache Spark Better with Delta Lake
Making Apache Spark Better with Delta Lake
 
Java exception handling ppt
Java exception handling pptJava exception handling ppt
Java exception handling ppt
 
Java MySQL Connector & Connection Pool Features & Optimization
Java MySQL Connector & Connection Pool Features & OptimizationJava MySQL Connector & Connection Pool Features & Optimization
Java MySQL Connector & Connection Pool Features & Optimization
 
Spring data jpa
Spring data jpaSpring data jpa
Spring data jpa
 

En vedette

Java 8 Launch - MetaSpaces
Java 8 Launch - MetaSpacesJava 8 Launch - MetaSpaces
Java 8 Launch - MetaSpacesHaim Yadid
 
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 AspectJMattias Jiderhamn
 
mjprof: Monadic approach for JVM profiling
mjprof: Monadic approach for JVM profilingmjprof: Monadic approach for JVM profiling
mjprof: Monadic approach for JVM profilingHaim Yadid
 
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 KotlinKai Koenig
 
Taking Kotlin to production, Seriously
Taking Kotlin to production, SeriouslyTaking Kotlin to production, Seriously
Taking Kotlin to production, SeriouslyHaim Yadid
 
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 CompletableFuturesHaim Yadid
 
Building Scalable Stateless Applications with RxJava
Building Scalable Stateless Applications with RxJavaBuilding Scalable Stateless Applications with RxJava
Building Scalable Stateless Applications with RxJavaRick Warren
 
A look under the hood at Apache Spark's API and engine evolutions
A look under the hood at Apache Spark's API and engine evolutionsA look under the hood at Apache Spark's API and engine evolutions
A look under the hood at Apache Spark's API and engine evolutionsDatabricks
 
第六回渋谷Java Java8のJVM監視を考える
第六回渋谷Java Java8のJVM監視を考える第六回渋谷Java Java8のJVM監視を考える
第六回渋谷Java Java8のJVM監視を考えるchonaso
 

En vedette (15)

Unsafe Java
Unsafe JavaUnsafe Java
Unsafe Java
 
ClassLoader Leaks
ClassLoader LeaksClassLoader Leaks
ClassLoader Leaks
 
Java 8 Launch - MetaSpaces
Java 8 Launch - MetaSpacesJava 8 Launch - MetaSpaces
Java 8 Launch - MetaSpaces
 
The Java Memory Model
The Java Memory ModelThe Java Memory Model
The Java Memory Model
 
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
 
mjprof: Monadic approach for JVM profiling
mjprof: Monadic approach for JVM profilingmjprof: Monadic approach for JVM profiling
mjprof: Monadic approach for JVM profiling
 
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
 
Java GC, Off-heap workshop
Java GC, Off-heap workshopJava GC, Off-heap workshop
Java GC, Off-heap workshop
 
JVM Internals (2015)
JVM Internals (2015)JVM Internals (2015)
JVM Internals (2015)
 
Building Scalable Stateless Applications with RxJava
Building Scalable Stateless Applications with RxJavaBuilding Scalable Stateless Applications with RxJava
Building Scalable Stateless Applications with RxJava
 
Metaspace
MetaspaceMetaspace
Metaspace
 
A look under the hood at Apache Spark's API and engine evolutions
A look under the hood at Apache Spark's API and engine evolutionsA look under the hood at Apache Spark's API and engine evolutions
A look under the hood at Apache Spark's API and engine evolutions
 
第六回渋谷Java Java8のJVM監視を考える
第六回渋谷Java Java8のJVM監視を考える第六回渋谷Java Java8のJVM監視を考える
第六回渋谷Java Java8のJVM監視を考える
 

Similaire à A topology of memory leaks on the JVM

Java 7 Whats New(), Whats Next() from Oredev
Java 7 Whats New(), Whats Next() from OredevJava 7 Whats New(), Whats Next() from Oredev
Java 7 Whats New(), Whats Next() from OredevMattias Karlsson
 
HelsinkiJS meet-up. Dmitry Soshnikov - ECMAScript 6
HelsinkiJS meet-up. Dmitry Soshnikov - ECMAScript 6HelsinkiJS meet-up. Dmitry Soshnikov - ECMAScript 6
HelsinkiJS meet-up. Dmitry Soshnikov - ECMAScript 6Dmitry Soshnikov
 
JJUG CCC 2011 Spring
JJUG CCC 2011 SpringJJUG CCC 2011 Spring
JJUG CCC 2011 SpringKiyotaka Oku
 
Java Programming Must implement a storage manager that main.pdf
Java Programming Must implement a storage manager that main.pdfJava Programming Must implement a storage manager that main.pdf
Java Programming Must implement a storage manager that main.pdfadinathassociates
 
Akka Cluster in Java - JCConf 2015
Akka Cluster in Java - JCConf 2015Akka Cluster in Java - JCConf 2015
Akka Cluster in Java - JCConf 2015Jiayun Zhou
 
5. Ввод-вывод, доступ к файловой системе
5. Ввод-вывод, доступ к файловой системе5. Ввод-вывод, доступ к файловой системе
5. Ввод-вывод, доступ к файловой системеDEVTYPE
 
Java7 New Features and Code Examples
Java7 New Features and Code ExamplesJava7 New Features and Code Examples
Java7 New Features and Code ExamplesNaresh Chintalcheru
 
Java programming lab_manual_by_rohit_jaiswar
Java programming lab_manual_by_rohit_jaiswarJava programming lab_manual_by_rohit_jaiswar
Java programming lab_manual_by_rohit_jaiswarROHIT JAISWAR
 
JNI - Java & C in the same project
JNI - Java & C in the same projectJNI - Java & C in the same project
JNI - Java & C in the same projectKarol Wrótniak
 
Nice to meet Kotlin
Nice to meet KotlinNice to meet Kotlin
Nice to meet KotlinJieyi Wu
 
모던자바의 역습
모던자바의 역습모던자바의 역습
모던자바의 역습DoHyun Jung
 
Androidの本当にあった怖い話
Androidの本当にあった怖い話Androidの本当にあった怖い話
Androidの本当にあった怖い話Yusuke Yamamoto
 

Similaire à A topology of memory leaks on the JVM (20)

Java
JavaJava
Java
 
Java 7 Whats New(), Whats Next() from Oredev
Java 7 Whats New(), Whats Next() from OredevJava 7 Whats New(), Whats Next() from Oredev
Java 7 Whats New(), Whats Next() from Oredev
 
HelsinkiJS meet-up. Dmitry Soshnikov - ECMAScript 6
HelsinkiJS meet-up. Dmitry Soshnikov - ECMAScript 6HelsinkiJS meet-up. Dmitry Soshnikov - ECMAScript 6
HelsinkiJS meet-up. Dmitry Soshnikov - ECMAScript 6
 
Nantes Jug - Java 7
Nantes Jug - Java 7Nantes Jug - Java 7
Nantes Jug - Java 7
 
Inheritance
InheritanceInheritance
Inheritance
 
JJUG CCC 2011 Spring
JJUG CCC 2011 SpringJJUG CCC 2011 Spring
JJUG CCC 2011 Spring
 
Java Programming Must implement a storage manager that main.pdf
Java Programming Must implement a storage manager that main.pdfJava Programming Must implement a storage manager that main.pdf
Java Programming Must implement a storage manager that main.pdf
 
Akka Cluster in Java - JCConf 2015
Akka Cluster in Java - JCConf 2015Akka Cluster in Java - JCConf 2015
Akka Cluster in Java - JCConf 2015
 
Testing with Node.js
Testing with Node.jsTesting with Node.js
Testing with Node.js
 
5. Ввод-вывод, доступ к файловой системе
5. Ввод-вывод, доступ к файловой системе5. Ввод-вывод, доступ к файловой системе
5. Ввод-вывод, доступ к файловой системе
 
What`s new in Java 7
What`s new in Java 7What`s new in Java 7
What`s new in Java 7
 
Java7 New Features and Code Examples
Java7 New Features and Code ExamplesJava7 New Features and Code Examples
Java7 New Features and Code Examples
 
Java programming lab_manual_by_rohit_jaiswar
Java programming lab_manual_by_rohit_jaiswarJava programming lab_manual_by_rohit_jaiswar
Java programming lab_manual_by_rohit_jaiswar
 
JNI - Java & C in the same project
JNI - Java & C in the same projectJNI - Java & C in the same project
JNI - Java & C in the same project
 
Nice to meet Kotlin
Nice to meet KotlinNice to meet Kotlin
Nice to meet Kotlin
 
모던자바의 역습
모던자바의 역습모던자바의 역습
모던자바의 역습
 
Androidの本当にあった怖い話
Androidの本当にあった怖い話Androidの本当にあった怖い話
Androidの本当にあった怖い話
 
wtf is in Java/JDK/wtf7?
wtf is in Java/JDK/wtf7?wtf is in Java/JDK/wtf7?
wtf is in Java/JDK/wtf7?
 
Anti patterns
Anti patternsAnti patterns
Anti patterns
 
Multithreading in Java
Multithreading in JavaMultithreading in Java
Multithreading in Java
 

Plus de Rafael Winterhalter

Java and OpenJDK: disecting the ecosystem
Java and OpenJDK: disecting the ecosystemJava and OpenJDK: disecting the ecosystem
Java and OpenJDK: disecting the ecosystemRafael Winterhalter
 
The definitive guide to java agents
The definitive guide to java agentsThe definitive guide to java agents
The definitive guide to java agentsRafael Winterhalter
 
Event-Sourcing Microservices on the JVM
Event-Sourcing Microservices on the JVMEvent-Sourcing Microservices on the JVM
Event-Sourcing Microservices on the JVMRafael Winterhalter
 
Getting started with Java 9 modules
Getting started with Java 9 modulesGetting started with Java 9 modules
Getting started with Java 9 modulesRafael Winterhalter
 
Code generation for alternative languages
Code generation for alternative languagesCode generation for alternative languages
Code generation for alternative languagesRafael Winterhalter
 
Monitoring distributed (micro-)services
Monitoring distributed (micro-)servicesMonitoring distributed (micro-)services
Monitoring distributed (micro-)servicesRafael Winterhalter
 
An introduction to JVM performance
An introduction to JVM performanceAn introduction to JVM performance
An introduction to JVM performanceRafael Winterhalter
 
Making Java more dynamic: runtime code generation for the JVM
Making Java more dynamic: runtime code generation for the JVMMaking Java more dynamic: runtime code generation for the JVM
Making Java more dynamic: runtime code generation for the JVMRafael Winterhalter
 
Understanding Java byte code and the class file format
Understanding Java byte code and the class file formatUnderstanding Java byte code and the class file format
Understanding Java byte code and the class file formatRafael Winterhalter
 

Plus de Rafael Winterhalter (16)

Java and OpenJDK: disecting the ecosystem
Java and OpenJDK: disecting the ecosystemJava and OpenJDK: disecting the ecosystem
Java and OpenJDK: disecting the ecosystem
 
The definitive guide to java agents
The definitive guide to java agentsThe definitive guide to java agents
The definitive guide to java agents
 
Byte code field report
Byte code field reportByte code field report
Byte code field report
 
Event-Sourcing Microservices on the JVM
Event-Sourcing Microservices on the JVMEvent-Sourcing Microservices on the JVM
Event-Sourcing Microservices on the JVM
 
Java 10, Java 11 and beyond
Java 10, Java 11 and beyondJava 10, Java 11 and beyond
Java 10, Java 11 and beyond
 
Getting started with Java 9 modules
Getting started with Java 9 modulesGetting started with Java 9 modules
Getting started with Java 9 modules
 
Code generation for alternative languages
Code generation for alternative languagesCode generation for alternative languages
Code generation for alternative languages
 
Monitoring distributed (micro-)services
Monitoring distributed (micro-)servicesMonitoring distributed (micro-)services
Monitoring distributed (micro-)services
 
An Overview of Project Jigsaw
An Overview of Project JigsawAn Overview of Project Jigsaw
An Overview of Project Jigsaw
 
Migrating to JUnit 5
Migrating to JUnit 5Migrating to JUnit 5
Migrating to JUnit 5
 
The Java memory model made easy
The Java memory model made easyThe Java memory model made easy
The Java memory model made easy
 
An introduction to JVM performance
An introduction to JVM performanceAn introduction to JVM performance
An introduction to JVM performance
 
Java byte code in practice
Java byte code in practiceJava byte code in practice
Java byte code in practice
 
Making Java more dynamic: runtime code generation for the JVM
Making Java more dynamic: runtime code generation for the JVMMaking Java more dynamic: runtime code generation for the JVM
Making Java more dynamic: runtime code generation for the JVM
 
Unit testing concurrent code
Unit testing concurrent codeUnit testing concurrent code
Unit testing concurrent code
 
Understanding Java byte code and the class file format
Understanding Java byte code and the class file formatUnderstanding Java byte code and the class file format
Understanding Java byte code and the class file format
 

Dernier

"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Mattias Andersson
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationSafe Software
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxhariprasad279825
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piececharlottematthew16
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clashcharlottematthew16
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
The Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfThe Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfSeasiaInfotech2
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfRankYa
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr LapshynFwdays
 

Dernier (20)

"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptx
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piece
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clash
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
The Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfThe Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdf
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdf
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
 

A topology of memory leaks on the JVM

  • 1. A topology of memory leaks on the JVM
  • 2. HotSpot JVM process heap perm gen native stack C sta. user managed string pool method area pc reg. code cache young gen ten. gen const. pool e d e n s r . 1 s r . 2 -Xms -Xmx -Xss -Xsx -XX:PermSize -XX:MaxPermSize (operating system) Java 6 -> 7 Java 7 -> 8
  • 3. genuine leaks HotSpot JVM process heap perm gen native stack C sta. user managed string pool method area pc reg. code cache young gen ten. gen const. pool e d e n s r . 1 s r . 2
  • 4. Field unsafe = Unsafe.class .getDeclaredField("theUnsafe"); unsafe.setAccessible(true); Unsafe theUnsafe = (Unsafe) unsafe.get(null); Allocating native memory with sun.misc.Unsafe 1. Getting hold of “the unsafe“ 2. Allocating native memory final int intSize = 4; long arraySize = (1L + Integer.MAX_VALUE) * intSize; long index = unsafe.allocateMemory(arraySize); Random random = new Random(); for(long l = 0L; l < arraySize; l++) unsafe.putInt(random.nextInt()); 3. (Hopefully) releasing native memory // Without me, the memory leaks unsafe.freeMemory(index);
  • 5. I don‘t do sun.misc.Unsafe 1. But some of your favorite tools do: 1. Kryo (used by e.g. Twitter‘s Storm, Apache Hive) 2. EhCache‘s “big memory“ (used by e.g. Hibernate) 3. JDK (e.g. direct byte buffers) 4. General purpose (e.g. GSON, Snappy) 2. Unsafe to become public API in Java 9 (competition with CLR?) 3. JNI leaks have the same effect 4. Java 8 removes “perm gen“ in favor of native memory “meta space“
  • 6. symptoms of a genuine leak No exception required by JVMS. However, JVM will be untypical slow when: 1. Creating a thread: Requires allocation of new stacks / pc register. 2. Loading a class / JIT: Requires native memory. 3. Doing I/O: Often requires native memory. 4. Calling a native method: Allocates resources on native stack / user space. Swapping can delay execution. 5. Garbage collection: Tenured generation collection needs broad access such that OS must swap back the heap. Rule of thump: All JVM heaps must be swapped back into memory. (Leaked memory will stay swapped out.)
  • 7. Heap leaks HotSpot JVM process heap perm gen native stack C sta. user managed string pool method area pc reg. code cache young gen ten. gen const. pool e d e n s r . 1 s r . 2
  • 8. class FixedSizeStack { private final Object[] objectPool = new Object[10]; private int pointer = -1; public Object pop() { if(pointer < 0) throw new NoSuchElementException(); return objectPool[pointer--]; } public Object peek() { if(pointer < 0) throw new NoSuchElementException(); return objectPool[pointer]; } public void push(Object object) { if(pointer > 8) throw new IllegalStateException("stack overflow"); objectPool[++pointer] = object; } }
  • 9. Element 5 Element 4 Element 3 Element 2 Element 1 Element 0 Stack All memory leaks in Java are linked to reference life cycles.
  • 10. Immutable Stack Element 0 Immutable Stack Element 1 Immutable Stack Element 2
  • 11. public String substring(int beginIndex, int endIndex) { // omitted argument validation return ((beginIndex == 0) && (endIndex == count)) ? this : new String(offset + beginIndex, endIndex - beginIndex, value); } String(int offset, int count, char[] value) { this.value = value; this.offset = offset; this.count = count; } JDK 6
  • 12. XML, anybody? org.xml.sax.DocumentHandler { // several callback methods void characters(char[] ch, int start, int length); } Webpage character blob DocumentHandler few letter word is defined by produces handles
  • 13. public String substring(int beginIndex, int endIndex) { // omitted argument validation int subLen = endIndex - beginIndex; return ((beginIndex == 0) && (endIndex == value.length)) ? this : new String(value, beginIndex, subLen); } public String(char[] value, int offset, int count) { // omitted argument validation this.value = Arrays.copyOfRange(value, offset, offset + count); } JDK 7
  • 14. interface Message extends Serializable { String getInfo(); } class ExampleActivity extends Activity { @Override public void onCreate(Bundle bundle) { startService( new Intent(this, getClass()) .putExtra( "foo", new Message() { @Override public String getInfo() { return "bar"; } })); } } A classic Android leak
  • 15. class ExampleActivity$1 implements Message { private ExampleActivity this$0; ExampleActivity$1(ExampleActivity this$0) { this.this$0 = this$0; } @Override public String getInfo() { return "bar"; } } new Message() { @Override public String getInfo() { return "bar"; } } uncompiled desugared Non-static inner classes
  • 16. class Foo { void bar() { List<String> list = Arrays.asList("foo", "bar"); list.forEach(LambdaMetafactory .INVOKEDYNAMIC(Foo::lambda$1) .make()); } private static void lambda$1(String s) { System.out.println(s); } } class Foo { void bar() { List<String> list = Arrays.asList("foo", "bar"); list.forEach(s -> { System.out.println(s); }); } } uncompiled desugared Java 8 lambda expressions
  • 17. class Foo { final String prefix; // constructor omitted void bar() { List<String> list = Arrays.asList("foo", "bar"); list.forEach(s -> { System.out.println( prefix + ":" + s) }); } } uncompiled desugared Java 8 lambda expressions class Foo { final String prefix; // constructor omitted void bar() { List<String> list = Arrays.asList("foo", "bar"); list.forEach(LambdaMetaFactory .INVOKEDYNAMIC(this::lambda$1) .make()); } private void lambda$1(String s) { System.out.println(this.prefix + ":" + s); } }
  • 18. uncompiled desugared class Foo { final String prefix; // constructor omitted void bar() { List<String> list = Arrays.asList("foo", "bar"); String prefix = this.prefix; list.forEach(s -> { System.out.println( prefix + ":" + s)}); } } class Foo { final String prefix; // constructor omitted void bar() { List<String> list = Arrays.asList("foo", "bar"); String prefix = this.prefix; list.forEach(LambdaMetafactory .INVOKEDYNAMIC(Foo::lambda$1) .make(prefix)); } private static void lambda$1(String prefix, String s) { System.out.println(prefix + ":" + s); } } Java 8 lambda expressions
  • 19. Other typical causes of heap leaks • Functional expressions in e.g. Scala / Groovy • Serialization leaks (e.g. Apache Wicket) • Singletons / enums • Context frameworks (e.g. DI like Spring)
  • 20. Stack leaks HotSpot JVM process heap perm gen native stack C sta. user managed string pool method area pc reg. code cache young gen ten. gen const. pool e d e n s r . 1 s r . 2
  • 21. class StackLeak { int SIZE = (int) (0.5 * Runtime .getRuntime() .maxMemory()); void foo() { { byte[] array1 = new byte[SIZE]; } byte[] array2 = new byte[SIZE]; } void bar() { { byte[] array1 = new byte[SIZE]; } byte[] array2 = new byte[10]; byte[] array3 = new byte[SIZE]; } }
  • 22. this void foo() { { byte[] array1 = new byte[SIZE]; } byte[] array2 = new byte[SIZE]; } array1 SIZEarray1SIZEarray2 localvariablearray operandstack
  • 23. this void bar() { { byte[] array1 = new byte[SIZE]; } byte[] array2 = new byte[1]; byte[] array3 = new byte[SIZE]; } array1array2 SIZEarray11array2SIZEarray3 array3 localvariablearray operandstack
  • 24. “Perm gen“ leaks HotSpot JVM process heap perm gen native stack C sta. user managed string pool method area pc reg. code cache young gen ten. gen const. pool e d e n s r . 1 s r . 2
  • 25. new Foo() Foo.class getClass() ClassLoader() getClassLoader() Field field = ClassLoader.class.getDeclaredField("classes"); field.setAccessible(true); Vector<Class<?>> classes = (Vector<Class<?>>) field.get(ClassLoader.getSystemClassLoader()); classes Bar.class Classes and HotSpot Foo.klass MA Bar.klass
  • 26. ClassLoaders and HotSpot null ClassLoader() ClassLoader() ClassLoader() ClassLoader() bootstrap CL (bootstrap directory) extension CL (extension directory) system CL (class path) user CL (explicit) parent parent parent parent Foo.class loadClass()
  • 27. ClassLoader() Thread.class Foo()Foo.class Thread() FooHolder.class threadLocalMap class loader leak ClassLoader() class FooHolder { static ThreadLocal<Foo> tlFoo = new ThreadLocal<Foo>(); static { tlFoo.set(new Foo()); } }
  • 28. Other typical causes of class loader leaks • Shut down hooks • Use of thread context class loaders (e.g. OSGi) • Service provider interfaces (SPIs) • JDBC drivers (JDK DriverManager) • Security frameworks (e.g. JDK Policy) • Class loader magic (e.g. instrumentation)
  • 29. Why do modern applications require so much perm gen memory? class Foo { public Object bar(Object o) { return o; } } Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(Foo.class); enhancer.setCallback(new MethodInterceptor() { @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { return proxy.invokeSuper(obj, doSomethindWith(args)); }}); Foo enhancedFoo = (Foo) enhancer.create(); Created classes: 2 + #methods * 2 [FastClass, FastMethod, MethodProxy]
  • 30. Modern JDK‘s inflation works similarly Method MethodAccessor DelegatingMethod- AccessorImpl NativeMethod- AccessorImpl invoked by after inflation (byte code generation) before inflation (JNI)
  • 31. Java 8 meta space • Permanent generation rebranded (and probably approximation to JRockit) • Meta space is allocated in native memory • No space limit by default (MaxMetaspaceSize) • Today‘s debugging tools will not be able to read meta space
  • 32. Tenuring leaks HotSpot JVM process heap perm gen native stack C sta. user managed string pool method area pc reg. code cache young gen ten. gen const. pool e d e n s r . 1 s r . 2
  • 33. public void foo() { Set<Bar> bars = new HashSet<Bar>(); for(int i = 0; i < 100; i++) { for(int j = 0; j < 100; j++) { bars.add(makeBar(i, j)); } doSomethingWith(bars); bars.clear(); } } public void foo() { for(int i = 0; i < 100; i++) { Set<Bar> bars = new HashSet<Bar>(); for(int j = 0; j < 100; j++) { bars.add(makeBar(i, j)); } doSomethingWith(bars); } } young generation Tenured generation eden survivor 1 survivor 2 bars bars bars bars collection of survivor 2collection of survivor 1
  • 34. Implicit memory leaks • Leaked threads: Require fixed amount of memory for call stacks / pc register / general allocation • Leaked handles (files, sockets, databases): Usually require JVM memory resources
  • 35. debugging / profiling jmap -dump:live,format=b,file=<...> <pid> java -XX:+HeapDumpOnOutOfMemoryError -XX:+HeapDumpPath=<...> <...> jhat <hprof file> select a from [I a where a.length >= 256 GUI tools: MAT (Eclipse RCP) / JVisualVM / HeapWalker