6651256: jstack: DeleteGlobalRef method call doesn't lead to descreasing of global refs count shown by jstack

Jni_DeleteGlobalRef does not really release the jni handle, instead, set the handle point to JNIHandles::_deleted_handle which holds an oop instance (java/lang/Object) in Java heap and never be GC'ed. When counting number of global reference, it counts all the handles on the chain list, which includes the already deleted ones.

Reviewed-by: zgu, sla, coleenp
This commit is contained in:
Yumin Qi 2014-01-23 09:40:32 -08:00 committed by Yumin Qi
parent dd35520229
commit 4a3aa3a77a

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -195,8 +195,10 @@ private:
int _count;
public:
CountHandleClosure(): _count(0) {}
virtual void do_oop(oop* unused) {
_count++;
virtual void do_oop(oop* ooph) {
if (*ooph != JNIHandles::deleted_handle()) {
_count++;
}
}
virtual void do_oop(narrowOop* unused) { ShouldNotReachHere(); }
int count() { return _count; }