Over a million developers have joined DZone.
{{announcement.body}}
{{announcement.title}}

JVM PermGen – where art thou?

DZone's Guide to

JVM PermGen – where art thou?

· Java Zone
Free Resource

Learn how to troubleshoot and diagnose some of the most common performance issues in Java today. Brought to you in partnership with AppDynamics.

This post covers some basics of  JVM memory structure  and quickly peeks into  PermGen  to find out where it has disappeared since advent of Java SE 8

Bare Basics

The JVM is just another process running on your system and the magic begins with the java command. Like any OS process, it needs memory for its run time operations. Remember – the JVM itself is a software abstraction of a hardware on top of which Java programs run and boast of OS independence and WORA (write once run anywhere)

Quick coverage of the JVM memory structure

As per the spec, JVM is divided into 5 virtual memory segments.

  • Heap
  • Method (non heap)
  • JVM Stack
  • Native Stack
  • PC Registers

jvm-memory-segments

Heap

  • Every object allocated in your Java program requires to be stored in the memory. The heap is the area where all the instantiated objects get stored. Yes – blame the new operator for filling up your Java heap ;-)
  • Shared by all threads
  • The JVM throws java.lang.OutOfMemoryError when it’s exhausted
  • Use the -Xms and -Xmx JVM options to tune the Heap size

out-of-memory-error

Sub-divided into

  • Eden (Young) – New object or the ones with short life expectancy exist in this area and it is regulated using the -XX:NewSize and -XX:MaxNewSize parameters. GC (garbage collector) minor sweeps this space
  • Survivor – The objects which are still being referenced manage to survive garbage collection in the Eden space end up in this area. This is regulated via the -XX:SurvivorRatio JVM option
  • Old (Tenured) – This is for objects which survive long garbage collections in both the Eden and Survivor space (due to lingering references of course). A special garbage collector takes care of this space. Object de-alloaction in the tenured space is taken care of by GC major

Method Area

  • Also called the non heap area (in HotSpot JVM implementation)
  • It is divided into 2 major sub spaces

Permanent Generation – This area stores class related data from class definitions, structures, methods, field, method (data and code) and constants. Can be regulated using -XX:PermSize and -XX:MaxPermSize. IT can cause java.lang.OutOfMemoryError: PermGen space if it runs out if space

Code Cache – The cache area is used to store compiled code. The compiled code is nothing but native code (hardware specific) and is taken care of by the JIT (Just In Time) compiler which is specific to the Oracle HotSpot JVM

JVM Stack

  • Has a lot to do with methods in the Java classes
  • Stores local variables and regulates method invocation, partial result and return values
  • Each thread in Java has its own (private) copy of the stack and is not accessible to other threads.
  • Tuned using -Xss JVM option

Native Stack

  • Used for native methods (non Java code)
  • Per thread allocation

PC Registers

  • Program counter specific to a particular thread
  • Contains addresses for JVM instructions which are being exceuted (undefined in case of native methods)

So, that’s about it for the JVM memory segment basics. Coming to back to the Permanent Generation.

So where is PermGen ???

Essentially, the PermGen has been completely removed and replaced by another memory area known as the Metaspace

Metaspace – quick facts

  • It’s part of the native heap memory
  • Can be tuned using -XX:MetaspaceSize and -XX:MaxMetaspaceSize
  • Clean up initiation driven by XX:MetaspaceSize option i.e. when the MetaspaceSize is reached.
  • java.lang.OutOfMemoryError: Metadata space will be received if the native space is exhausted
  • The PermGen related JVM options i.e. -XX:PermSize and -XX:MaxPermSize will be ignored if present

This was obviously just the tip of the iceberg. For comprehensive coverage of the JVM, there is no reference better than the specification itself :-)

You can also explore

Cheers !!

Understand the needs and benefits around implementing the right monitoring solution for a growing containerized market. Brought to you in partnership with AppDynamics.

Topics:

Published at DZone with permission of Abhishek Gupta, DZone MVB. See the original article here.

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}