comparison src/share/vm/services/management.cpp @ 4844:bf864f701a4a

7066129: GarbageCollectorMXBean#getLastGcInfo leaks native memory Summary: Make GCStatInfo a resource object Reviewed-by: phh, coleenp
author dsamersoff
date Wed, 25 Jan 2012 02:29:05 +0400
parents 4f25538b54c9
children a42c07c38c47
comparison
equal deleted inserted replaced
4842:583b428aa858 4844:bf864f701a4a
2045 GCMemoryManager* mgr = get_gc_memory_manager_from_jobject(obj, CHECK); 2045 GCMemoryManager* mgr = get_gc_memory_manager_from_jobject(obj, CHECK);
2046 2046
2047 // Make a copy of the last GC statistics 2047 // Make a copy of the last GC statistics
2048 // GC may occur while constructing the last GC information 2048 // GC may occur while constructing the last GC information
2049 int num_pools = MemoryService::num_memory_pools(); 2049 int num_pools = MemoryService::num_memory_pools();
2050 GCStatInfo* stat = new GCStatInfo(num_pools); 2050 GCStatInfo stat(num_pools);
2051 if (mgr->get_last_gc_stat(stat) == 0) { 2051 if (mgr->get_last_gc_stat(&stat) == 0) {
2052 gc_stat->gc_index = 0; 2052 gc_stat->gc_index = 0;
2053 return; 2053 return;
2054 } 2054 }
2055 2055
2056 gc_stat->gc_index = stat->gc_index(); 2056 gc_stat->gc_index = stat.gc_index();
2057 gc_stat->start_time = Management::ticks_to_ms(stat->start_time()); 2057 gc_stat->start_time = Management::ticks_to_ms(stat.start_time());
2058 gc_stat->end_time = Management::ticks_to_ms(stat->end_time()); 2058 gc_stat->end_time = Management::ticks_to_ms(stat.end_time());
2059 2059
2060 // Current implementation does not have GC extension attributes 2060 // Current implementation does not have GC extension attributes
2061 gc_stat->num_gc_ext_attributes = 0; 2061 gc_stat->num_gc_ext_attributes = 0;
2062 2062
2063 // Fill the arrays of MemoryUsage objects with before and after GC 2063 // Fill the arrays of MemoryUsage objects with before and after GC
2071 num_pools, 2071 num_pools,
2072 CHECK); 2072 CHECK);
2073 objArrayHandle usage_after_gc_ah(THREAD, au); 2073 objArrayHandle usage_after_gc_ah(THREAD, au);
2074 2074
2075 for (int i = 0; i < num_pools; i++) { 2075 for (int i = 0; i < num_pools; i++) {
2076 Handle before_usage = MemoryService::create_MemoryUsage_obj(stat->before_gc_usage_for_pool(i), CHECK); 2076 Handle before_usage = MemoryService::create_MemoryUsage_obj(stat.before_gc_usage_for_pool(i), CHECK);
2077 Handle after_usage; 2077 Handle after_usage;
2078 2078
2079 MemoryUsage u = stat->after_gc_usage_for_pool(i); 2079 MemoryUsage u = stat.after_gc_usage_for_pool(i);
2080 if (u.max_size() == 0 && u.used() > 0) { 2080 if (u.max_size() == 0 && u.used() > 0) {
2081 // If max size == 0, this pool is a survivor space. 2081 // If max size == 0, this pool is a survivor space.
2082 // Set max size = -1 since the pools will be swapped after GC. 2082 // Set max size = -1 since the pools will be swapped after GC.
2083 MemoryUsage usage(u.init_size(), u.used(), u.committed(), (size_t)-1); 2083 MemoryUsage usage(u.init_size(), u.used(), u.committed(), (size_t)-1);
2084 after_usage = MemoryService::create_MemoryUsage_obj(usage, CHECK); 2084 after_usage = MemoryService::create_MemoryUsage_obj(usage, CHECK);
2085 } else { 2085 } else {
2086 after_usage = MemoryService::create_MemoryUsage_obj(stat->after_gc_usage_for_pool(i), CHECK); 2086 after_usage = MemoryService::create_MemoryUsage_obj(stat.after_gc_usage_for_pool(i), CHECK);
2087 } 2087 }
2088 usage_before_gc_ah->obj_at_put(i, before_usage()); 2088 usage_before_gc_ah->obj_at_put(i, before_usage());
2089 usage_after_gc_ah->obj_at_put(i, after_usage()); 2089 usage_after_gc_ah->obj_at_put(i, after_usage());
2090 } 2090 }
2091 2091