Request for Review (XS): 7143760 Memory leak in GarbageCollectionNotifications
David Holmes
david.holmes at oracle.com
Sun Feb 12 22:08:50 PST 2012
On 13/02/2012 3:58 PM, Krystal Mok wrote:
> Tto follow up with what David mentioned:
>
> If sendNotification generates an exception then the serviceThread
> will terminate. Is that the desired behaviour? Other event
> processing can't terminate the service thread.
>
>
> I did a simple test to see what would happen in 7u2 when someone throws
> an uncaught exception on the Service Thread [1]. And in this test it did
> make the service thread terminate, because sendNotification() does:
>
> try {
> li.listener.handleNotification(notification, li.handback);
> } catch (Exception e) {
> e.printStackTrace();
> throw new InternalError("Error in invoking listener");
> }
To clarify what I was saying, the actual service thread logic does:
if (has_jvmti_events) {
jvmti_event.post();
}
if (sensors_changed) {
LowMemoryDetector::process_sensor_changes(jt);
}
if(has_gc_notification_event) {
GCNotifier::sendNotification(CHECK);
}
So only the GC notification events can trigger its termination due to
the exception. If this includes propagating exceptions from listener
code then this behaviour definitely seems incorrect to me.
David
-----
> And that InternalError gets uncaught, which leads to the termination of
> the thread. So regardless of what the VM does, it seems like the current
> behavior of the Service Thread is to terminate whenever a handler throws
> an exception. Don't know if that's the desired behavior, though.
>
> - Kris
>
> [1]: https://gist.github.com/1814004
>
> On Mon, Feb 13, 2012 at 10:56 AM, David Holmes <david.holmes at oracle.com
> <mailto:david.holmes at oracle.com>> wrote:
>
> Hi Fred,
>
> 182 class NotificationMark : public StackObj {
>
> Really we should have a general purpose utility class that can serve
> in this role. This is the second time in a couple of weeks that the
> need to deal with cleanup with CHECK has been uncovered.
>
> Not saying you necessarily need to do it for this CR.
>
> 183 // This class is used in GCNitifer::sendNotification to ensure
>
> Typo: nitifer :)
>
> 203 Handle objGcInfo =
> createGcInfo(request->__gcManager,request->gcStatInfo, CHECK);
>
> 212 instanceOop gc_mbean =
> request->gcManager->get___memory_manager_instance(CHECK)__;
>
> CHECK should only be added to functions that can cause exceptions to
> become pending.
>
> That all said I'm not sure that this fix hasn't gone the wrong way.
> If sendNotification generates an exception then the serviceThread
> will terminate. Is that the desired behaviour? Other event
> processing can't terminate the service thread.
>
> David
> -----
>
>
>
> On 10/02/2012 11:04 PM, Frederic Parain wrote:
>
> Here's a new webrev addressing the following issues:
> - the missing HandleMark
> - the clean up of the GCNotificationRequest instance
> - removal of the pending exception testing, now
> exception will be propagated as soon as a method
> returns with a pending exception
>
> http://cr.openjdk.java.net/~__fparain/7143760/webrev.01/
> <http://cr.openjdk.java.net/~fparain/7143760/webrev.01/>
>
> Thanks,
>
> Fred
>
> On 2/10/12 11:27 AM, David Holmes wrote:
>
> On 10/02/2012 7:59 PM, Dmitry Samersoff wrote:
>
> Frederic,
>
> GCNotificationRequest *request = getRequest();
>
> request variable also leaks memory because it will never
> be deleted on
> CHECK return path. Could you fix it too?
>
>
> Further:
>
> 211 JavaCalls::call_virtual(&__result,
> 212 gc_mbean_klass,
> 213 vmSymbols::__createGCNotification_name(),
> 214 vmSymbols::__createGCNotification___signature(),
> 215 &args,
> 216 CHECK);
> 217 if (HAS_PENDING_EXCEPTION) {
> 218 CLEAR_PENDING_EXCEPTION;
> 219 }
> 220
> 221 delete request;
>
> The CHECK at @216 will cause a return if there is an
> exception pending
> so 217-219 is dead code. This also indicates some confusion
> about what
> exceptions this method can leave pending. Or it may be that
> the CHECK at
> #216 was meant to be just THREAD. ??
>
> (Strange this is the second example I've seen of this today!)
>
> David
>
>
> -Dmitry
>
>
> On 2012-02-10 13:27, Frederic Parain wrote:
>
> Here's a small fix (one line) for CR 7143760 Memory
> leak in
> GarbageCollectionNotifications
>
> There's a missing HandleMark at the beginning of the
> GCNotifier::sendNotificatin() method. Without this
> HandleMark, all
> handles used when creating GC notifications are kept
> alive causing a
> double leak: in the Java heap and in the thread
> local handle area of
> the
> service thread.
>
> Here's the CR:
> http://bugs.sun.com/__bugdatabase/view_bug.do?bug___id=7143760
> <http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7143760>
> (Warning, the changeset referenced in the CR is not the
> one containing the original bug).
>
> Here's the webrev:
> http://cr.openjdk.java.net/~__fparain/7143760/webrev.00/
> <http://cr.openjdk.java.net/~fparain/7143760/webrev.00/>
>
> Thanks,
>
> Fred
>
>
>
>
>
More information about the serviceability-dev
mailing list