In the last few days I've suddenly had a bunch of OOM exceptions. I'm using Derby 10.9.1.0, Oracle Java 1.8.0 on Ubuntu 64-bit, and haven't upgraded for a while (probably years, looking at those numbers).

The place where they happen is in a call to executeQuery() in a method which displays a view as a table. Analysing the heap dump for the latest one with the Eclipse memory analyser shows this:

One instance of "org.apache.derby.impl.store.access.sort.MergeInserter" loaded by "org.eclipse.jetty.webapp.WebAppClassLoader @ 0xf04231b0" occupies 134,841,800 (64.65%) bytes. The memory is accumulated in one instance of "org.apache.derby.impl.store.access.sort.SortBuffer", loaded by "org.eclipse.jetty.webapp.WebAppClassLoader @ 0xf04231b0", which occupies 134,841,496 (64.65%) bytes.

One instance of "org.apache.derby.impl.services.cache.ConcurrentCache" loaded by "org.eclipse.jetty.webapp.WebAppClassLoader @ 0xf04231b0" occupies 43,766,832 (20.98%) bytes. The memory is accumulated in one instance of "org.apache.derby.impl.services.cache.ConcurrentCache", loaded by "org.eclipse.jetty.webapp.WebAppClassLoader @ 0xf04231b0", which occupies 43,766,832 (20.98%) bytes.

The query itself was:

  SELECT DateTimeFormat(t_time,null) AS t_time,
     facility,event,details,name,username,sector,item
  FROM system_log_view
  ORDER BY time DESC
  NULLS LAST
  FETCH NEXT 20 ROWS ONLY

The view is nothing special except that t_time is a duplicate of the time column (the timestamp of the log entry) used to create a separate formatted copy for display purposes:

  CREATE VIEW system_log_view AS
    SELECT  time AS t_time,
            facility,
            event,
            details,
            name,
            username,
            sector,
            item,
            time
    FROM    system_log;

The stack trace shows the error is occurring inside the call to DateTimeFormat, which is again nothing special:

public static final String formatDateTime (Timestamp date, String locale) {
    if (date == null) {
      return null;
    }
    else {
      String fmt = translate("d-MMM-yyyy 'at' HH:mm",locale);
      return translatePhrases(fmt.format(date),locale);
    }
  }

Here's the start of the stack trace:

java.sql.SQLException: The exception 'java.lang.OutOfMemoryError: GC overhead limit exceeded' was thrown while evaluating an expression.
  at java.text.DigitList.clone()Ljava/lang/Object; (DigitList.java:736)
at java.text.DecimalFormat.clone()Ljava/lang/Object; (DecimalFormat.java:2711) at java.text.SimpleDateFormat.initialize(Ljava/util/Locale;)V (SimpleDateFormat.java:645) at java.text.SimpleDateFormat.<init>(Ljava/lang/String;Ljava/util/Locale;)V (SimpleDateFormat.java:605) at java.text.SimpleDateFormat.<init>(Ljava/lang/String;)V (SimpleDateFormat.java:580) at database.Functions.formatDateTime(Ljava/sql/Timestamp;Ljava/lang/String;)Ljava/lang/String; (Functions.java:51)

Does anyone have any idea what might be happening, or what I can do to find out more?

TIA,
--
John English

Reply via email to