SlideShare a Scribd company logo
1 of 50
INSIDE THE JAVA VIRTUAL MACHINE

   Memory Management and Troubleshooting



               Jim Jagielski
           Covalent Technologies
              Sept 19, 2007
                                           1
What are we Talking About?



Internals of Java Memory
Spoken from a Java developer’s standpoint
For other Java developers and system
administrators




                                            2
Agenda


Understanding the Java Memory Layout
Out Of Memory Errors
  Causes
  Solution
Garbage Collection Basics
Java Tuning Options – Time Constraint
Questions and Answers
                                        3
Storing Data in Memory

Java runs as a single process
   Does not share memory with other processes
Each process allocates memory
   We call this process heap
Ways to allocate memory in a process
  C (malloc and free)
  C++ (new and delete)
  Java (new and dereference -> Garbage
  Collection)
                                                4
Storing Data in Memory

JVM manages the process heap
  In most cases
  JNI managed memory would be an exception,
  and there are others
No shared memory between processes
   At least not available through the Java API
JVM creates a Java Heap
  Part of the process heap
  Configured through –Xmx and –Xms settings
                                                 5
The JVM Process Heap

       OS Memory (RAM)


    Process Heap (java/java.exe)


Java Object Heap

               Everything else…
                                   6
JVM Process Heap


Maximum size is limited
  32 bit size, roughly 2GB
  64 bit, much much larger 
If 2GB is the max for the process
    -Xmx1800m –Xms1800m – not very
    good
    Leaves no room for anything else

                                       7
Java Object Heap

Also referred to as Java Heap
   Often confused with JVM process heap
Stores Java Objects
   instances of classes
   and the data the objects contain
      Primitives
      References


                                          8
Benefits of the Java Heap

Pre-allocate large blocks of memory
Allocation of small amounts of memory is very fast
No need to fish for a free memory segment in
RAM
No fragmentation
Continuous memory blocks can make a big
difference
NullPointerException vs. General Access Fault
    NPE runtime error
    GAF crash the process
                                                     9
Gotcha #1


-Xmx, -Xms and –Xmn
  Only controls the Java Object Heap
  Often misunderstood to control the
  process heap
Confusion leads to incorrect tuning
  And in some cases, the situation
  worsens


                                       10
Java Object Heap

So how is the Java Heap allocated?
-XX:MinHeapFreeRatio=
     Default is 40 (40%)
     When the JVM allocates memory, it allocates enough to
     get 40% free
     Huge chunks, very large default
     Not important when –Xms == -Xmx
-XX:MaxHeapFreeRatio=
     Default 70%
     To avoid over allocation
     To give back memory not used
As you can see, to provide performance and avoid
fragmentation, excessively large blocks are allocated each
time
                                                             11
Java Object Heap

Object allocation statistics
  80-98% of newly allocated are extremely
  short lived (few million instructions)
  80-98% die before another megabyte
  has been allocated
  Typical programs
Tomcat Core (no webapps)
  Lots of long lived objects
  Still a small memory footprint
                                            12
Java Object Heap

         Java Object Heap (-Xmx/-Xms)


     Young Generation

                          Old Generation

A good size for the YG is 33% of the total heap
                                                  13
Java Object Heap
Young Generation
  All new objects are created here
  Only moved to Old Gen if they survive
  one or more minor GC
  Sized Using
     -Xmn – not preferred (fixed value)
     -XX:NewRatio=<value> - preferred
     (dynamic)
Survivor Spaces
      2, used during the GC algorithm
      (minor collections)                 14
Young Generation
               Young size(-XX:NewRatio )
            Survivor Ratio(-XX:SurvivorRatio )


Eden Space                      Survivor Space



 New Objects
  2Mb default

                         To         From
                         64Kb default

                                                 15
Gotcha #2


Problem
   Multithreaded apps create new objects
   at the same time
   New objects are always created in the
   EDEN space
   During object creation, memory is locked
   On a multi CPU machine (threads run
   concurrently) there can be contention

                                              16
Gotcha #2
Solution
    Allow each thread to have a private piece of the EDEN
    space
Thread Local Allocation Buffer
    -XX:+UseTLAB
    -XX:TLABSize=<size in kb>
    -XX:+ResizeTLAB
    (On by default on multi CPU machines and newer JDK)
Analyse TLAB usage
    -XX:+PrintTLAB
JDK 1.5 and higher (GC ergonomics)
   Dynamic sizing algorithm, tuned to each thread

                                                            17
Old Generation



            Tenured Space
         5Mb min 44Mb max (default)


Garbage collection presentation will
explain in detail how these spaces
are used during the GC process.

                                       18
JVM Process Heap

Java Object Heap
   A handful, but a small part of the story
       OS Memory (RAM)

    Process Heap (java/java.exe)

Java Object Heap

               Everything else…
                                              19
JVM Process Heap
Everything else…

     Permanent Space
     Code Generation
     Socket Buffers
     Thread Stacks
     Direct Memory Space
     JNI Code
     Garbage Collection
     JNI Allocated Memory
                            20
Permanent Space
Permanent Generation
  Permanent Space (name for it)
  4Mb initial, 64Mb max
  Stores classes, methods and other meta
  data
  -XX:PermSize=<value> (initial)
  -XX:MaxPermSize=<value> (max)
Common OOM for webapp reloads
Separate space for pre-historic reasons
  Early days of Java, class GC was not
  common, reduces size of the Java Heap    21
Gotcha #3

Permanent Space Memory Errors
   Too many classes loaded
   Classes are not being GC:ed
   Unaffected by –Xmx flag
Identified by
   java.lang.OutOfMemoryError:
   PermGen space
Many situations, increasing max perm size will
help
   i.e., no leak, but just not enough memory
 – Others will require to fix the leak
                                                 22
JVM Process Heap
Everything else…

     Permanent Space
     Code Generation
     Socket Buffers
     Thread Stacks
     Direct Memory Space
     JNI Code
     Garbage Collection
     JNI Allocated Memory
                            23
Code Generation


Converting byte code into native code
Very rare to cause memory problems
JVM will most likely crash if it doesn’t have
enough mem for this operation
 – Never seen it though




                                                24
JVM Process Heap
Everything else…

     Permanent Space
     Code Generation
     Socket Buffers
     Thread Stacks
     Direct Memory Space
     JNI Code
     Garbage Collection
     JNI Allocated Memory
                            25
TCP connections

Each connection contains two buffers
 – Receive buffer ~37k
 – Send buffer ~25k

Configured in Java code
 – So might not be exposed through applications
   configuration
Usually hit other limits than memory before an
error happen
 – IOException: Too many open files (for
    example)
                                                  26
JVM Process Heap
Everything else…

     Permanent Space
     Code Generation
     Socket Buffers
     Thread Stacks
     Direct Memory Space
     JNI Code
     Garbage Collection
     JNI Allocated Memory
                            27
Thread Stacks


Each thread has a separate memory space
called “thread stack”
Configured by –Xss
Default value depends on OS/JVM
As number of threads increase, memory
usage increases


                                          28
Gotcha #4

java.lang.OutOfMemoryError:
unable to create new native thread
Solution
 – Decrease –Xmx and/or
 – Decrease –Xss
 – Or, you have a thread leak, fix the program

Gotcha
 – Increasing –Xmx (32bit systems) will leave less room for
    threads if it is being used, hence the opposite of the
    solution

 –   Too low –Xss value can cause
     java.lang.StackOverflowError
                                                              29
JVM Process Heap
Everything else…

     Permanent Space
     Code Generation
     Socket Buffers
     Thread stacks
     Direct Memory Space
     JNI Code
     Garbage Collection
     JNI Allocated Memory
                            30
Direct Memory Space


Ability to let Java developers map memory
outside the Java Object Heap
java.nio.ByteBuffer.allocateDirect
java.lang.OutOfMemoryError:
Direct buffer memory
Adjusted by
 – -XX:MaxDirectMemorySize=<value>

                                            31
JVM Process Heap
Everything else…

     Permanent Space
     Code Generation
     Socket Buffers
     Thread stacks
     Direct Memory Space
     JNI Code
     Garbage Collection
     JNI Allocated Memory
                            32
JNI

Code needs memory
 – Usually very little

JNI programs also allocate memory
 – Error allocating memory.
   [NativeMemory.c] (my code)
 – JVM goes berserk or crashes or if the
   JNI code can handle it gracefully, you’re
   lucky
Linux way of dealing with mem leak
 – Kill the process!
                                               33
JVM Process Heap
Everything else…

     Permanent Space
     Code Generation
     Socket Buffers
     Thread stacks
     Direct Memory Space
     JNI Code
     Garbage Collection
     JNI allocated memory
                            34
Garbage Collection


Also uses memory
 – Threads
 – Memory to store GC info

If there isn’t enough memory for GC, then
the system will not be functioning at all



                                            35
GC History

First time around 1959 – LISP language
The idea
 – automatic memory cleanup
 – Easier to write code
 – Easier to debug

What it does
– Maps memory in memory
– The Java Object Heap is such a map

                                         36
Phases of GC
Lock it down
 – All objects that are to take part in the GC
   must be locked, so that they don’t
   mutate
Mark
 – Iterate through all objects
 – Mark the “unreachable” as garbage

Sweep
 – Remove all previously marked objects
 – Reclaim memory
                                                 37
Early Version of Java
Garbage Collector wasn’t very well tuned
Only one algorithm was available
Mark and Sweep entire heap
 – Takes a very long time
 – Time spent is dependent on the size of the
   heap
 – That is why the “Permanent Space” was
   invented
    • And cause un/reloading of classes wasn’t
      very common either
Also known as “stop-the-world” gc
 – The entire JVM is locked down                 38
Strategies
Stop The World
Incremental
 – Time GC with new object creation
 – If GC runs, suspend new allocation
Concurrent/Parallel
 – Allocation happens at the same time as GC
 – Very complex locking regimes
 – Generations/Spaces make it easier
CMS stands for
 – Concurrent
 – Mark
 – Sweep
                                               39
How It Works

                    Eden Space                                 Survivor Space



1. New object is created
2. When EDEN is full – minor collection
                                                           From                 To
3. Copy surviving objects into 1st
survivor space

                                     Tenured Space
  4. Next time Eden is full
  Copy from Eden to 2nd                    5. If 2nd fills and objects remain in Eden or 1st
  Copy from 1st to 2nd                     These get copied to the tenured


                                                                                               40
How it Works

One survivor space is always empty
 – Serves as destination for minor
   collections
Objects get copied to the tenured space
when the 2nd survivor space fills up
Major collections occur when the tenured
space fills up
 – Major collections free up Eden and both
   survivor spaces
                                             41
New and Fancy

Concurrent/Parallel Garbage Collection
-XX:+UseParNewGC
 – Parallel GC in the New(Young)
   Generation
-XX:+UseConcMarkSweepGC
 – Concurrent in the Old generation

Use these two combined
 – Multi CPU box can take advantage of
   this
                                         42
Sun Recommended
GC Settings
 – -XX:+UseConcMarkSweepGC
 – -XX:+CMSIncrementalMode
 – -XX:+CMSIncrementalPacing
 – -XX:CMSIncrementalDutyCycleMin=0
 – -XX:+CMSIncrementalDutyCycle=10
 – -XX:+UseParNewGC
 – -XX:+CMSPermGenSweepingEnabled
To analyze what is going on
 – -XX:+PrintGCDetails
 – -XX:+PrintGCTimeStamps
 – -XX:-TraceClassUnloading
                                      43
Minor Notes

-XX:+UseParallelGC <> -XX:+UseParNewGC
-XX:ParallelGCThreads=<nr of cpu>
 –   Use with ParallelGC setting
If you have 4 cpus and 1 JVM
 –   Set value to 4
If you have 4 cpus and 2 JVM
 –   Set value to 2
If you have 4 cpus and 6 JVM
 –   Set value to 2
                                         44
GC Ergonomics

Started with JDK 1.5
JVM is self trained and GC strategy adapts
Rules/Guidelines can be set using command line
options
 – Max pause time goal
    • The longest pause time to suspend
      application
 – Throughput goal
    • Time spent GC vs. time spent outside GC

Not guaranteed
                                                 45
Out Of Memory Errors

There is a seamless way to get info
 – -XX:+HeapDumpOnOutOfMemoryError

No performance impact during runtime
Dumping a –Xmx512m heap
 – Create a 512MB .hprof file
 – JVM is “dead” during dumping
 – Restarting JVM during this dump will
   cause unusable .hprof file
                                          46
Gotcha’s

Major collections don’t run until tenured is
full
What does that mean?
– -Xmx1024m
– Current heap could be 750MB
– 500MB of “dead” objects
– If VM is idle, could stay like that for a
  very long time
– Wasting 500MB of RAM for an idle JVM
                                               47
Monitoring Agents

Monitor memory usage
If system is idle, force a GC
Can be done automatically and with remote
agents
Example would be:
www.yourkit.com
And script the client to take telemetry
readings from an embedded agent
                                            48
Thank You


jimj@covalent.net
For support information contact Covalent
 – support@covalent.com,
   sales@covalent.com
 – www.covalent.com
 – 800/444-1935 or 925/974-8800

Question and Answer time!!

                                           49
The Enterprise Open Source Support Company




                                             50

More Related Content

What's hot (20)

Architecture diagram of jvm
Architecture diagram of jvmArchitecture diagram of jvm
Architecture diagram of jvm
 
Java Virtual Machine
Java Virtual MachineJava Virtual Machine
Java Virtual Machine
 
3. jvm
3. jvm3. jvm
3. jvm
 
JVM, byte codes & jvm languages
JVM, byte codes & jvm languagesJVM, byte codes & jvm languages
JVM, byte codes & jvm languages
 
Jit complier
Jit complierJit complier
Jit complier
 
Jvm Architecture
Jvm ArchitectureJvm Architecture
Jvm Architecture
 
XRuby_Overview_20070831
XRuby_Overview_20070831XRuby_Overview_20070831
XRuby_Overview_20070831
 
JVM
JVMJVM
JVM
 
Java-java virtual machine
Java-java virtual machineJava-java virtual machine
Java-java virtual machine
 
QSpiders - Memory (JVM architecture)
QSpiders - Memory (JVM architecture)QSpiders - Memory (JVM architecture)
QSpiders - Memory (JVM architecture)
 
Dissecting the Hotspot JVM
Dissecting the Hotspot JVMDissecting the Hotspot JVM
Dissecting the Hotspot JVM
 
Java virtual machine
Java virtual machineJava virtual machine
Java virtual machine
 
Java 2
Java 2Java 2
Java 2
 
Java performance tuning
Java performance tuningJava performance tuning
Java performance tuning
 
Java introduction with JVM architecture
Java introduction with JVM architectureJava introduction with JVM architecture
Java introduction with JVM architecture
 
Java virtual machine
Java virtual machineJava virtual machine
Java virtual machine
 
just in time JIT compiler
just in time JIT compilerjust in time JIT compiler
just in time JIT compiler
 
Java JVM
Java JVMJava JVM
Java JVM
 
Java byte code presentation
Java byte code presentationJava byte code presentation
Java byte code presentation
 
JVM- Java Virtual Machine
JVM- Java Virtual MachineJVM- Java Virtual Machine
JVM- Java Virtual Machine
 

Similar to Inside the JVM

Tomcatx troubleshooting-production
Tomcatx troubleshooting-productionTomcatx troubleshooting-production
Tomcatx troubleshooting-productionVladimir Khokhryakov
 
7 jvm-arguments-Confoo
7 jvm-arguments-Confoo7 jvm-arguments-Confoo
7 jvm-arguments-ConfooTier1 app
 
Effectively Troubleshoot 9 Types of OutOfMemoryError
Effectively Troubleshoot 9 Types of OutOfMemoryErrorEffectively Troubleshoot 9 Types of OutOfMemoryError
Effectively Troubleshoot 9 Types of OutOfMemoryErrorTier1 app
 
7 jvm-arguments-v1
7 jvm-arguments-v17 jvm-arguments-v1
7 jvm-arguments-v1Tier1 app
 
Modern Engineer’s Troubleshooting Tools, Techniques & Tricks at Confoo 2018
Modern Engineer’s Troubleshooting Tools, Techniques & Tricks at Confoo 2018Modern Engineer’s Troubleshooting Tools, Techniques & Tricks at Confoo 2018
Modern Engineer’s Troubleshooting Tools, Techniques & Tricks at Confoo 2018Tier1app
 
Jug Lugano - Scale over the limits
Jug Lugano - Scale over the limitsJug Lugano - Scale over the limits
Jug Lugano - Scale over the limitsDavide Carnevali
 
Troubleshooting XLConnect - OutofMemoryError(java) GC overhead limit exceeded
Troubleshooting XLConnect - OutofMemoryError(java) GC overhead limit exceededTroubleshooting XLConnect - OutofMemoryError(java) GC overhead limit exceeded
Troubleshooting XLConnect - OutofMemoryError(java) GC overhead limit exceededRupak Roy
 
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 opsaragozin
 
Devoxx Fr 2022 - Remèdes aux oomkill, warm-ups, et lenteurs pour des conteneu...
Devoxx Fr 2022 - Remèdes aux oomkill, warm-ups, et lenteurs pour des conteneu...Devoxx Fr 2022 - Remèdes aux oomkill, warm-ups, et lenteurs pour des conteneu...
Devoxx Fr 2022 - Remèdes aux oomkill, warm-ups, et lenteurs pour des conteneu...Jean-Philippe BEMPEL
 
Introduction of Java GC Tuning and Java Java Mission Control
Introduction of Java GC Tuning and Java Java Mission ControlIntroduction of Java GC Tuning and Java Java Mission Control
Introduction of Java GC Tuning and Java Java Mission ControlLeon Chen
 
Quick introduction to Java Garbage Collector (JVM GC)
Quick introduction to Java Garbage Collector (JVM GC)Quick introduction to Java Garbage Collector (JVM GC)
Quick introduction to Java Garbage Collector (JVM GC)Marcos García
 
OOPs, OOMs, oh my! Containerizing JVM apps
OOPs, OOMs, oh my! Containerizing JVM appsOOPs, OOMs, oh my! Containerizing JVM apps
OOPs, OOMs, oh my! Containerizing JVM appsSematext Group, Inc.
 
Java and cgroups eng
Java and cgroups engJava and cgroups eng
Java and cgroups engRalf Ernst
 
A quick view about Java Virtual Machine
A quick view about Java Virtual MachineA quick view about Java Virtual Machine
A quick view about Java Virtual MachineJoão Santana
 
Mastering java in containers - MadridJUG
Mastering java in containers - MadridJUGMastering java in containers - MadridJUG
Mastering java in containers - MadridJUGJorge Morales
 
Java и Linux — особенности эксплуатации / Алексей Рагозин (Дойче Банк)
Java и Linux — особенности эксплуатации / Алексей Рагозин (Дойче Банк)Java и Linux — особенности эксплуатации / Алексей Рагозин (Дойче Банк)
Java и Linux — особенности эксплуатации / Алексей Рагозин (Дойче Банк)Ontico
 
The JVM is your friend
The JVM is your friendThe JVM is your friend
The JVM is your friendKai Koenig
 

Similar to Inside the JVM (20)

Tomcatx troubleshooting-production
Tomcatx troubleshooting-productionTomcatx troubleshooting-production
Tomcatx troubleshooting-production
 
7 jvm-arguments-Confoo
7 jvm-arguments-Confoo7 jvm-arguments-Confoo
7 jvm-arguments-Confoo
 
Effectively Troubleshoot 9 Types of OutOfMemoryError
Effectively Troubleshoot 9 Types of OutOfMemoryErrorEffectively Troubleshoot 9 Types of OutOfMemoryError
Effectively Troubleshoot 9 Types of OutOfMemoryError
 
7 jvm-arguments-v1
7 jvm-arguments-v17 jvm-arguments-v1
7 jvm-arguments-v1
 
Modern Engineer’s Troubleshooting Tools, Techniques & Tricks at Confoo 2018
Modern Engineer’s Troubleshooting Tools, Techniques & Tricks at Confoo 2018Modern Engineer’s Troubleshooting Tools, Techniques & Tricks at Confoo 2018
Modern Engineer’s Troubleshooting Tools, Techniques & Tricks at Confoo 2018
 
Jug Lugano - Scale over the limits
Jug Lugano - Scale over the limitsJug Lugano - Scale over the limits
Jug Lugano - Scale over the limits
 
Javasession10
Javasession10Javasession10
Javasession10
 
Troubleshooting XLConnect - OutofMemoryError(java) GC overhead limit exceeded
Troubleshooting XLConnect - OutofMemoryError(java) GC overhead limit exceededTroubleshooting XLConnect - OutofMemoryError(java) GC overhead limit exceeded
Troubleshooting XLConnect - OutofMemoryError(java) GC overhead limit exceeded
 
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
 
Devoxx Fr 2022 - Remèdes aux oomkill, warm-ups, et lenteurs pour des conteneu...
Devoxx Fr 2022 - Remèdes aux oomkill, warm-ups, et lenteurs pour des conteneu...Devoxx Fr 2022 - Remèdes aux oomkill, warm-ups, et lenteurs pour des conteneu...
Devoxx Fr 2022 - Remèdes aux oomkill, warm-ups, et lenteurs pour des conteneu...
 
Introduction of Java GC Tuning and Java Java Mission Control
Introduction of Java GC Tuning and Java Java Mission ControlIntroduction of Java GC Tuning and Java Java Mission Control
Introduction of Java GC Tuning and Java Java Mission Control
 
Quick introduction to Java Garbage Collector (JVM GC)
Quick introduction to Java Garbage Collector (JVM GC)Quick introduction to Java Garbage Collector (JVM GC)
Quick introduction to Java Garbage Collector (JVM GC)
 
OOPs, OOMs, oh my! Containerizing JVM apps
OOPs, OOMs, oh my! Containerizing JVM appsOOPs, OOMs, oh my! Containerizing JVM apps
OOPs, OOMs, oh my! Containerizing JVM apps
 
Java and cgroups eng
Java and cgroups engJava and cgroups eng
Java and cgroups eng
 
A quick view about Java Virtual Machine
A quick view about Java Virtual MachineA quick view about Java Virtual Machine
A quick view about Java Virtual Machine
 
Mastering java in containers - MadridJUG
Mastering java in containers - MadridJUGMastering java in containers - MadridJUG
Mastering java in containers - MadridJUG
 
Java и Linux — особенности эксплуатации / Алексей Рагозин (Дойче Банк)
Java и Linux — особенности эксплуатации / Алексей Рагозин (Дойче Банк)Java и Linux — особенности эксплуатации / Алексей Рагозин (Дойче Банк)
Java и Linux — особенности эксплуатации / Алексей Рагозин (Дойче Банк)
 
Jvm is-your-friend
Jvm is-your-friendJvm is-your-friend
Jvm is-your-friend
 
The JVM is your friend
The JVM is your friendThe JVM is your friend
The JVM is your friend
 
Taming The JVM
Taming The JVMTaming The JVM
Taming The JVM
 

More from Jim Jagielski

OSPOS: AllThingsOpen 2023
OSPOS: AllThingsOpen 2023OSPOS: AllThingsOpen 2023
OSPOS: AllThingsOpen 2023Jim Jagielski
 
Open Source Licenses and IP Overview
Open Source Licenses and IP OverviewOpen Source Licenses and IP Overview
Open Source Licenses and IP OverviewJim Jagielski
 
The History of The Apache Software Foundation
The History of The Apache Software FoundationThe History of The Apache Software Foundation
The History of The Apache Software FoundationJim Jagielski
 
Apache httpd 2.4 overview
Apache httpd 2.4 overviewApache httpd 2.4 overview
Apache httpd 2.4 overviewJim Jagielski
 
Not your daddy's web server
Not your daddy's web serverNot your daddy's web server
Not your daddy's web serverJim Jagielski
 
Apache httpd Reverse Proxy and Tomcat
Apache httpd Reverse Proxy and TomcatApache httpd Reverse Proxy and Tomcat
Apache httpd Reverse Proxy and TomcatJim Jagielski
 
Starting an Open Source Program Office
Starting an Open Source Program OfficeStarting an Open Source Program Office
Starting an Open Source Program OfficeJim Jagielski
 
InnerSource 101 for FinTech and FinServ
InnerSource 101 for FinTech and FinServInnerSource 101 for FinTech and FinServ
InnerSource 101 for FinTech and FinServJim Jagielski
 
All Things Open 2017: Open Source Licensing
All Things Open 2017: Open Source LicensingAll Things Open 2017: Open Source Licensing
All Things Open 2017: Open Source LicensingJim Jagielski
 
All Things Open 2017: The Apache Software Foundation 101
All Things Open 2017: The Apache Software Foundation 101All Things Open 2017: The Apache Software Foundation 101
All Things Open 2017: The Apache Software Foundation 101Jim Jagielski
 
All Things Open 2017: Foundations of Inner Source
All Things Open 2017: Foundations of Inner SourceAll Things Open 2017: Foundations of Inner Source
All Things Open 2017: Foundations of Inner SourceJim Jagielski
 
ApacheCon 2017: What's new in httpd 2.4
ApacheCon 2017: What's new in httpd 2.4ApacheCon 2017: What's new in httpd 2.4
ApacheCon 2017: What's new in httpd 2.4Jim Jagielski
 
ApacheCon 2017: InnerSource and The Apache Way
ApacheCon 2017: InnerSource and The Apache WayApacheCon 2017: InnerSource and The Apache Way
ApacheCon 2017: InnerSource and The Apache WayJim Jagielski
 
Open Source Licensing 101
Open Source Licensing 101Open Source Licensing 101
Open Source Licensing 101Jim Jagielski
 
InnerSource 101 and The Apache Way
InnerSource 101 and The Apache WayInnerSource 101 and The Apache Way
InnerSource 101 and The Apache WayJim Jagielski
 
Open source101 licenses
Open source101 licensesOpen source101 licenses
Open source101 licensesJim Jagielski
 
Keynote from the Open Source 101 Conference
Keynote from the Open Source 101 ConferenceKeynote from the Open Source 101 Conference
Keynote from the Open Source 101 ConferenceJim Jagielski
 
InnerSource: Enterprise Lessons from Open Source
InnerSource: Enterprise Lessons from Open SourceInnerSource: Enterprise Lessons from Open Source
InnerSource: Enterprise Lessons from Open SourceJim Jagielski
 

More from Jim Jagielski (20)

OSPOS: AllThingsOpen 2023
OSPOS: AllThingsOpen 2023OSPOS: AllThingsOpen 2023
OSPOS: AllThingsOpen 2023
 
Open Source Licenses and IP Overview
Open Source Licenses and IP OverviewOpen Source Licenses and IP Overview
Open Source Licenses and IP Overview
 
The History of The Apache Software Foundation
The History of The Apache Software FoundationThe History of The Apache Software Foundation
The History of The Apache Software Foundation
 
Reverse proxy magic
Reverse proxy magicReverse proxy magic
Reverse proxy magic
 
Apache httpd 2.4 overview
Apache httpd 2.4 overviewApache httpd 2.4 overview
Apache httpd 2.4 overview
 
The Apache Way
The Apache WayThe Apache Way
The Apache Way
 
Not your daddy's web server
Not your daddy's web serverNot your daddy's web server
Not your daddy's web server
 
Apache httpd Reverse Proxy and Tomcat
Apache httpd Reverse Proxy and TomcatApache httpd Reverse Proxy and Tomcat
Apache httpd Reverse Proxy and Tomcat
 
Starting an Open Source Program Office
Starting an Open Source Program OfficeStarting an Open Source Program Office
Starting an Open Source Program Office
 
InnerSource 101 for FinTech and FinServ
InnerSource 101 for FinTech and FinServInnerSource 101 for FinTech and FinServ
InnerSource 101 for FinTech and FinServ
 
All Things Open 2017: Open Source Licensing
All Things Open 2017: Open Source LicensingAll Things Open 2017: Open Source Licensing
All Things Open 2017: Open Source Licensing
 
All Things Open 2017: The Apache Software Foundation 101
All Things Open 2017: The Apache Software Foundation 101All Things Open 2017: The Apache Software Foundation 101
All Things Open 2017: The Apache Software Foundation 101
 
All Things Open 2017: Foundations of Inner Source
All Things Open 2017: Foundations of Inner SourceAll Things Open 2017: Foundations of Inner Source
All Things Open 2017: Foundations of Inner Source
 
ApacheCon 2017: What's new in httpd 2.4
ApacheCon 2017: What's new in httpd 2.4ApacheCon 2017: What's new in httpd 2.4
ApacheCon 2017: What's new in httpd 2.4
 
ApacheCon 2017: InnerSource and The Apache Way
ApacheCon 2017: InnerSource and The Apache WayApacheCon 2017: InnerSource and The Apache Way
ApacheCon 2017: InnerSource and The Apache Way
 
Open Source Licensing 101
Open Source Licensing 101Open Source Licensing 101
Open Source Licensing 101
 
InnerSource 101 and The Apache Way
InnerSource 101 and The Apache WayInnerSource 101 and The Apache Way
InnerSource 101 and The Apache Way
 
Open source101 licenses
Open source101 licensesOpen source101 licenses
Open source101 licenses
 
Keynote from the Open Source 101 Conference
Keynote from the Open Source 101 ConferenceKeynote from the Open Source 101 Conference
Keynote from the Open Source 101 Conference
 
InnerSource: Enterprise Lessons from Open Source
InnerSource: Enterprise Lessons from Open SourceInnerSource: Enterprise Lessons from Open Source
InnerSource: Enterprise Lessons from Open Source
 

Inside the JVM

  • 1. INSIDE THE JAVA VIRTUAL MACHINE Memory Management and Troubleshooting Jim Jagielski Covalent Technologies Sept 19, 2007 1
  • 2. What are we Talking About? Internals of Java Memory Spoken from a Java developer’s standpoint For other Java developers and system administrators 2
  • 3. Agenda Understanding the Java Memory Layout Out Of Memory Errors Causes Solution Garbage Collection Basics Java Tuning Options – Time Constraint Questions and Answers 3
  • 4. Storing Data in Memory Java runs as a single process Does not share memory with other processes Each process allocates memory We call this process heap Ways to allocate memory in a process C (malloc and free) C++ (new and delete) Java (new and dereference -> Garbage Collection) 4
  • 5. Storing Data in Memory JVM manages the process heap In most cases JNI managed memory would be an exception, and there are others No shared memory between processes At least not available through the Java API JVM creates a Java Heap Part of the process heap Configured through –Xmx and –Xms settings 5
  • 6. The JVM Process Heap OS Memory (RAM) Process Heap (java/java.exe) Java Object Heap Everything else… 6
  • 7. JVM Process Heap Maximum size is limited 32 bit size, roughly 2GB 64 bit, much much larger  If 2GB is the max for the process -Xmx1800m –Xms1800m – not very good Leaves no room for anything else 7
  • 8. Java Object Heap Also referred to as Java Heap Often confused with JVM process heap Stores Java Objects instances of classes and the data the objects contain Primitives References 8
  • 9. Benefits of the Java Heap Pre-allocate large blocks of memory Allocation of small amounts of memory is very fast No need to fish for a free memory segment in RAM No fragmentation Continuous memory blocks can make a big difference NullPointerException vs. General Access Fault NPE runtime error GAF crash the process 9
  • 10. Gotcha #1 -Xmx, -Xms and –Xmn Only controls the Java Object Heap Often misunderstood to control the process heap Confusion leads to incorrect tuning And in some cases, the situation worsens 10
  • 11. Java Object Heap So how is the Java Heap allocated? -XX:MinHeapFreeRatio= Default is 40 (40%) When the JVM allocates memory, it allocates enough to get 40% free Huge chunks, very large default Not important when –Xms == -Xmx -XX:MaxHeapFreeRatio= Default 70% To avoid over allocation To give back memory not used As you can see, to provide performance and avoid fragmentation, excessively large blocks are allocated each time 11
  • 12. Java Object Heap Object allocation statistics 80-98% of newly allocated are extremely short lived (few million instructions) 80-98% die before another megabyte has been allocated Typical programs Tomcat Core (no webapps) Lots of long lived objects Still a small memory footprint 12
  • 13. Java Object Heap Java Object Heap (-Xmx/-Xms) Young Generation Old Generation A good size for the YG is 33% of the total heap 13
  • 14. Java Object Heap Young Generation All new objects are created here Only moved to Old Gen if they survive one or more minor GC Sized Using -Xmn – not preferred (fixed value) -XX:NewRatio=<value> - preferred (dynamic) Survivor Spaces 2, used during the GC algorithm (minor collections) 14
  • 15. Young Generation Young size(-XX:NewRatio ) Survivor Ratio(-XX:SurvivorRatio ) Eden Space Survivor Space New Objects 2Mb default To From 64Kb default 15
  • 16. Gotcha #2 Problem Multithreaded apps create new objects at the same time New objects are always created in the EDEN space During object creation, memory is locked On a multi CPU machine (threads run concurrently) there can be contention 16
  • 17. Gotcha #2 Solution Allow each thread to have a private piece of the EDEN space Thread Local Allocation Buffer -XX:+UseTLAB -XX:TLABSize=<size in kb> -XX:+ResizeTLAB (On by default on multi CPU machines and newer JDK) Analyse TLAB usage -XX:+PrintTLAB JDK 1.5 and higher (GC ergonomics) Dynamic sizing algorithm, tuned to each thread 17
  • 18. Old Generation Tenured Space 5Mb min 44Mb max (default) Garbage collection presentation will explain in detail how these spaces are used during the GC process. 18
  • 19. JVM Process Heap Java Object Heap A handful, but a small part of the story OS Memory (RAM) Process Heap (java/java.exe) Java Object Heap Everything else… 19
  • 20. JVM Process Heap Everything else… Permanent Space Code Generation Socket Buffers Thread Stacks Direct Memory Space JNI Code Garbage Collection JNI Allocated Memory 20
  • 21. Permanent Space Permanent Generation Permanent Space (name for it) 4Mb initial, 64Mb max Stores classes, methods and other meta data -XX:PermSize=<value> (initial) -XX:MaxPermSize=<value> (max) Common OOM for webapp reloads Separate space for pre-historic reasons Early days of Java, class GC was not common, reduces size of the Java Heap 21
  • 22. Gotcha #3 Permanent Space Memory Errors Too many classes loaded Classes are not being GC:ed Unaffected by –Xmx flag Identified by java.lang.OutOfMemoryError: PermGen space Many situations, increasing max perm size will help i.e., no leak, but just not enough memory – Others will require to fix the leak 22
  • 23. JVM Process Heap Everything else… Permanent Space Code Generation Socket Buffers Thread Stacks Direct Memory Space JNI Code Garbage Collection JNI Allocated Memory 23
  • 24. Code Generation Converting byte code into native code Very rare to cause memory problems JVM will most likely crash if it doesn’t have enough mem for this operation – Never seen it though 24
  • 25. JVM Process Heap Everything else… Permanent Space Code Generation Socket Buffers Thread Stacks Direct Memory Space JNI Code Garbage Collection JNI Allocated Memory 25
  • 26. TCP connections Each connection contains two buffers – Receive buffer ~37k – Send buffer ~25k Configured in Java code – So might not be exposed through applications configuration Usually hit other limits than memory before an error happen – IOException: Too many open files (for example) 26
  • 27. JVM Process Heap Everything else… Permanent Space Code Generation Socket Buffers Thread Stacks Direct Memory Space JNI Code Garbage Collection JNI Allocated Memory 27
  • 28. Thread Stacks Each thread has a separate memory space called “thread stack” Configured by –Xss Default value depends on OS/JVM As number of threads increase, memory usage increases 28
  • 29. Gotcha #4 java.lang.OutOfMemoryError: unable to create new native thread Solution – Decrease –Xmx and/or – Decrease –Xss – Or, you have a thread leak, fix the program Gotcha – Increasing –Xmx (32bit systems) will leave less room for threads if it is being used, hence the opposite of the solution – Too low –Xss value can cause java.lang.StackOverflowError 29
  • 30. JVM Process Heap Everything else… Permanent Space Code Generation Socket Buffers Thread stacks Direct Memory Space JNI Code Garbage Collection JNI Allocated Memory 30
  • 31. Direct Memory Space Ability to let Java developers map memory outside the Java Object Heap java.nio.ByteBuffer.allocateDirect java.lang.OutOfMemoryError: Direct buffer memory Adjusted by – -XX:MaxDirectMemorySize=<value> 31
  • 32. JVM Process Heap Everything else… Permanent Space Code Generation Socket Buffers Thread stacks Direct Memory Space JNI Code Garbage Collection JNI Allocated Memory 32
  • 33. JNI Code needs memory – Usually very little JNI programs also allocate memory – Error allocating memory. [NativeMemory.c] (my code) – JVM goes berserk or crashes or if the JNI code can handle it gracefully, you’re lucky Linux way of dealing with mem leak – Kill the process! 33
  • 34. JVM Process Heap Everything else… Permanent Space Code Generation Socket Buffers Thread stacks Direct Memory Space JNI Code Garbage Collection JNI allocated memory 34
  • 35. Garbage Collection Also uses memory – Threads – Memory to store GC info If there isn’t enough memory for GC, then the system will not be functioning at all 35
  • 36. GC History First time around 1959 – LISP language The idea – automatic memory cleanup – Easier to write code – Easier to debug What it does – Maps memory in memory – The Java Object Heap is such a map 36
  • 37. Phases of GC Lock it down – All objects that are to take part in the GC must be locked, so that they don’t mutate Mark – Iterate through all objects – Mark the “unreachable” as garbage Sweep – Remove all previously marked objects – Reclaim memory 37
  • 38. Early Version of Java Garbage Collector wasn’t very well tuned Only one algorithm was available Mark and Sweep entire heap – Takes a very long time – Time spent is dependent on the size of the heap – That is why the “Permanent Space” was invented • And cause un/reloading of classes wasn’t very common either Also known as “stop-the-world” gc – The entire JVM is locked down 38
  • 39. Strategies Stop The World Incremental – Time GC with new object creation – If GC runs, suspend new allocation Concurrent/Parallel – Allocation happens at the same time as GC – Very complex locking regimes – Generations/Spaces make it easier CMS stands for – Concurrent – Mark – Sweep 39
  • 40. How It Works Eden Space Survivor Space 1. New object is created 2. When EDEN is full – minor collection From To 3. Copy surviving objects into 1st survivor space Tenured Space 4. Next time Eden is full Copy from Eden to 2nd 5. If 2nd fills and objects remain in Eden or 1st Copy from 1st to 2nd These get copied to the tenured 40
  • 41. How it Works One survivor space is always empty – Serves as destination for minor collections Objects get copied to the tenured space when the 2nd survivor space fills up Major collections occur when the tenured space fills up – Major collections free up Eden and both survivor spaces 41
  • 42. New and Fancy Concurrent/Parallel Garbage Collection -XX:+UseParNewGC – Parallel GC in the New(Young) Generation -XX:+UseConcMarkSweepGC – Concurrent in the Old generation Use these two combined – Multi CPU box can take advantage of this 42
  • 43. Sun Recommended GC Settings – -XX:+UseConcMarkSweepGC – -XX:+CMSIncrementalMode – -XX:+CMSIncrementalPacing – -XX:CMSIncrementalDutyCycleMin=0 – -XX:+CMSIncrementalDutyCycle=10 – -XX:+UseParNewGC – -XX:+CMSPermGenSweepingEnabled To analyze what is going on – -XX:+PrintGCDetails – -XX:+PrintGCTimeStamps – -XX:-TraceClassUnloading 43
  • 44. Minor Notes -XX:+UseParallelGC <> -XX:+UseParNewGC -XX:ParallelGCThreads=<nr of cpu> – Use with ParallelGC setting If you have 4 cpus and 1 JVM – Set value to 4 If you have 4 cpus and 2 JVM – Set value to 2 If you have 4 cpus and 6 JVM – Set value to 2 44
  • 45. GC Ergonomics Started with JDK 1.5 JVM is self trained and GC strategy adapts Rules/Guidelines can be set using command line options – Max pause time goal • The longest pause time to suspend application – Throughput goal • Time spent GC vs. time spent outside GC Not guaranteed 45
  • 46. Out Of Memory Errors There is a seamless way to get info – -XX:+HeapDumpOnOutOfMemoryError No performance impact during runtime Dumping a –Xmx512m heap – Create a 512MB .hprof file – JVM is “dead” during dumping – Restarting JVM during this dump will cause unusable .hprof file 46
  • 47. Gotcha’s Major collections don’t run until tenured is full What does that mean? – -Xmx1024m – Current heap could be 750MB – 500MB of “dead” objects – If VM is idle, could stay like that for a very long time – Wasting 500MB of RAM for an idle JVM 47
  • 48. Monitoring Agents Monitor memory usage If system is idle, force a GC Can be done automatically and with remote agents Example would be: www.yourkit.com And script the client to take telemetry readings from an embedded agent 48
  • 49. Thank You jimj@covalent.net For support information contact Covalent – support@covalent.com, sales@covalent.com – www.covalent.com – 800/444-1935 or 925/974-8800 Question and Answer time!! 49
  • 50. The Enterprise Open Source Support Company 50

Editor's Notes

  1. Welcome.