OOM counters

Baesken, Matthias matthias.baesken at sap.com
Wed Sep 19 16:01:03 UTC 2018

Hi JC, yes it is good to have for monitoring.

However  another application we have  is  that  people wanted to trigger actions on an OOM occurrence , like doing some restarts etc .

For these kind of actions  they had in  our proprietary JVM   some kind  of queue  containing  the latest “prominent”  errors (OOMs  , but also some others).
So they  periodically checked the queue  and  in case an OOM is found , they started  the desired action .

There is (to some extend)  a replacement for this in the VM,  the XX flags  ExitOnOutOfMemoryError  and   OnOutOfMemoryError=<command>   .
However,  these flags are not very flexible  (always exiting is not what all people want),   and  executing a command  forks and execs  a shell (see vmError)  which is quite some overhead
and  also a bit problematic in some cases.

Best regards, Matthias

From: JC Beyler <jcbeyler at google.com>
Sent: Mittwoch, 19. September 2018 16:49
To: Baesken, Matthias <matthias.baesken at sap.com>
Cc: hotspot-dev Source Developers <hotspot-dev at openjdk.java.net>; serviceability-dev at openjdk.java.net
Subject: Re: OOM counters

Hi Matthias,

In the case of an OOM, what's the use-case here? Are there cases where you are recuperating often from OOMs that the counters have different values and it's interesting to monitor? Or is it to determine which of the three got incremented by the OOM that was thrown?

Finally, when would you call the MemoryMXBean new call: if you are recuperating from OOMs, I could imagine that you might be able to get the counters periodically and monitor this; if you're not, you'd be doing this call during an OOM?


On Wed, Sep 19, 2018 at 2:13 AM Baesken, Matthias <matthias.baesken at sap.com<mailto:matthias.baesken at sap.com>> wrote:
Hello,  Currently we have already counters in the Hotspot codebase counting Java heap,
Metaspace and class metaspace related OOMs.

See declarations:


107  // Count out of memory errors that are interesting in error diagnosis
108  static volatile int _out_of_memory_error_java_heap_errors;
109  static volatile int _out_of_memory_error_metaspace_errors;
110  static volatile int _out_of_memory_error_class_metaspace_errors;

output :


460void Exceptions::print_exception_counts_on_error(outputStream* st) {
461  print_oom_count(st, "java_heap_errors", _out_of_memory_error_java_heap_errors);
462  print_oom_count(st, "metaspace_errors", _out_of_memory_error_metaspace_errors);
463  print_oom_count(st, "class_metaspace_errors", _out_of_memory_error_class_metaspace_errors);
464  if (_stack_overflow_errors > 0) {
465    st->print_cr("StackOverflowErrors=%d", _stack_overflow_errors);
466  }
467  if (_linkage_errors > 0) {
468    st->print_cr("LinkageErrors=%d", _linkage_errors);
469  }

But currently  the output is  only done from vmError.cpp , in case of
a)  error reporting
b)  jcmd  vm.info<http://vm.info>  (in case exceptions happened, otherwise the section is not printed)

(see void VMError::print_vm_info(outputStream* st) { ... } )

It would be interesting for us to get the values of the existing counters via JDK coding.
In our proprietary JVM we had a similar mechanism.

Is there anything planned for this (or even already something present) ?

There exists already a class java/lang/management/MemoryMXBean.java  with a  management interface for the memory system of
the Java virtual machine.  It contains some "getter" - methods like

    public int getObjectPendingFinalizationCount();
    public MemoryUsage getHeapMemoryUsage();

Do you think we could add a method (or methods) for accessing the existing OOM counters
( for example,  public OomCounters getOutOfMemoryCounters();  ) ?

Best regards, Matthias



More information about the hotspot-dev mailing list