Volker Seibt
Volker Seibt

Reputation: 1536

JVM leaking memory outside heap and buffer pools

We have a java application as a long running service (actual up-time for this JVM 31 days 3 hrs 35 min)

Due to Windows taskmanager the process uses 1,075,384,320 B - nearly one GB.

Heap size of the JVM is restricted to 256 MB (-Xmx256m)

Memory-Data

Memory:
Size: 268,435,456 B
Max: 268,435,456 B
Used: 100,000,000 up to 200,000,000 B

- no leak here

Buffer Pools

Direct:
Count: 137
Memory Used and Total Capacity: 1,348,354 B

Mapped:
Count: 0
Memory Used and Total Capacity: 0 B

- no leak here

my question: where does the JVM uses the additional memory?

Additional informations:

Java: version 1.8.0_74 32 bit (Oracle)

Classes:
Total loaded: 17,248
Total unloaded: 35,761

Threads:
Live: 273
Live peak: 285
Daemon: 79
Total started: 486,282

After a restart it takes some days for the process size to grow, so of course regular restart would help, and maybe using a newer java version also may solve the problem, but I would like to have an explanation for this behaviour, e. g. known bug in 1.8.0 before 111, fixed in ... - I did not find anything, yet.

We use about 350 of such installations in different places so changing is not so easy.

Upvotes: 1

Views: 2497

Answers (2)

Volker Seibt
Volker Seibt

Reputation: 1536

Don't forget to run your JVM in server mode on long running tasks!

The reason for this kind of memory leak was the JVM running in client mode. Our solutions runs in a couple of chain stores on old windows xp 32-bit PCs. Default for JVMs on this platform is client mode.

In most cases we run JRE 1.8.0_74-32bit. With our application this JVM leaks memory in "Thread Arena Space" - seems to be nothing returned ever.

After switching to server mode by setting the parameter -server on JVM start the problems disappeared.

Upvotes: 1

uraimo
uraimo

Reputation: 19831

There are two common reasons for off-heap memory consumption:

  • Your application or one of the libraries you are using (e.g. JDBC driver) perform something natively (a module invoked via JNI)
  • Your application or one of the libraries are using off-heap memory in other ways, i.e. with direct buffers or with some "clever" use of sun.misc.Unsafe.

You can verify this tracking the native memory usage with jcmd as explained here (you'll need to restart the application).

Upvotes: 0

Related Questions