240 // Phantom references
241 {
242 GCTraceTime(Debug, gc, ref) tt("PhantomReference", gc_timer);
243 process_discovered_reflist(_discoveredPhantomRefs, NULL, true,
244 is_alive, keep_alive, complete_gc, task_executor);
245 }
246
247 // Weak global JNI references. It would make more sense (semantically) to
248 // traverse these simultaneously with the regular weak references above, but
249 // that is not how the JDK1.2 specification is. See #4126360. Native code can
250 // thus use JNI weak references to circumvent the phantom references and
251 // resurrect a "post-mortem" object.
252 {
253 GCTraceTime(Debug, gc, ref) tt("JNI Weak Reference", gc_timer);
254 if (task_executor != NULL) {
255 task_executor->set_single_threaded_mode();
256 }
257 process_phaseJNI(is_alive, keep_alive, complete_gc);
258 }
259
260 log_debug(gc, ref)("Ref Counts: Soft: " SIZE_FORMAT " Weak: " SIZE_FORMAT " Final: " SIZE_FORMAT " Phantom: " SIZE_FORMAT,
261 stats.soft_count(), stats.weak_count(), stats.final_count(), stats.phantom_count());
262 log_develop_trace(gc, ref)("JNI Weak Reference count: " SIZE_FORMAT, count_jni_refs());
263
264 return stats;
265 }
266
267 #ifndef PRODUCT
268 // Calculate the number of jni handles.
269 size_t ReferenceProcessor::count_jni_refs() {
270 class CountHandleClosure: public OopClosure {
271 private:
272 size_t _count;
273 public:
274 CountHandleClosure(): _count(0) {}
275 void do_oop(oop* unused) { _count++; }
276 void do_oop(narrowOop* unused) { ShouldNotReachHere(); }
277 size_t count() { return _count; }
278 };
279 CountHandleClosure global_handle_count;
|
240 // Phantom references
241 {
242 GCTraceTime(Debug, gc, ref) tt("PhantomReference", gc_timer);
243 process_discovered_reflist(_discoveredPhantomRefs, NULL, true,
244 is_alive, keep_alive, complete_gc, task_executor);
245 }
246
247 // Weak global JNI references. It would make more sense (semantically) to
248 // traverse these simultaneously with the regular weak references above, but
249 // that is not how the JDK1.2 specification is. See #4126360. Native code can
250 // thus use JNI weak references to circumvent the phantom references and
251 // resurrect a "post-mortem" object.
252 {
253 GCTraceTime(Debug, gc, ref) tt("JNI Weak Reference", gc_timer);
254 if (task_executor != NULL) {
255 task_executor->set_single_threaded_mode();
256 }
257 process_phaseJNI(is_alive, keep_alive, complete_gc);
258 }
259
260 HeapMonitoring::do_weak_oops(task_executor, is_alive, keep_alive, complete_gc);
261 log_debug(gc, ref)("Ref Counts: Soft: " SIZE_FORMAT " Weak: " SIZE_FORMAT " Final: " SIZE_FORMAT " Phantom: " SIZE_FORMAT,
262 stats.soft_count(), stats.weak_count(), stats.final_count(), stats.phantom_count());
263 log_develop_trace(gc, ref)("JNI Weak Reference count: " SIZE_FORMAT, count_jni_refs());
264
265 return stats;
266 }
267
268 #ifndef PRODUCT
269 // Calculate the number of jni handles.
270 size_t ReferenceProcessor::count_jni_refs() {
271 class CountHandleClosure: public OopClosure {
272 private:
273 size_t _count;
274 public:
275 CountHandleClosure(): _count(0) {}
276 void do_oop(oop* unused) { _count++; }
277 void do_oop(narrowOop* unused) { ShouldNotReachHere(); }
278 size_t count() { return _count; }
279 };
280 CountHandleClosure global_handle_count;
|